在尝试处理自定义视图时,我正在尝试处理触摸事件和部分失效。为此,它只是一行数字,以正方形间隔填充屏幕。
现在,当我按下一个块时,我会使用这个块来获取块的矩形:
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
中所做的任何一种压缩状态。当我释放时,重置。
当我在ScrollView
中有多个视图时,它会中断。当我按下并释放,甚至拖出界限(触发ACTION_CANCEL
)时,它会重置。但是,返回该行会导致整个事件无效,因为“已按下”。
这是TouchEvent逻辑问题,绘图问题,还是我在创建自定义视图方面缺乏经验的一些组合?
答案 0 :(得分:0)
我最终将它拆分为两个不同的类,一个用于容器(父级),另一个用于每个单独的块,并使用draw(Canvas)
类的View
方法。