Как поменять направление выделения TextView - PullRequest
11 голосов
/ 15 июля 2011

Я хочу изменить направление выделения в TextView. По умолчанию текст перемещается справа налево, я хочу, чтобы он двигался слева направо. Как я могу это сделать?

Ответы [ 8 ]

9 голосов
/ 22 августа 2011

Я нашел очень простой и легкий способ сделать это. Я сделал эффект выделения, чтобы двигаться в обоих направлениях в зависимости от нашего выбора. Итак, вот фокус:

Я использовал TextView внутри HorizontalScrollView. Я контролировал его прокрутку программным способом. Я получил длину текста, используя:

scroll_pos = (int)myTextView.getLayout().getLineWidth(0);

Затем я использовал Handler и вызывал его рекурсивно, пока не достигну предела прокрутки. В этом обработчике я сделал мой 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);
    }       
};

И вот он, гладкий шатер слева направо. Ура!

6 голосов
/ 28 февраля 2016

Наконец я нашел ЛУЧШЕЕ решение здесь: https://github.com/Torob/MarqueeView

благодаря torob.ir (это поисковая система с лучшей персидской ценой)

чтобы использовать эту библиотеку:

  1. просто добавьте этот Java-файл ( MarqueeView.java ) в ваш проект папка java
  2. в вашем макете 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>
    
6 голосов
/ 04 октября 2012

Другой простой способ - использовать 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);
1 голос
/ 08 августа 2011

Я бы предложил вам создать свой собственный компонент с таким поведением.

Как это: ViewFlipper с одним TextView как дочерним (с отображаемым текстом).

flipper.setInAnimation(AnimationUtils.loadAnimation(this, R.anim.marquee_in));
flipper.setOutAnimation(AnimationUtils.loadAnimation(this, R.anim.marquee_out));

Шатёр в:

<?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>

Marquee out:

<?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>

Вы должны немного изменить длительность, чтобы она выглядела как "нативная" анимация. : -)

1 голос
/ 19 июля 2011

Функциональность, которую вы ищете, в настоящее время, по-видимому, недоступна.

Вы можете создать свой собственный текстовый вид обратного выделения из источника в TextView.java, но имеется довольно много ссылок на "marquee"" внутри.Я насчитал более 50, поэтому для изменения направления прокрутки может потребоваться некоторое время.

Я думал, что некоторая двунаправленная языковая поддержка может позволить вам обмануть текстовое представление при прокрутке слева направо, но 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);
    }

очевидно, вам потребуется внести дополнительные изменения, но это укажет вам правильное направление (буквально).

0 голосов
/ 17 ноября 2018

установить направление макета андроид: LayoutDirection = "РТЛ" андроид: textDirection = "РТЛ"

 <android.support.v7.widget.AppCompatTextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginLeft="12dp"
            android:layout_marginRight="12dp"
            android:layout_weight="1"
            android:layoutDirection="rtl"
            android:textDirection="rtl"
            android:ellipsize="marquee"
            android:marqueeRepeatLimit="marquee_forever"
            android:singleLine="true"
            android:text=" ......... گپ دوستان بیسیبییبب "
            android:textColor="@color/colorPrimaryDark"
            android:textSize="@dimen/font_size_xlarge" />
0 голосов
/ 10 октября 2013

Для текста справа налево для каждого использования: попробуйте это:

        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);
0 голосов
/ 15 июля 2011

Вот решение:

Установите это в файле макета:

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

И установите это в действии:

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

В моем случае это движетсятекст справа налево.

...