我对Android编程比较陌生,我需要一个自动保存文本和滚动的控件。现在,我知道TextView控件中的“marquee”,它可以正常工作,但这种方法有两个问题。
1)我需要滚动文本,无论其长度如何,即如果文本只是“Hello”,并且控件设置为匹配父级宽度,则需要滚动。
2)控件需要响应用户滚动 - 通过向左/向右轻拂/拖动,文本也应该滚动。
当然,当文本“消失”到左侧时,它应该重新出现在右侧并继续滚动。现在,它应该是单行文本。
是否存在类似的内容,如果没有,那么实施它的最佳方法指南是什么?
答案 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
}
}
}