我对 Android 编程比较陌生,我需要一个可以自动保存文本和滚动的控件。现在,我知道 TextView 控件中的“选框”,它可以正常工作,但这种方法有两个问题。
1)我需要滚动文本不管它的长度,即如果文本只是“你好”,并且控件设置为匹配父宽度,它需要滚动。
2)控件需要响应用户滚动 - 通过向左/向右轻弹/拖动它,文本也应该滚动。
自然地,当文本“消失”到左侧时,它应该重新出现在右侧并继续滚动。现在,它应该是单行文本。
是否存在类似的东西,如果不存在,实施它的最佳方法指南是什么?
我最终扩展了默认的 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
}
}
}