0

在尝试处理自定义视图时,我正在尝试处理触摸事件和部分失效。为此,它只是一排以正方形为单位的数字,以填满屏幕。

现在,当我按下一个块时,我使用这个得到块的矩形:

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 逻辑问题、绘图问题还是我对创建自定义视图缺乏经验的某种组合?

4

1 回答 1

0

我最终将它分成两个不同的类,一个用于容器(父级),另一个用于每个单独的块并使用类的draw(Canvas)方法View

于 2012-09-20T15:53:51.703 回答