カスタムビューに取り組む際に、私はタッチイベントと部分的な無効化を処理しようとしています。このため、画面いっぱいに配置された正方形の数字の列にすぎません。
ここで、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ロジックの問題、描画の問題、またはカスタムビューの作成に関する経験不足の組み合わせですか?