Как изменить направление бегущей строки в элемент TextView
Я хочу изменить направление marquee в TextView. По умолчанию текст перемещается справа налево, я хочу, чтобы он перемещался слева направо. Как я могу это сделать?
7 ответов
Я придумал, очень простой и легкий способ сделать это. Я сделал эффект шатра, чтобы двигаться в обоих направлениях в зависимости от нашего выбора. Итак, вот трюк:
Я использовал TextView внутри HorizontalScrollView. Я контролировал его прокрутку программным способом. У меня длина текста:
scroll_pos = (int)myTextView.getLayout().getLineWidth(0);
затем я использовал обработчик и вызывал его рекурсивно, пока не достигну предела прокрутки. В этом обработчике я сделал свой HorizontalScrollView для прокрутки до определенного позиция:
Handler hHandler = new Handler()
{
@Override
public void handleMessage(Message msg)
{
hScroll.scrollTo(scroll_pos, 0);
scroll_pos--;
if(scroll_pos >= 0)
hHandler.sendEmptyMessage(0);
}
};
и вот он идет, гладкий шатер слева направо. Ура!
другой простой способ - использование HTML, а также вы можете легко изменить направление direction="Left"
<html><body><FONT COLOR="#000000" ><marquee id="mrqSlogan" direction="Left" style="width: auto;" >text your</marquee></FONT></body></html>
и перейти к WebView
webView.loadDataWithBaseURL(null, yourhtmltext, "text/html" , null, null);
наконец, я нашел лучшее решение здесь: https://github.com/Torob/MarqueeView
спасибо тороб.Ир (это персидская поисковая система лучшей цены)
использовать эту библиотеку:
- просто добавьте этот файл java (MarqueeView.java) к вашему проекту Java в папке
-
в вашем XML-макете поместите свой TextView внутри этого MarqueeView нравится это:
<your.packagename.MarqueeView android:layout_width="fill_parent" android:layout_height="wrap_content" android:id="@+id/horizontalScrollView" android:scrollbars="none" android:visibility="visible" android:clickable="false"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/test" android:id="@+id/scrollingtext" android:singleLine="true" android:focusable="false" android:focusableInTouchMode="false" android:paddingRight="25dp" android:paddingLeft="25dp" /> </your.packagename.MarqueeView>
функциональность, которую вы ищете, в настоящее время недоступна.
вы можете создать свой собственный текстовый вид обратного шатра из источника в TextView.Java, но есть довольно много ссылок на "шатер" в нем. Я насчитал более 50, поэтому может потребоваться некоторое время, чтобы изменить направление прокрутки.
Я думал, что некоторая двунаправленная языковая поддержка может позволить вам обмануть textview в прокрутке слева направо, но Android, похоже, не поддержка RTL языков очень хорошо.
на данный момент ваш единственный вариант-принять направление шатра или создать свой собственный класс TextView, который поддерживает вашу функциональность.
Я бы посмотрел на этот участок от линии 3810 - 3815
if (mMarquee != null && mMarquee.isRunning()) {
canvas.translate(-mMarquee.mScroll, 0.0f);
}
удаление знака минус перед mMarquee становится:
if (mMarquee != null && mMarquee.isRunning()) {
canvas.translate(mMarquee.mScroll, 0.0f);
}
очевидно, вам нужно будет внести дополнительные изменения, но это укажет вам в правильном направлении (буквально).
Я бы предложил вам создать свой собственный компонент с этим поведением.
такой: ViewFlipper с одним TextView как дочерний (с отображаемым текстом).
flipper.setInAnimation(AnimationUtils.loadAnimation(this, R.anim.marquee_in));
flipper.setOutAnimation(AnimationUtils.loadAnimation(this, R.anim.marquee_out));
Marquee в:
<?xml version="1.0" encoding="utf-8"?>
<set
xmlns:android="http://schemas.android.com/apk/res/android">
<translate
android:fromXDelta="0%p"
android:toXDelta="-100%p"
android:duration="1500"/>
</set>
шатер из:
<?xml version="1.0" encoding="utf-8"?>
<set
xmlns:android="http://schemas.android.com/apk/res/android">
<translate
android:fromXDelta="100%p"
android:toXDelta="0%p"
android:duration="1500"/>
</set>
вам нужно немного настроить продолжительность, чтобы она выглядела как "родная" анимация. :-)
вот решение :
установите это в файле макета:
<TextView
android:id="@+id/textId"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:textColor="#337700"
android:textSize="20px"
android:ellipsize="marquee"
android:marqueeRepeatLimit="marquee_forever"
android:singleLine="true"
android:textStyle="bold"
android:text="Download Form for Different Vehiecle Purposes ....!!!">
</TextView>
и установите это в activity:
tv = (TextView) findViewById(R.id.textId);
tv.setSelected(true);
в моем случае это перемещение текста справа налево.
для текста справа налево для каждого, чтобы использовать: попробуйте это:
TextView tv = (TextView) findViewById(R.id.txt);
Rect bounds = new Rect();
Paint textPaint = tv.getPaint();
String text = tv.getText().toString();
textPaint.getTextBounds(text, 0, text.length(), bounds);
int width = bounds.width();
LinearLayout.LayoutParams lp = (LayoutParams) tv.getLayoutParams();
lp.width = width + 100;
int startX = 300;
TranslateAnimation ta = new TranslateAnimation(startX, lp.width, 0, 0);
ta.setDuration(20000);
ta.setRepeatCount(-1);
tv.setAnimation(ta);