0

我对 Android 编程比较陌生,我需要一个可以自动保存文本和滚动的控件。现在,我知道 TextView 控件中的“选框”,它可以正常工作,但这种方法有两个问题。

1)我需要滚动文本不管它的长度,即如果文本只是“你好”,并且控件设置为匹配父宽度,它需要滚动。

2)控件需要响应用户滚动 - 通过向左/向右轻弹/拖动它,文本也应该滚动。

自然地,当文本“消失”到左侧时,它应该重新出现在右侧并继续滚动。现在,它应该是单行文本。

是否存在类似的东西,如果不存在,实施它的最佳方法指南是什么?

4

1 回答 1

1

我最终扩展了默认的 TextView,并从TextView 源中提取了 Marquee 类。从那里可以很容易地修改 Marquee 类,以便它在需要时启动/停止,并且不再需要选择 TextView(如果需要的话)。

为了实现手势滑动,基类实现了 OnGestureListener并在onScroll(...)我更新了 Marquee 类中的偏移量,因此当下次绘制 View 时,它会应用新的滚动偏移量。

最后,要实际滚动所需的数量,在构造函数中设置自定义滚动条,并在 onDraw 中应用滚动条。

代码的重要部分:

public class MarqueeTextView extends TextView implements OnGestureListener {

    private GestureDetector gestureDetector;
    private Marquee marquee;
    private Scroller scroller;

    // constructor
    public MarqueeTextView(Context context, AttributeSet attrs) {
        this.marquee = new Marquee(this);
        this.scroller = new Scroller(context);
        this.setScroller(scroller);
        gestureDetector = new GestureDetector(getContext(), this);
        // when enabled, longpress disables further movement tracking
        gestureDetector.setIsLongpressEnabled(false);
    }

    public boolean onScroll(MotionEvent e1, MotionEvent e2,
                            float distanceX, float distanceY) {
        marquee.addToScroll(distanceX);
        return false;
    }

    // onDraw
    protected void onDraw(Canvas canvas) {
        scroller.setFinalX((int) marquee.mScroll);
        super.onDraw(canvas);
    }

    // Marquee handler
    private static final class Marquee extends Handler {
        // mostly the same as original
        // ...

        float mScroll;

        public void addToScroll(float amount) {
            mScroll += amount;
            // detect if needs to start over
        }
    }
}
于 2012-12-28T13:13:36.073 回答