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