2017-08-14 4 views
1

J'ai une vue personnalisée, on suppose qu'il ressemble à ceci:Android: seulement faire certaine partie de vue personnalisée cliquable

My Custom View

Je voudrais que mon avis personnalisé pour répondre aux onClicks, mais la attraper est que je voudrais qu'il réagisse aux clics seulement sur la partie/cercle rouge. Pas toute la vue.

Est-il possible de faire pour rendre le texte ci-dessus et la partie grise pas cliquable?

Merci.

+1

Dessinez-vous le cercle à l'aide de la zone de dessin personnalisée? –

Répondre

0

Malheureusement, la réponse Carson affichée était pas exactement ce que je cherchais mon exemple était qu'un simple, avec la réalité parfois être beaucoup plus difficile et vérifier les emplacements tactiles seraient contournés (imaginez plusieurs vues/formes dans la vue personnalisée étant les emplacements de clic). Ce que j'ai fait dans la vue personnalisée est une vue de recherche par identifiant sur les éléments de la vue personnalisée. Puis j'ai fait setOnClickListener(this) sur chaque élément que je voudrais être cliqué capable plutôt que sur la vue entière elle-même, donc mCircle.setOnClickListener(this); et mInput.setOnClickListener(this);, puis fait implements View.OnClickListener pour la vue personnalisée pour gérer les actions.

1

Dans une vue personnalisée, vous gérez les clics en remplaçant la méthode onTouchEvent de la classe View d'android. Vérifiez d'abord que l'emplacement sur lequel l'utilisateur a cliqué se trouve dans le cercle. Ensuite, normalement, vous donneriez votre avis sur l'événement MotionEvent.ACTION_DOWN pour indiquer à l'utilisateur qu'il a cliqué, par exemple pour mettre le cercle en surbrillance. Ensuite, sur MotionEvent.ACTION_UP, vous pouvez appeler votre méthode onClick.

@Override 
    public boolean onTouchEvent(MotionEvent event) {  
     boolean isTouchInCircle = checkTouchInCircle(event.getX(), event.getY()); 
     switch (event.getAction()) { 
      case MotionEvent.ACTION_DOWN: 
       if (isTouchInCircle) { 
        circleColor = highlightColor; 
        invalidate(); 
       } 
       break; 
      case MotionEvent.ACTION_MOVE: 
       if (isTouchInCircle) { 
        circleColor = highlightColor; 
       } else { 
        circleColor = normalColor 
       } 
       invalidate(); 
       break; 
      case MotionEvent.ACTION_UP: 
       if (isTouchInCircle) { 
        onClickCircle(); 
       } 
       break; 
     } 
     return true; 
    } 

// Circle click zone approximated as a square 
private boolean checkTouchInCircle(float touchX, float touchY) { 
    if (touchX < circleCenterX + circleRadius 
      && touchX > circleCenterX - circleRadius 
      && touchY < circleCenterY + circleRadius 
      && touchY > circleCenterY - circleRadius) { 
     return true; 
    } else { 
     return false; 
    } 
}