web-dev-qa-db-fra.com

Défilement horizontal automatique Android TextView

J'essaie d'implémenter une vue texte d'une seule ligne qui défilera automatiquement. Mais malheureusement, je ne peux pas le faire fonctionner. AutoScrollTextView est déclaré dans un LinearLayout (width et height = fill_parent). La classe utilise essentiellement un gestionnaire qui s’appelle lui-même pour faire défiler une quantité donnée. J'ai simplifié le code pour afficher uniquement une vue de texte défilant de 5 pixels par seconde.

La sortie du journal est correcte, la méthode getScrollX () renvoie la position scrollX appropriée. 

Si je n'appelle pas requestLayout(), rien n'est dessiné. invalidate() n'a aucun effet.

Quelqu'un aurait-il un indice?

public class AutoScrollTextView extends TextView {

    public AutoScrollTextView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        setSingleLine();
        setEllipsize(null);
        setText("Single-line text view that scrolls automatically if the text is too long to fit in the widget");
    }

    // begin to scroll the text from the original position
    public void startScrolling() {
        scrollHandler.sendEmptyMessage(0);
    }

    private Handler scrollHandler = new Handler() {
        private static final int REFRESH_INTERVAL = 1000;

        public void handleMessage(Message msg) {
            scrollBy(5, 0);
            requestLayout();
            Log.debug("Scrolled to " + getScrollX() + " px");
            sendEmptyMessageDelayed(0, REFRESH_INTERVAL);
        }
    };
}
47

Si vous n'avez pas besoin de sous-classer la TextView, vous pouvez essayer ceci dans votre fichier de présentation:

    <TextView
        Android:text="Single-line text view that scrolls automatically if the text is too long to fit in the widget" 
        Android:singleLine="true"
        Android:ellipsize="Marquee"
        Android:marqueeRepeatLimit ="Marquee_forever"
        Android:focusable="true"
        Android:focusableInTouchMode="true" 
        Android:scrollHorizontally="true"
        Android:layout_width="wrap_content" 
        Android:layout_height="wrap_content"/>

En outre, dans votre code, utilisez ce qui suit:

findViewById(R.id.serviceColorCode).setSelected(true);

[Réponse modifiée en fonction des commentaires]

176
rajath

Après ces codes xml répondus par @rajat

<TextView
        Android:text="Single-line text view that scrolls automatically if the text is too long to fit in the widget" 
        Android:singleLine="true" 
        Android:ellipsize="Marquee"
        Android:marqueeRepeatLimit ="Marquee_forever"
        Android:focusable="true"
        Android:focusableInTouchMode="true" 
        Android:scrollHorizontally="true"
        Android:layout_width="wrap_content" 
        Android:layout_height="wrap_content"/>

Nous devons définir 

TextView tv=(TextView)findViewById(R.id.textview1);
  tv.setSelected(true); 

qui a finalement fait le travail de mine

17
Sujeet Kumar Mehta

Ma solution fonctionne:

<TextView
     Android:id="@+id/titolotxt"
     Android:layout_width="..."
     Android:layout_height="..."
     Android:ellipsize="Marquee"
     Android:gravity="left"
     Android:marqueeRepeatLimit="Marquee_forever"
     Android:singleLine="true"
     Android:text="@string/titolo"/>

Et les TextView doivent être configurés et sélectionnés: textView.setSelected(true); par le code dans onCreate par exemple.

15
alfo888_ibg

Parfois invalider ne fonctionnera pas jusqu'à ce que vous appeliez invalidate dans le fil principal comme suit:

handler.post(new Runnable() {

        @Override
        public void run() {
            yourView.invalidate();
        }
    });
0
Vitaliy A
// this TextView will Marquee because it is selected
TextView marqueeText1 = (TextView) findViewById(R.id.Marquee_text_1);
marqueeText1.setSelected(true);

<TextView
    Android:id="@+id/Marquee_text_1"
    Android:layout_width="fill_parent"
    Android:layout_height="wrap_content"
    Android:text="Lorem ipsum dolor sit amet, consectetur adipiscing elit."
    Android:textSize="24sp"
    Android:singleLine="true"
    Android:ellipsize="Marquee"
    Android:marqueeRepeatLimit="Marquee_forever"
    Android:scrollHorizontally="true" />
0
A.G.THAMAYS