自定义视图对触摸事件的响应不佳

时间:2012-08-24 15:32:38

标签: android view ontouchevent ondraw viewgroup

我有一个扩展ViewGroup的自定义网格,我有下一个onLayout和measureChildrenSizes方法:

@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {

    // .. tileSide calcultion ..

    measureChildrenSizes(tileSide);
    for (int i = 0; i < getChildCount(); i++) {
        Square child = (Square) getChildAt(i);
        int x = child.getColumn();
        int y = child.getRow();
        child.layout(x * tileSide, y * tileSide,
                (x + 1) * tileSide, (y + 1) * tileSide);
    }   
}

private void measureChildrenSizes(int tileSide) {
    for (int i = 0; i < getChildCount(); i++) {
        View child = getChildAt(i);
        measureChild(child, tileSide, tileSide);
    }
}

子项(Square)是自定义视图,它具有自定义onDraw方法和onTouch回调方法:

protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    rect.set(0, 0, getWidth(), getHeight());

        gradient.setBounds(rect);
        gradient.draw(canvas);              

        rectangle.setStrokeWidth(0.2f);
        rectangle.setStyle(Style.STROKE);
        rectangle.setColor(getResources().getColor(
                    R.color.puzzle_foreground));
        canvas.drawRect(rect, rectangle);
        }

@Override
public boolean onTouchEvent(MotionEvent event) {
    switch (event.getAction()) {
    case MotionEvent.ACTION_DOWN:
        requestFocus();
        changeState();
        return false;
    }
    return super.onTouchEvent(event);
}   

这绘制一个正方形网格,其边测量是tileSide。除最后一列外,所有Squares工作正常。有时他们没有回应。

也许我正在寻找错误的方向。

编辑:在模拟器中工作正常。它在真实设备中失败(在索尼xperia u,三星galaxy Ace,三星galaxy mini上测试)。

2 个答案:

答案 0 :(得分:0)

MotionEvent.ACTION_DOWN中返回false会导致某些GestureDetector(如果这就是您正在使用的)方法无法调用。尝试在那里返回true,看看它是否响应更好。

此Android开发者页面可能会对您有所帮助:Making a View Interactive

答案 1 :(得分:0)

有时,在AdapterView中通过适配器管理视图的循环中断可能会导致错误的触摸响应。我在保存时遇到了同样的问题 对AdapterView管理的视图的引用。它可能会导致对触摸的不良反应。