2011-11-22 14 views

risposta

2

si crea un TouchDelegate:  

final View parent = (View) findViewById(R.id.touch_delegate_root); 
parent.post(new Runnable() { 
    // Post in the parent's message queue to make sure the parent 
    // lays out its children before we call getHitRect() 
    public void run() { 
     final Rect rect = new Rect(); 
     Button delegate = YourActivityClass.this.mButton; 
     delegate.getHitRect(rect); 
     rect.top -= 20; 
     rect.bottom += 12; // etc 
     parent.setTouchDelegate(new TouchDelegate(rect , delegate)); 
    } 
}); 

denominati nel da here

+6

Con il tuo metodo sono stato in grado di aumentare l'area tangibile, ma non ero in grado di ridurre l'area. – Amit

1

si può risolvere utilizzando solo xml. Metti la tua immagine in una cornice e posiziona un'altra vista trasparente che leghi per fare clic sugli eventi su di essa. Regolare le dimensioni e la posizione con i parametri di layout:

<FrameLayout 
android:layout_width="wrap_content" 
android:layout_height="wrap_content"> 
<ImageView android:id="your_view" 
    android:clickable="false" 
    <!-- your other attributes --> 
    <!-- ... --> 
    /> 
    <ImageView android:id="the_clickable_view" 
     android:src="@null" 
    <!-- set desired size of clickable area --> 
    <!-- align it inside a frame using: 
    android:gravity and android:margins --> 
    /> 
</FrameLayout> 
+0

Poiché l'area non cliccabile desiderata è una "trasparente" (presumo che non si trovi all'interno dell'area del disegnabile) si potrebbe anche abbandonare la vista aggiunta e semplicemente aggiungendo il FrameLayout lo hai risolto - usa gli attributi di layout originali sul FrameLayout invece di ImageView e rende l'ImageView grande solo quanto vuoi cliccabile. –

0

Non usare l'OnClickListener, ma il OnTouchListener e gestire la zona click da soli.

Ad esempio ridimensionando il rettangolo touch e traducendolo al centro della vista. È anche possibile utilizzare il raggio o gli offset manuali.

imageView.setOnTouchListener(new View.OnTouchListener() { 
    @Override 
    public boolean onTouch(View v, MotionEvent event) { 
     final Rect rect = new Rect(); 
     v.getHitRect(rect); 

     float scale = 0.5f; 

     final float x = event.getX(); 
     final float y = event.getY(); 

     final float minX = v.getWidth() * 0.5f * (1.0f - scale); 
     final float maxX = v.getWidth() * 0.5f * (1.0f + scale); 

     final float minY = v.getHeight() * 0.5f * (1.0f - scale); 
     final float maxY = v.getHeight() * 0.5f * (1.0f + scale); 

     switch (event.getAction()) { 
      case MotionEvent.ACTION_DOWN: 
       if (x > minX && x < maxX && y > minY && y < maxY) { 
        Log.d("TOUCH", String.valueOf(x) + " " + String.valueOf(y)); 
      } 
      break; 

     } 
     return true; 
    } 
}); 
Problemi correlati