0

私はAndroidプログラミングに比較的慣れていないので、テキストを保持して自動的にスクロールするコントロールが必要です。これで、TextViewコントロールの「マーキー」について理解し、意図したとおりに機能しますが、そのアプローチには2つの問題があります。

1)テキストの長さに関係なくスクロールする必要があります。つまり、テキストが「Hello」のみで、コントロールが親の幅に一致するように設定されている場合は、スクロールする必要があります。

2)コントロールはユーザーのスクロールに応答する必要があります-コントロールを左右にフリック/ドラッグすることで、テキストもスクロールする必要があります。

そして当然、テキストが左側に「なくなった」とき、それは右側に再表示され、スクロールを続けるはずです。今のところ、1行のテキストである必要があります。

そのようなものは存在しますか?存在しない場合、それを実装するための最良のアプローチガイドラインは何でしょうか?

4

1 に答える 1

1

最終的にデフォルトのTextViewを拡張し、 TextViewソースから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
        }
    }
}
于 2012-12-28T13:13:36.073 に答える