Gibt es eine Möglichkeit, ellipsize=”marquee” immer scrollen zu lassen?

Lesezeit: 11 Minuten

Gibt es eine Moglichkeit ellipsizemarquee immer scrollen zu lassen
Mathias

Ich möchte den Marquee-Effekt für eine TextView verwenden, aber der Text wird nur gescrollt, wenn die TextView den Fokus erhält. Das ist ein Problem, denn in meinem Fall kann es nicht.

Ich benutze:

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

Gibt es eine Möglichkeit, dass die TextView immer ihren Text scrollt? Ich habe gesehen, dass dies in der Android Market-App gemacht wird, wo der App-Name in der Titelleiste scrollt, auch wenn er keinen Fokus erhält, aber ich konnte nicht finden, dass dies in den API-Dokumenten erwähnt wird.

  • Damit Marquee funktioniert, sollte TextView ausgewählt und nicht fokussiert sein. Fokus gibt Auswahl, aber nicht umgekehrt.

    – Denis Gladkiy

    21. Mai 2014 um 10:35 Uhr

  • Versuchen Sie es mit alwaysMarqueeTextView stackoverflow.com/a/28806003/3496570

    – Zar E. Ahmer

    2. März 2015 um 9:10 Uhr


  • Ich würde die richtige Antwort für diese ändern: stackoverflow.com/a/3700651/4548520

    – Benutzer25

    4. September 2016 um 8:10 Uhr

Ich bin heute endlich auf dieses Problem gestoßen und habe so gefeuert hierarchyviewer in der Android Market-Anwendung.

Betrachtet man den Titel auf dem Detailbildschirm einer App, verwenden sie einen einfachen alten TextView. Die Untersuchung seiner Eigenschaften zeigte, dass es nicht fokussiert war, konnte nicht konzentriert sein und war im Allgemeinen sehr gewöhnlich – abgesehen von der Tatsache, dass es als gekennzeichnet war ausgewählt.

Eine Codezeile später und ich hatte es funktioniert 🙂

textView.setSelected(true);

Das macht Sinn, wenn man bedenkt, was sagt der Javadoc:

Eine Ansicht kann ausgewählt werden oder nicht. Beachten Sie, dass Auswahl nicht dasselbe ist wie Fokus. Ansichten werden normalerweise im Kontext einer AdapterView wie ListView oder GridView ausgewählt.

Das heißt, wenn Sie in einer Listenansicht (wie in der Market-App) über ein Element scrollen, wird nur dann das angezeigt jetzt ausgewählt Text beginnt zu scrollen. Und seit diesem besonderen TextView nicht fokussierbar oder anklickbar ist, verliert es nie seinen Auswahlstatus.

Leider gibt es meines Wissens keine Möglichkeit, den ausgewählten Zustand aus dem Layout-XML voreinzustellen.
Aber der obige Einzeiler funktioniert gut für mich.

  • Ich frage mich nur: Würde dies auch für TextViews funktionieren, die fokussierbar sind, aber dennoch scrollen sollten, wenn sie nicht fokussiert sind? Bleibt der ausgewählte Zustand auch dann “haften”, wenn sich der Fokuszustand ändert?

    – Mathias

    14. September 2010 um 9:25 Uhr


  • Ich denke schon. Ich verstehe nicht, warum eine Fokusänderung auf eine grundlegende TextView (dh eine, die nicht in etwas “Auswählbares” eingebettet ist, wie z ListView) würde den ausgewählten Status ändern.

    – Christoph Orr

    14. September 2010 um 11:11 Uhr

  • Bei mir funktioniert es auch gut. Vielen Dank für Ihre Antwort. Gibt es eine Möglichkeit, die Art der Wiederholung zu ändern?!

    – Timo

    1. Dezember 2010 um 8:41 Uhr

  • @Mur: Ja, lies das TextView Dokumentation und werfen Sie einen Blick auf android:marqueeRepeatLimit.

    – Christoph Orr

    2. Dezember 2010 um 11:26 Uhr

  • Diese Methode ist besser als die mit dem Fokus, da sie nicht mit dem Fokus der Ansichten in Konflikt gerät. Wenn Sie Ansichten haben, die von ihren Eltern verlangen, dass sie sich konzentrieren, wird diese Methode den Fokus durcheinander bringen. Diese Methode ist einfach, effizient und verlässt sich nicht auf Hacks, um den Fokus jedes Mal zu ändern. Danke!

    – Ionut Negru

    16. Juli 2014 um 9:00 Uhr

Gibt es eine Moglichkeit ellipsizemarquee immer scrollen zu lassen
Vinayak

Geben Sie diese Parameter einfach in Ihre TextView ein. Es klappt 🙂

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

  • Wenn dieser Antwortthread nicht bereits tot ist, sollte dies meiner Meinung nach die akzeptierte Antwort sein. Ich habe dies zu meiner XML-Definition für die Textansicht hinzugefügt, und es hat beim ersten Schuss funktioniert. Ich habe andere Vorschläge ausprobiert, und dies ist die einfachste. — Außerdem führt das Hinzufügen von “android:marqueeRepeatLimit=”marquee_forever” dazu, dass es unbegrenzt scrollt

    – Klammer

    22. November 2010 um 5:42 Uhr


  • Wenn Sie dies verwenden, wird die Fokusauswahl einer ListView-Zeile unterbrochen, wenn sich die TextView darin befindet.

    – Tivie

    9. Dezember 2010 um 10:57 Uhr


  • Funktioniert perfekt. Einfache und elegante Lösung. Danke!

    – Rabbi

    20. Januar 2012 um 17:41 Uhr

  • So starten und stoppen Sie das Festzelt von TextView

    – Ashish Dwivedi

    24. Mai 2012 um 11:19 Uhr

  • Das hat bei mir nicht funktioniert, bis ich die andere Antwort ausprobiert habe – textView.setSelected(true);

    – Justin

    19. Juni 2014 um 18:10 Uhr

1646253791 184 Gibt es eine Moglichkeit ellipsizemarquee immer scrollen zu lassen
hnviet

Ich bin mit dem Problem konfrontiert und die kürzeste Lösung, die ich mir ausgedacht habe, besteht darin, eine neue Klasse zu erstellen, die von TextView abgeleitet ist. Die Klasse sollte drei Methoden überschreiben onFocusChanged, onWindowFocusChanged und ist fokussiert um die TextView ganz fokussiert zu machen.

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

  • Perfekt – das ist genau die Lösung, nach der ich gesucht habe.

    – Jason

    18. Mai 2010 um 2:45 Uhr

  • Sie sollten auch die onWindowFocusChanged-Methode überschreiben, wenn Sie möchten, dass die Laufschrift nicht anhält, wenn Menüs eingeblendet werden.

    – virir

    8. Juni 2010 um 7:34 Uhr

  • Übrigens hatten wir tatsächlich Probleme mit dieser Lösung, da sie zustandsbehaftete Drawables durcheinander bringt: Wenn Sie Drawables mit Focus-in/Focus-out ändern, wird dies kaputt gehen. Wir brauchten fast eine Stunde zum Debuggen, bis wir erkannten, dass dieser Hack die Ursache war.

    – Mathias

    3. Dezember 2010 um 14:23 Uhr

  • Können Sie das Problem genauer beschreiben? Ich verwende diese Funktion in vielen Apps. Auf dieses Problem würde ich mich auch gerne einlassen.

    – hnviet

    4. Dezember 2010 um 7:57 Uhr

  • Dieser Hack funktioniert hervorragend und wird nur benötigt, wenn mehrere TextViews gleichzeitig auf dem Bildschirm angezeigt werden (wie bei der Verwendung in ListView) – da normalerweise nur einer von ihnen fokussiert werden kann, aber diese Lösung “täuscht” das System, indem sie alle mitteilt sind 🙂 Andernfalls sollte für einzelne TextViews eine einfachere Antwort wie stackoverflow.com/a/3510891/258848 verwendet werden.

    – dimsuz

    1. September 2013 um 9:54 Uhr

Gibt es eine Moglichkeit ellipsizemarquee immer scrollen zu lassen
Tivie

TranslateAnimation funktioniert, indem die Ansicht um einen bestimmten Betrag in eine Richtung “gezogen” wird. Sie können einstellen, wo dieses „Ziehen“ beginnen und wo es enden soll.

TranslateAnimation(fromXDelta, toXDelta, fromYDelta, toYDelta);

fromXDelta setzt den Offset der Startposition der Bewegung in der X-Achse.

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 definiert die Offset-Endposition der Bewegung in der X-Achse.

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

Wenn die Breite Ihres Textes größer ist als das Modul der Differenz zwischen fromXDelta und toXDelta, kann sich der Text nicht vollständig und vollständig auf dem Bildschirm bewegen.


Beispiel

Nehmen wir an, unsere Bildschirmgröße beträgt 320 x 240 Pixel. Wir haben eine TextView mit einem Text, der 700 Pixel breit ist, und wir möchten eine Animation erstellen, die den Text “zieht”, damit wir das Ende des Satzes sehen können.

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

Zuerst setzen wir fromXDelta = 0 damit die Bewegung keinen Anfangsversatz hat. Jetzt müssen wir den toXDelta-Wert berechnen. Um den gewünschten Effekt zu erzielen, müssen wir den Text mit exakt denselben Pixeln aus dem Bildschirm “ziehen”. (im Schema dargestellt durch <<<< X px >>>>) Da unser Text 700 Pixel breit ist und der sichtbare Bereich 320 Pixel (Bildschirmbreite) beträgt, setzen wir:

tXDelta = 700 - 320 = 380

Und wie berechnen wir die Bildschirmbreite und die Textbreite?


Code

Nehmen wir das Zarah Snippet als Ausgangspunkt:

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

Es gibt möglicherweise einfachere Möglichkeiten, dies durchzuführen, aber dies funktioniert für jede erdenkliche Ansicht und ist wiederverwendbar. Es ist besonders nützlich, wenn Sie eine TextView in einer ListView animieren möchten, ohne die aktivierten/onFocus-Fähigkeiten der TextView zu beeinträchtigen. Es scrollt auch kontinuierlich, selbst wenn die Ansicht nicht fokussiert ist.

Ich weiß nicht, ob Sie die Antwort noch brauchen, aber ich habe einen einfachen Weg gefunden, dies zu tun.

Richten Sie Ihre Animation wie folgt ein:

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 und END_POS_Y sind float Werte, während TICKER_DURATION ist ein int Ich habe mit meinen anderen Konstanten deklariert.

Dann können Sie diese Animation jetzt auf Ihr TextView anwenden:

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

Und das ist es. 🙂

Meine Animation beginnt auf der rechten Seite außerhalb des Bildschirms (300f) und endet auf der linken Seite außerhalb des Bildschirms (-300f), mit einer Dauer von 15 Sekunden (15000).

  • Das scheint nicht ganz einfach. Aber ich glaube nicht, dass er die Antwort noch braucht; siehe die akzeptierte Antwort oben .. 🙂

    – Christoph Orr

    12. August 2010 um 10:53 Uhr


  • Aber ich denke, diese Lösung ist einfacher als das Erstellen einer neuen Klasse. 😀 So wie es ist, können Sie das Animationsobjekt auch für andere Ansichten wiederverwenden, die Sie animieren möchten. 😉

    – Sara

    13. August 2010 um 3:09 Uhr

  • Es funktioniert zwar gut, aber was soll ich tun, um lange Texte anzuzeigen?! Jetzt wird mein Text nur noch gesüßt

    – Timo

    1. Dezember 2010 um 8:39 Uhr

  • @Mur Votema: Haben Sie versucht, die Breite Ihrer TextView auf wrap_content einzustellen?

    – Sara

    2. Dezember 2010 um 2:00 Uhr

  • Keine gute Lösung, da die Größen- und Dauerparameter stark von der Textgröße abhängen. Außerdem wird animiert, auch wenn die Textlänge kleiner als die Ansichtsbreite ist. setSelected(true) ist wirklich die einfachste Lösung.

    – Anm

    9. Mai 2011 um 22:49 Uhr

1646253792 816 Gibt es eine Moglichkeit ellipsizemarquee immer scrollen zu lassen
smichak

Ich habe den folgenden Code für eine ListView mit Marquee-Textelementen geschrieben. Es basiert auf der oben beschriebenen setSelected-Lösung. Grundsätzlich erweitere ich die ArrayAdapter-Klasse und überschreibe die getView-Methode, um die TextView auszuwählen, bevor ich sie zurückgebe:

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

        }
    }

  • Das scheint nicht ganz einfach. Aber ich glaube nicht, dass er die Antwort noch braucht; siehe die akzeptierte Antwort oben .. 🙂

    – Christoph Orr

    12. August 2010 um 10:53 Uhr


  • Aber ich denke, diese Lösung ist einfacher als das Erstellen einer neuen Klasse. 😀 So wie es ist, können Sie das Animationsobjekt auch für andere Ansichten wiederverwenden, die Sie animieren möchten. 😉

    – Sara

    13. August 2010 um 3:09 Uhr

  • Es funktioniert zwar gut, aber was soll ich tun, um lange Texte anzuzeigen?! Jetzt wird mein Text nur noch gesüßt

    – Timo

    1. Dezember 2010 um 8:39 Uhr

  • @Mur Votema: Haben Sie versucht, die Breite Ihrer TextView auf wrap_content einzustellen?

    – Sara

    2. Dezember 2010 um 2:00 Uhr

  • Keine gute Lösung, da die Größen- und Dauerparameter stark von der Textgröße abhängen. Außerdem wird animiert, auch wenn die Textlänge kleiner als die Ansichtsbreite ist. setSelected(true) ist wirklich die einfachste Lösung.

    – Anm

    9. Mai 2011 um 22:49 Uhr

1646253793 27 Gibt es eine Moglichkeit ellipsizemarquee immer scrollen zu lassen
Donnerstab

Dies ist die Antwort, die oben in meiner Google-Suche auftaucht, also dachte ich, ich könnte hier eine nützliche Antwort posten, da ich ziemlich oft damit zu kämpfen habe, mich daran zu erinnern. Wie auch immer, das funktioniert für mich und erfordert XML-Attribute und A einen 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);
            }
        }
    });

915960cookie-checkGibt es eine Möglichkeit, ellipsize=”marquee” immer scrollen zu lassen?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy