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?
Antwort
@ 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 :)
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.
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
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
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);
}
Große Lösung, aber der Interpolator sollte in der Menge und nicht in der Übersetzung gesetzt werden. – Leon
@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. –
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. –
- 1. Gibt es eine Möglichkeit, mehrere TextView mit ArrayAdapter zu aktualisieren?
- 2. Gibt es eine Möglichkeit, Text in einem TextView programmatisch auszuwählen?
- 3. Gibt es eine Möglichkeit, Copy/Paste von Textview zu blockieren?
- 4. Gibt es eine Möglichkeit, eine DLL-Version zu erzwingen?
- 5. C#: Gibt es eine Möglichkeit, eine Tooltip zu erzwingen?
- 6. Gibt es eine Möglichkeit, einen ImageSpan in einen TextView einzufügen, ohne den Text zu unterbrechen?
- 7. XAMARIN (C#) - gibt es eine Möglichkeit, TextView programmatisch zu unterstreichen?
- 8. Gibt es eine Möglichkeit, MySQL Ausführungsreihenfolge zu erzwingen?
- 9. Gibt es eine Möglichkeit, Hosts in Go zu erzwingen?
- 10. Gibt es eine Möglichkeit, Tabulatoren anstelle von Leerzeichen zu erzwingen?
- 11. Gibt es eine Möglichkeit, Update-Tabellen Metadaten zu erzwingen?
- 12. Android - Gibt es eine bessere Möglichkeit, dieses Layout zu erstellen?
- 13. Gibt es eine Möglichkeit zu überprüfen, ob ein TextView Text abgeschnitten wird
- 14. Gibt es eine Möglichkeit, die Android SDK-Installation zu automatisieren?
- 15. Gibt es eine Möglichkeit, 'text/plain' in node.js zu unterstützen?
- 16. Gibt es eine zuverlässige Möglichkeit, Unicode-Text groß zu schreiben?
- 17. Gibt es eine Möglichkeit, die Auswahl in Sublime Text umzuschalten?
- 18. Android TextView Text schneiden Verhalten
- 19. Gibt es eine Möglichkeit, print!/Println zu erzwingen! eine neue Windows-Zeile zu verwenden (CR LF)
- 20. Gibt es eine Möglichkeit, die Standardstartposition des Emulators zu ändern?
- 21. Gibt es eine Möglichkeit, eine Methode zu erzwingen, bestimmte Methodensignatur zu folgen?
- 22. Gibt es eine Möglichkeit, "träge" zu lesen?
- 23. Android - Möglichkeit, umrandeten Text auf dem TextView angezeigt werden?
- 24. Gibt es eine Möglichkeit, Webkonsolenfehler zu erkennen?
- 25. Gibt es eine Möglichkeit, Layouts zu animieren? [Android]?
- 26. Gibt es eine Möglichkeit, die Prozessorarchitekturanforderungen im Android-Manifest anzugeben?
- 27. Gibt es eine Möglichkeit, die Compilerzielversion auch in Abhängigkeiten zu erzwingen?
- 28. Gibt es eine bessere Möglichkeit, die Uhrzeit zu extrahieren?
- 29. Gibt es eine Möglichkeit, die signierte Apk zu crashlytics hochzuladen?
- 30. wie Text zu ändern, in Android Textview
Was ist der Sinn einer Marquee-Animation, wenn der Text nicht lang genug ist, um die Grenzen der TextView zu überschreiten? – Karakuri
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