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);
    }
}

子 (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 である正方形のグリッドを描画します。最後の列を除いて、すべての正方形が正常に機能します。時々、彼らは反応しません。

おそらく私は間違った方向を探しています。

編集:エミュレータでは正常に動作します。実際のデバイスでは失敗します (Sony xperia u、Samsung galaxy Ace、Samsung galaxy mini でテスト済み)。

4

2 に答える 2

0

false を返すと、MotionEvent.ACTION_DOWN一部の GestureDetector (使用している場合) メソッドが呼び出されない可能性があります。そこで true を返してみて、反応が良くなるかどうかを確認してください。

この Android 開発者ページが役立つかもしれません: ビューをインタラクティブにする

于 2013-09-02T20:07:10.083 に答える