我有一个扩展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上测试)。
答案 0 :(得分:0)
在MotionEvent.ACTION_DOWN
中返回false会导致某些GestureDetector(如果这就是您正在使用的)方法无法调用。尝试在那里返回true,看看它是否响应更好。
此Android开发者页面可能会对您有所帮助:Making a View Interactive
答案 1 :(得分:0)
有时,在AdapterView中通过适配器管理视图的循环中断可能会导致错误的触摸响应。我在保存时遇到了同样的问题 对AdapterView管理的视图的引用。它可能会导致对触摸的不良反应。