0

我有一个扩展 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);
    }
}

childs (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。除最后一列外,所有正方形都可以正常工作。有时他们不回应。

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

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

4

2 回答 2

0

有时,不好的触摸响应可能是由于 AdapterView 中的 Adapter 管理视图的循环中断而导致的。当我保存
对由 AdapterView 管理的视图的引用时,我遇到了同样的问题。它可能会导致对触摸的不良反应。

于 2013-09-02T20:16:43.843 回答
0

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

这个 Android 开发者页面可能会对您有所帮助: 制作交互式视图

于 2013-09-02T20:07:10.083 回答