Android自动水平滚动TextView

时间:2011-03-29 12:18:05

标签: android scroll textview

我正在尝试实现一个自动滚动的单行文本视图。但我不幸的是无法让它发挥作用。 AutoScrollTextView在LinearLayout(width和height = fill_parent)中声明。该类基本上使用一个Handler,它调用自己按给定的量滚动。我已将代码简化为仅显示应每秒滚动5个像素的文本视图。

日志输出正确,getScrollX()方法返回相应的scrollX位置。

如果我不打电话requestLayout(),则不会得到任何内容。 invalidate()无效。

有人会有线索吗?

public class AutoScrollTextView extends TextView {

    public AutoScrollTextView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        setSingleLine();
        setEllipsize(null);
        setText("Single-line text view that scrolls automatically if the text is too long to fit in the widget");
    }

    // begin to scroll the text from the original position
    public void startScrolling() {
        scrollHandler.sendEmptyMessage(0);
    }

    private Handler scrollHandler = new Handler() {
        private static final int REFRESH_INTERVAL = 1000;

        public void handleMessage(Message msg) {
            scrollBy(5, 0);
            requestLayout();
            Log.debug("Scrolled to " + getScrollX() + " px");
            sendEmptyMessageDelayed(0, REFRESH_INTERVAL);
        }
    };
}

6 个答案:

答案 0 :(得分:180)

如果您不需要对TextView进行子类化,可以在布局文件中尝试:

    <TextView
        android:text="Single-line text view that scrolls automatically if the text is too long to fit in the widget" 
        android:singleLine="true"
        android:ellipsize="marquee"
        android:marqueeRepeatLimit ="marquee_forever"
        android:focusable="true"
        android:focusableInTouchMode="true" 
        android:scrollHorizontally="true"
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content"/>

此外,在您的代码中使用以下内容:

findViewById(R.id.serviceColorCode).setSelected(true);

[根据评论编辑的答案]

答案 1 :(得分:18)

在@rajat

回答这些xml代码之后
<TextView
        android:text="Single-line text view that scrolls automatically if the text is too long to fit in the widget" 
        android:singleLine="true" 
        android:ellipsize="marquee"
        android:marqueeRepeatLimit ="marquee_forever"
        android:focusable="true"
        android:focusableInTouchMode="true" 
        android:scrollHorizontally="true"
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content"/>

我们需要设置

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

最终使我的工作

答案 2 :(得分:16)

我的解决方案有效:

<TextView
     android:id="@+id/titolotxt"
     android:layout_width="..."
     android:layout_height="..."
     android:ellipsize="marquee"
     android:gravity="left"
     android:marqueeRepeatLimit="marquee_forever"
     android:singleLine="true"
     android:text="@string/titolo"/>

并且必须设置TextViewtextView.setSelected(true);中的代码onCreate,例如。{/ p>

答案 3 :(得分:1)

// this TextView will marquee because it is selected
TextView marqueeText1 = (TextView) findViewById(R.id.marquee_text_1);
marqueeText1.setSelected(true);

<TextView
    android:id="@+id/marquee_text_1"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:text="Lorem ipsum dolor sit amet, consectetur adipiscing elit."
    android:textSize="24sp"
    android:singleLine="true"
    android:ellipsize="marquee"
    android:marqueeRepeatLimit="marquee_forever"
    android:scrollHorizontally="true" />

答案 4 :(得分:0)

有些无效,直到你在主线程中调用invalidate,如下所示:

handler.post(new Runnable() {

        @Override
        public void run() {
            yourView.invalidate();
        }
    });

答案 5 :(得分:0)

提示:您的文本长度应大,否则,如果文本长度不超过您的屏幕尺寸,则不能用于小长度的文本。

<  TextView
        android:id="@+id/support"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text=" enter the large text that wont fit on screen "
        android:singleLine="true"
        android:scrollHorizontally="true"
        android:ellipsize="marquee"
        android:marqueeRepeatLimit="marquee_forever"
        />

以及您的活动

 TextView textView=findViewById(R.id.support);
        textView.setSelected(true);