在尝试处理自定义视图时,我正在尝试处理触摸事件和部分失效。为此,它只是一排以正方形为单位的数字,以填满屏幕。
现在,当我按下一个块时,我使用这个得到块的矩形:
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
没有矩形的调用并不总是这样。)
我所追求的是,当我点击一个数字时,它会重新绘制以通过我在setPaint
. 当我释放时,重置。
当我在 a 中有多个视图时ScrollView
,它会中断。当我按下并释放,甚至拖到边界外(触发ACTION_CANCEL
)时,它会重置。但是,回到该行会导致整个事情因“PRESSED”而无效。
这是 TouchEvent 逻辑问题、绘图问题还是我对创建自定义视图缺乏经验的某种组合?