Domanda

Voglio usare l'effetto tendone su un TextView, ma il testo è da scorrere solo quando il TextView ottiene lo stato attivo. Questo è un problema, perché nel mio caso, non è possibile.

sto usando:

  android:ellipsize="marquee"
  android:marqueeRepeatLimit="marquee_forever"

C'è un modo per avere il TextView scorrere sempre il suo testo? Ho visto questo viene fatto nel l'applicazione Android Market, dove il nome dell'app scorrerà nella barra del titolo, anche se non riceve attenzione, ma non ho potuto trovare questo essere menzionato nella documentazione API.

È stato utile?

Soluzione

I hanno dovuto affrontare il problema e la soluzione più breve sono venuto in mente è di creare una nuova classe derivata da TextView. La classe dovrebbe eseguire l'override tre metodi di onFocusChanged , onWindowFocusChanged e IsFocused per rendere il TextView tutti concentrati.

@Override
protected void onFocusChanged(boolean focused, int direction, Rect previouslyFocusedRect) {
    if(focused)
        super.onFocusChanged(focused, direction, previouslyFocusedRect);
}

@Override
public void onWindowFocusChanged(boolean focused) {
    if(focused)
        super.onWindowFocusChanged(focused);
}


@Override
public boolean isFocused() {
    return true;
}

Altri suggerimenti

ho finalmente è venuta contro questo problema oggi e così licenziato hierarchyviewer sull'applicazione Android Market.

Guardando il titolo sullo schermo i dettagli di un'applicazione, usano una pianura vecchio TextView. Esaminando le sue proprietà hanno mostrato che non è stato messo a fuoco, potrebbe non mettere a fuoco ed era generalmente molto ordinario -. Tranne per il fatto che è stato contrassegnato come selezionato

Una linea di codice più tardi e ho avuto funzionare:)

textView.setSelected(true);

Questo ha senso, dato che cosa Javadoc dice :

  

Una vista può essere selezionata o meno. Si noti che la selezione non è lo stesso di messa a fuoco. Vista sono in genere selezionati nel contesto di un AdapterView come ListView o GridView.

vale a dire. Quando si scorre su un elemento in un elenco (come nell'applicazione Market), solo allora il ormai selezionato di testo Inizia lo scorrimento. E poiché questo particolare TextView non è attivabile o cliccabile, non potrà mai perdere il suo stato di selezione.

Purtroppo, per quanto ne so non c'è modo per pre-impostare lo stato selezionato dalla XML layout.
Ma l'one-liner sopra funziona bene per me.

Basta inserire questi parametri nel vostro TextView. Funziona:)

    android:singleLine="true" 
    android:ellipsize="marquee"
    android:marqueeRepeatLimit ="marquee_forever"
    android:scrollHorizontally="true"
    android:focusable="true"
    android:focusableInTouchMode="true" 

TranslateAnimation funziona "tirando" la vista in una direzione per un ammontare prestabilito. È possibile impostare da dove cominciare questo "tirare" e dove alla fine.

TranslateAnimation(fromXDelta, toXDelta, fromYDelta, toYDelta);

fromXDelta impostare l'offset della posizione di partenza del movimento nell'asse X.

fromXDelta = 0 //no offset. 
fromXDelta = 300 //the movement starts at 300px to the right.
fromXDelta = -300 //the movement starts at 300px to the left

toXDelta definisce la posizione finale di offset del movimento nell'asse X.

toXDelta = 0 //no offset. 
toXDelta = 300 //the movement ends at 300px to the right.
toXDelta = -300 //the movement ends at 300px to the left.

Se la larghezza del testo è maggiore che il modulo della differenza tra fromXDelta e toXDelta, il testo non sarà in grado di Totaly e spostare compeltely all'interno dello schermo.


Esempio

Supponiamo nostra dimensione dello schermo è di 320x240 PXS. Abbiamo un TextView con un testo che ha 700px di larghezza e desideriamo creare un'animazione che "tira" il testo in modo da poter vedere la fine della frase.

                                       (screen)
                             +---------------------------+
                             |<----------320px---------->|
                             |                           |
                             |+---------------------------<<<< X px >>>>
               movement<-----|| some TextView with text that goes out...
                             |+---------------------------
                             |  unconstrained size 700px |
                             |                           |
                             |                           |
                             +---------------------------+


                             +---------------------------+
                             |                           |
                             |                           |
               <<<< X px >>>>---------------------------+|
movement<----- some TextView with text that goes out... ||
                             ---------------------------+|
                             |                           |
                             |                           |
                             |                           |
                             +---------------------------+

Per prima cosa impostare fromXDelta = 0 in modo che il movimento non ha un offset iniziale. Ora abbiamo bisogno di capire il valore toXDelta. Per ottenere l'effetto desiderato abbiamo bisogno di "tirare" il testo esattamente lo stesso px che si estende fuori dallo schermo. (Nello schema è rappresentato da <<<< X px >>>>) Dato che il nostro testo ha 700 di larghezza, e l'area visibile è 320px (larghezza dello schermo) abbiamo impostato:

tXDelta = 700 - 320 = 380

E come facciamo a capire lo schermo Larghezza e il testo larghezza?


Codice

Prendendo lo Zarah Snippet come punto di partenza:

    /**
     * @param view The Textview or any other view we wish to apply the movement
     * @param margin A margin to take into the calculation (since the view
     *               might have any siblings in the same "row")
     *
     **/
public static Animation scrollingText(View view, float margin){

    Context context = view.getContext(); //gets the context of the view

            // measures the unconstrained size of the view
            // before it is drawn in the layout
    view.measure(View.MeasureSpec.UNSPECIFIED, 
                         View.MeasureSpec.UNSPECIFIED); 

            // takes the unconstrained wisth of the view
    float width = view.getMeasuredWidth();

            // gets the screen width
    float screenWidth = ((Activity) context).getWindowManager().getDefaultDisplay().getWidth();


            // perfrms the calculation
    float toXDelta = width - (screenWidth - margin);

            // sets toXDelta to 0 if the text width is smaller that the screen size
    if (toXDelta < 0) {toXDelta = 0; } else { toXDelta = 0 - toXDelta;}

            // Animation parameters
    Animation mAnimation = new TranslateAnimation(0, toXDelta, 0, 0);
    mAnimation.setDuration(15000); 
    mAnimation.setRepeatMode(Animation.RESTART);
    mAnimation.setRepeatCount(Animation.INFINITE);

    return mAnimation;
}

Ci possono essere modi più semplici per eseguire questa, ma questo funziona per ogni vista si può pensare ed è riutilizzabile. E 'particolarmente utile se si desidera animare un TextView in una lista senza rompere le abilità / onFocus abilitati del textView. Esso scorre continuamente anche anche se la vista non è a fuoco.

Non so se hai ancora bisogno la risposta, ma ho trovato un modo semplice per farlo.

Imposta l'animazione in questo modo:

Animation mAnimation = new TranslateAnimation(START_POS_X, END_POS_X, 
                START_POS_Y, END_POS_Y);
mAnimation.setDuration(TICKER_DURATION); 
mAnimation.setRepeatMode(Animation.RESTART);
mAnimation.setRepeatCount(Animation.INFINITE);

START_POS_X, END_POS_X, START_POS_Y e END_POS_Y sono valori float, mentre TICKER_DURATION è un int ho dichiarato con le mie altre costanti.

Quindi è ora possibile applicare questa animazione al tuo TextView:

TextView tickerText = (TextView) findViewById(R.id.ticker);
tickerText.setAnimation(mAnimation);

E questo è tutto. :)

Il mio animazione inizia sul lato destro fuori dallo schermo (300F) e termina sul lato sinistro fuori dallo schermo (-300f), con una durata di 15 secondi (15000).

ho scritto il seguente codice per un controllo ListView con elementi di testo tendone. Esso si basa sulla soluzione setSelected sopra descritta. Fondamentalmente, io sto estendendo la classe ArrayAdapter e sovrascrivere il metodo GetView per selezionare il TextView prima di restituirlo:

    // Create an ArrayAdapter which selects its TextViews before returning      
    // them. This would enable marqueeing while still making the list item
    // clickable.
    class SelectingAdapter extends ArrayAdapter<LibraryItem>
    {
        public
        SelectingAdapter(
            Context context, 
            int resource, 
            int textViewResourceId, 
            LibraryItem[] objects
        )
        {
            super(context, resource, textViewResourceId, objects);
        }

        @Override
        public
        View getView(int position, View convertView, ViewGroup parent)
        {
            View view = super.getView(position, convertView, parent);
            TextView textview = (TextView) view.findViewById(
                R.id.textview_playlist_item_title
            );
            textview.setSelected(true);
            textview.setEnabled(true);
            textview.setFocusable(false);
            textview.setTextColor(0xffffffff);
            return view;

        }
    }

Questa è la risposta che si apre nella parte superiore della mia ricerca google così ho pensato che avrei potuto inviare una risposta utile qui da quando ho lotta con ricordando questo abbastanza spesso. In ogni caso, questo funziona per me e richiede attributi XML e A un onFocusChangeListener.

//XML
        <TextView
            android:id="@+id/blank_title"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:padding="5dp"
            android:layout_gravity="center_horizontal|center_vertical"
            android:background="#a4868585"
            android:textColor="#fff"
            android:textSize="15sp"
            android:singleLine="true"
            android:lines="1"
            android:ellipsize="marquee"
            android:marqueeRepeatLimit ="marquee_forever"
            android:scrollHorizontally="true"
            android:focusable="true"
            android:focusableInTouchMode="true"
            tools:ignore="Deprecated" />

//JAVA
    titleText.setOnFocusChangeListener(new View.OnFocusChangeListener() {
        @Override
        public void onFocusChange(View v, boolean hasFocus) {
            if (!hasFocus) {
                titleText.setSelected(true);
            }
        }
    });

// XML

 <TextView
            android:id="@+id/tvMarque"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:ellipsize="marquee"
            android:layout_gravity="center_horizontal"
            android:fadingEdge="horizontal"
            android:marqueeRepeatLimit="marquee_forever"
            android:scrollHorizontally="true"
            android:padding="5dp"
            android:textSize="16sp"
            android:text=""
            android:textColor="@color/colorSyncText"
            android:visibility="visible" />

// In Java

        mtvMarque.setEllipsize(TextUtils.TruncateAt.MARQUEE);
        mtvMarque.setSelected(true);
        mtvMarque.setSingleLine(true);
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top