我最終擴展了默認的TextView,並從TextView source中拉出了Marquee類。從那裏可以很容易地修改Marquee類,以便在需要時啓動/停止,並且不再需要選擇TextView(如果需要的話)。
要通過手勢實現幻燈片,基類將實現OnGestureListener,並在onScroll(...)
中更新Marquee類中的偏移量,以便在下次繪製視圖時應用新的滾動偏移量。
最後,爲了實際按需要滾動,在構造函數中設置了自定義滾動條,並在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
}
}
}
你可以分享完整的源代碼也會幫助別人。 – varun