j'ai une grille personnalisée qui étend ViewGroup et j'ai les méthodes suivantes OnLayout et measureChildrenSizes:vue personnalisée ne répond pas très bien sur les événements tactiles
@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);
}
}
Les Childs (Square) sont des vues personnalisées qui ont une coutume onDraw méthode et la méthode de rappel 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);
}
Dessinez une grille de carrés dont la mesure latérale est tileSide. Tous les carrés fonctionnent bien sauf la dernière colonne. Parfois, ils ne répondent pas.
Peut-être que je suis dans la mauvaise direction.
Modifier: dans l'émulateur fonctionne très bien. Il échoue dans les vrais appareils (testé sur Sony Xperia, Samsung Galaxy Ace, Samsung Galaxy Mini).
Si vous ne l'avez pas déjà fait, vous devriez probablement appeler 'super.onLayout()' lorsque votre version surchargée est appelée, avant toute autre chose. – Closeratio
Je ne peux pas le faire. onLayout() est une méthode abstraite du ViewGroup. Il n'y a pas d'implémentation sur super classe. – Jesus