Android水平文字滚动 - 自动和手势

时间:2012-10-29 11:50:20

标签: java android

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

1)我需要滚动文本,无论其长度如何,即如果文本只是“Hello”,并且控件设置为匹配父级宽度,则需要滚动。

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

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

是否存在类似的内容,如果没有,那么实施它的最佳方法指南是什么?

1 个答案:

答案 0 :(得分:1)

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

要通过手势实现幻灯片,基类实现OnGestureListener并在onScroll(...)中更新Marquee类中的偏移量,因此在下次应用新滚动偏移时绘制视图时。< / p>

最后,要实际滚动所需的数量,在构造函数中我设置自定义滚动条,并在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
        }
    }
}