2015-02-18 7 views
5

Ich habe eine TextView mit ein wenig Text drin und ich möchte sie mit der Scroll-Animation animieren. Ich sah dies popular question über das Erzwingen der Marquee-Animation, aber der Code in den Antworten funktioniert nur, wenn der Text lang genug ist, um außerhalb der Grenzen der TextView zu gehen (und damit der Text abgeschnitten ist), suchte ich nach einer Lösung zu machen der Text hat diese Marquee-Animation unabhängig von der Breite des Textes; Ist das möglich?Android TextView: Gibt es eine Möglichkeit, die Marquee-Animation mit kurzem Text zu erzwingen?

+0

Was ist der Sinn einer Marquee-Animation, wenn der Text nicht lang genug ist, um die Grenzen der TextView zu überschreiten? – Karakuri

+0

Es ist für einige Titel Text, und aus Gründen der Konsistenz/Branding wollte ich die Animation immer auf EDIT: und es sieht gut aus offensichtlich: P – AndroidNoob

Antwort

3

@ Vorschlag des JodiMiddleton Taking über den Text padding konstruiert ich einige Hilfsmethoden Pad den Text ein Zielbreite basierend auf einem TextPaint-Objekt (korrekte Größenanpassung von Schriftarten usw. beim Messen sicherstellen):

/** 
* Pad a target string of text with spaces on the right to fill a target 
* width 
* 
* @param text The target text 
* @param paint The TextPaint used to measure the target text and 
*   whitespaces 
* @param width The target width to fill 
* @return the original text with extra padding to fill the width 
*/ 
public static CharSequence padText(CharSequence text, TextPaint paint, int width) { 

    // First measure the width of the text itself 
    Rect textbounds = new Rect(); 
    paint.getTextBounds(text.toString(), 0, text.length(), textbounds); 

    /** 
    * check to see if it does indeed need padding to reach the target width 
    */ 
    if (textbounds.width() > width) { 
     return text; 
    } 

    /* 
    * Measure the text of the space character (there's a bug with the 
    * 'getTextBounds() method of Paint that trims the white space, thus 
    * making it impossible to measure the width of a space without 
    * surrounding it in arbitrary characters) 
    */ 
    String workaroundString = "a a"; 
    Rect spacebounds = new Rect(); 
    paint.getTextBounds(workaroundString, 0, workaroundString.length(), spacebounds); 

    Rect abounds = new Rect(); 
    paint.getTextBounds(new char[] { 
     'a' 
    }, 0, 1, abounds); 

    float spaceWidth = spacebounds.width() - (abounds.width() * 2); 

    /* 
    * measure the amount of spaces needed based on the target width to fill 
    * (using Math.ceil to ensure the maximum whole number of spaces) 
    */ 
    int amountOfSpacesNeeded = (int)Math.ceil((width - textbounds.width())/spaceWidth); 

    // pad with spaces til the width is less than the text width 
    return amountOfSpacesNeeded > 0 ? padRight(text.toString(), text.toString().length() 
      + amountOfSpacesNeeded) : text; 
} 

/** 
* Pads a string with white space on the right of the original string 
* 
* @param s The target string 
* @param n The new target length of the string 
* @return The target string padded with whitespace on the right to its new 
*   length 
*/ 
public static String padRight(String s, int n) { 
    return String.format("%1$-" + n + "s", s); 
} 

Also, wenn Sie die auf einem Textview-basierten Methoden verwenden, würden Sie rufen:

textView.setText(padText(myTargetString, textView.getPaint(), textView.getWidth())); 

Es ist nicht elegant, und ich bin fast sicher, es gibt Verbesserungen, die gemacht werden könnten (keine bessere Art und Weise zu tun, es ganz zu schweigen) aber nichtsdestotrotz verwende ich es in meinem Code und es scheint, den Trick zu machen :)

1

Es klingt schmutzig, aber der Pfad des geringsten Widerstandes wird wahrscheinlich darin bestehen, den Text mit Leerzeichen zu füllen, um das Scrollen zu ermöglichen.

Sie können sie bei Bedarf entfernen Klicken Sie bei Bedarf.

+0

Ich dachte über diesen Ansatz und es ist ziemlich dreckig, aber es würde den Job machen. Das Hauptproblem besteht darin, die Anzahl der hinzuzufügenden Leerzeichen zu bestimmen, damit sie das Scroll-Limit erreicht. – AndroidNoob

+0

Ich kann sehen, dass dies ein Problem mit einer dynamischen Textansicht ist. Sie können wahrscheinlich den Padding-Code von hier verwenden: http://stackoverflow.com/questions/388461/how-can-i-pad-a-string-in-java, um es auf beiden Seiten zu machen. Verwenden Sie dann die Breite des TextView als einen Multiplikationsfaktor. Alles dreckig, aber es sieht so aus, als wäre es sogar ein bisschen wie ein Hack. – JodiMiddleton

15

Machen Sie Ihre eigene Animation.

Anim/marquee.xml

<?xml version="1.0" encoding="utf-8"?> 
<set xmlns:android="http://schemas.android.com/apk/res/android"> 
    <translate 
     android:fromXDelta="100%" 
     android:toXDelta="-100%" 
     android:duration="10000" 
     android:repeatCount="infinite" 
     android:repeatMode="restart" 
     android:interpolator="@android:anim/linear_interpolator"/> 
</set> 

und in Ihrer Tätigkeit,

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.my_activity); 

    TextView myTextView = (TextView) findViewById(R.id.myTextView); 
    Animation marquee = AnimationUtils.loadAnimation(this, R.anim.marquee); 
    myTextView.startAnimation(marquee); 
} 
+0

Große Lösung, aber der Interpolator sollte in der Menge und nicht in der Übersetzung gesetzt werden. – Leon

+0

@karaokyo Textview Text wird am Ende abgeschnitten, während die Anzeige in Ordnung ist (gemäß der Breite der Ansicht), aber die Animation zeigt auch den abgeschnittenen Text für die Animation anstelle von Volltext. Können Sie mir bitte sagen, warum? Wenn ich textview.setselected auf "true" setze, wird der vollständige Text in der Animation angezeigt, aber die Animation wird ohne Benutzerinteraktion gestartet. –

+0

Diese Animation bewegt nicht nur den Text, sondern die komplette Textansicht. Ich habe einen schwarzen Hintergrund auf Textansicht und eine weiße Aktivität. Die gesamte Textansicht bewegt sich (mit dem Hintergrund) und nicht nur der Text. –

Verwandte Themen