Question

Je veux utiliser l'effet sur un chapiteau TextView, mais le texte est seulement d'être lorsque le TextView défile obtient le focus. C'est un problème, parce que dans mon cas, il ne peut pas.

J'utilise:

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

Est-il possible d'avoir le TextView défiler toujours son texte? Je l'ai vu ce fait dans l'application Android Market, où le nom de l'application défilera dans la barre de titre, même si elle ne reçoit pas le focus, mais je ne pouvais pas trouver ceci étant mentionné dans l'API docs.

Était-ce utile?

La solution

J'ai dû faire face à ce problème et la plus courte solution que je suis venu avec est de créer une nouvelle classe dérivée de TextView. La classe doit passer outre trois méthodes onFocusChanged , onWindowFocusChanged et isFocused pour rendre le tout TextView concentré.

@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;
}

Autres conseils

Je suis finalement arrivé contre ce problème aujourd'hui et ainsi pète hierarchyviewer sur l'application Android Market.

En regardant le titre sur l'écran de détail d'une application, ils utilisent une ancienne plaine TextView. L'examen de ses propriétés ont montré qu'il ne se concentrait pas, ne pouvait pas être concentré et était généralement très ordinaire -. À l'exception du fait qu'il a été marqué comme sélectionné

Une ligne de code plus tard et je l'avais travail:)

textView.setSelected(true);

Cela est logique, étant donné que Javadoc dit :

  

Une vue peut être sélectionné ou non. Notez que la sélection ne sont pas les mêmes que mise au point. Les vues sont généralement sélectionnés dans le cadre d'un AdapterView comme ListView ou GridView.

i.e.. Lorsque vous faites défiler sur un élément dans une vue de la liste (comme dans l'application de marché), seulement alors le maintenant sélectionné texte commence à défiler. Et puisque ce TextView particulier n'est pas focusable ou cliquable, il ne perdra jamais son état de sélection.

Malheureusement, autant que je sache il n'y a aucun moyen de prérégler l'état sélectionné à partir du XML de mise en page.
Mais celui-liner fonctionne bien pour moi au-dessus.

Il suffit de mettre ces paramètres dans votre TextView. Il fonctionne:)

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

TranslateAnimation fonctionne en « tirant » la vue dans une direction par un certain montant. Vous pouvez définir où commencer cette « tirer » et où à la fin.

TranslateAnimation(fromXDelta, toXDelta, fromYDelta, toYDelta);

fromXDelta régler le décalage de la position de départ du mouvement dans l'axe 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 définit la position de fin de décalage du mouvement dans l'axe 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.

Si la largeur de votre texte est plus que le module de la différence entre fromXDelta et toXDelta, le texte ne sera pas en mesure de se déplacer et TOTALEMENT compeltely au sein de l'écran.


Exemple

Supposons que notre taille de l'écran est 320x240 pxs. Nous avons un TextView avec un texte qui a 700px largeur et que nous voulons créer une animation qui « tire » le texte afin que nous puissions voir la fin de la phrase.

                                       (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... ||
                             ---------------------------+|
                             |                           |
                             |                           |
                             |                           |
                             +---------------------------+

Tout d'abord nous mettre fromXDelta = 0 de telle sorte que le mouvement n'a pas de décalage de départ. Maintenant, nous devons comprendre la valeur toXDelta. Pour obtenir l'effet désiré, nous devons « tirer » le texte même px précise qu'il étend sur l'écran. (Dans le schéma est représenté par <<<< X px >>>>) Étant donné que notre texte a 700 la largeur et la zone visible est 320px (largeur de l'écran), nous fixons:

tXDelta = 700 - 320 = 380

Et comment voulez nous la largeur d'écran et le texte Largeur?


code

Prendre l'extrait Zarah comme point de départ:

    /**
     * @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;
}

Il pourrait y avoir des moyens plus faciles à effectuer, mais cela fonctionne pour chaque point de vue que vous pouvez penser et est réutilisable. Il est particulièrement utile si vous souhaitez animer un TextView dans un ListView sans casser les capacités activées / onFocus du textView. Il fait également défiler en continu, même si la vue ne se concentre pas.

Je ne sais pas si vous avez encore la réponse, mais j'ai trouvé un moyen facile de le faire.

Configurer votre animation comme ceci:

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 et END_POS_Y sont des valeurs float, tandis que TICKER_DURATION est un int je déclarai avec mes autres constantes.

Ensuite, vous pouvez maintenant appliquer cette animation à votre TextView:

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

Et voilà. :)

Mon animation commence sur le côté droit de l'écran (300f) et se termine sur le côté gauche de l'écran (-300f), d'une durée de 15 secondes (15 000).

J'ai écrit le code suivant pour un ListView avec des éléments de texte dans le champ. Il est basé sur la solution setSelected décrite ci-dessus. Au fond, je tends la classe ArrayAdapter et passer outre la méthode getView pour sélectionner le TextView avant de le retourner:

    // 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;

        }
    }

Ceci est la réponse qui apparaît en haut de ma recherche google donc je pensais que je pouvais poster une réponse utile ici depuis que je lutte avec ce souvenir assez souvent. Quoi qu'il en soit, cela fonctionne pour moi et nécessite des attributs XML et 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" />

// Dans Java

        mtvMarque.setEllipsize(TextUtils.TruncateAt.MARQUEE);
        mtvMarque.setSelected(true);
        mtvMarque.setSingleLine(true);
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top