2012-10-29 23 views
0

我對Android編程比較陌生,我需要一個可以自動保存文本和滾動的控件。現在,我知道TextView控件中的「marquee」,它對於它的用途很好,但是這種方法有兩個問題。Android水平文本滾動 - 自動和手勢

1)我需要文本滾動而不管它的長度,即如果文本只是「Hello」,並且控件設置爲匹配父寬度,它需要滾動。

2)控件需要響應用戶滾動 - 通過向左/向右輕彈/拖動,文本也應滾動。

自然,當文本「消失」到左側時,它應該重新出現在右側並繼續滾動。目前,它應該是單行文本。

這樣的事情是否存在?如果不存在,那麼實施它的最佳方法指南是什麼?

回答

1

我最終擴展了默認的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 
     } 
    } 
} 
+0

你可以分享完整的源代碼也會幫助別人。 – varun