web-dev-qa-db-de.com

Automatisches horizontales Scrollen durch TextView

Ich versuche, eine einzeilige Textansicht zu implementieren, die automatisch scrollt. Ich kann es leider nicht schaffen, dass es funktioniert. Die AutoScrollTextView wird innerhalb eines LinearLayout deklariert (width und height = fill_parent). Die Klasse verwendet im Wesentlichen einen Handler, der sich selbst ruft, um einen bestimmten Betrag zu scrollen. Ich habe den Code vereinfacht, um nur eine Textansicht anzuzeigen, die jede Sekunde um 5 Pixel scrollen sollte.

Die Protokollausgabe ist korrekt, die Methode getScrollX () gibt die entsprechende scrollX-Position zurück. 

Wenn ich requestLayout() nicht anrufe, wird nichts gezeichnet. invalidate() hat keine Auswirkung.

Hätte jemand eine Ahnung?

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

Wenn Sie die TextView-Klasse nicht unterteilen müssen, können Sie dies in Ihrer Layoutdatei versuchen:

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

Verwenden Sie in Ihrem Code außerdem Folgendes:

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

[Antwort bearbeitet aufgrund von Kommentaren]

176
rajath

Nach diesem XML-Code, wie er von @rajat beantwortet wurde

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

Wir müssen einstellen 

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

was schließlich meine Arbeit machte

17

Meine Lösung funktioniert:

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

Die TextView muss ausgewählt sein: textView.setSelected(true); durch Code in onCreate zum Beispiel.

15
alfo888_ibg

In manchen Fällen funktioniert invalidate nicht, bis Sie im main-Thread invalidate wie folgt aufrufen:

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