0

カスタムビューに取り組む際に、私はタッチイベントと部分的な無効化を処理しようとしています。このため、画面いっぱいに配置された正方形の数字の列にすぎません。

ここで、1つのブロックを押すと、次のコマンドを使用してブロックの長方形を取得します。

private Rect getDirtyRegion(float e){
    // The value is the slot number
    mValue = ((int)e / mBlockSize);

    // start X of the "stall"
    int x1 = mValue * mBlockSize;
    int y1 = 0;

    int x2 = x1 + mBlockSize;
    int y2 = getMeasuredHeight();

    return new Rect(x1, y1, x2, y2);
}

期待どおりに動作します。画面に数個しか表示されていない場合は、うまく機能します。これが私のonTouchEvent

@Override
public boolean onTouchEvent(MotionEvent e){        

    switch(e.getAction()){
    case MotionEvent.ACTION_DOWN:
        Log.d(TAG, "ActionDown");

        setPaint(PinEntry.PAINT_PRESSED);
        invalidate(getDirtyRegion(e.getX()));
        break;

    case MotionEvent.ACTION_UP:
    case MotionEvent.ACTION_CANCEL:

        setPaint(PinEntry.PAINT_NORMAL);
        invalidate();
        break;
    }
    return true;
}

(これは何度も書き直されているためinvalidate、長方形なしの呼び出しが常に当てはまるとは限りません。)

私が求めているのは、数字をタップすると、何をしてもPRESSED状態を示すために再描画することですsetPaint。離したらリセットします。

に複数のビューがあるScrollView場合、しかしそれは壊れます。押して放すか、境界の外側にドラッグすると(トリガーACTION_CANCEL)、リセットされます。ただし、その行に戻ると、すべてが「PRESSED」として無効になります。

これは、TouchEventロジックの問題、描画の問題、またはカスタムビューの作成に関する経験不足の組み合わせですか?

4

1 に答える 1

0

最終的に、コンテナ(親)用と個々のブロックごとの2つの異なるクラスに分割しdraw(Canvas)、クラスのメソッドを使用しましたView

于 2012-09-20T15:53:51.703 に答える