2012-08-24 2 views
0

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).

+0

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

+0

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

Répondre

0

Si vous renvoyez false dans votre MotionEvent.ACTION_DOWN, certaines des méthodes GestureDetector (si ce n'est pas ce que vous utilisez) ne sont pas appelées. Essayez de retourner là-bas et voir si ça répond mieux.

Cette page Développeurs Android peut vous aider: Making a View Interactive

0

réponses tactiles Parfois mauvaises peuvent être provoqués par la rupture du cycle de gestion des vues par l'adaptateur dans AdapterView. J'ai rencontré le même problème lorsque j'ai enregistré la référence
aux vues gérées par AdapterView. Cela peut provoquer une mauvaise réponse aux contacts.

Questions connexes