2011-11-22 18 views

Odpowiedz

2

można utworzyć 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)); 
    } 
}); 

skieruję od here

+6

Dzięki tej metodzie mogłem zwiększyć obszar dotykowy, ale nie byłem w stanie zmniejszyć obszaru. – Amit

1

Można go rozwiązać za pomocą tylko XML. Po prostu umieść obraz w ramce i umieść inny przezroczysty widok, który możesz podłączyć do zdarzeń kliknięcia na górze. Dostosuj rozmiar i pozycję z parametrów układu:

<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

Ponieważ pożądany obszar nieklikalny jest "przezroczysty" (zakładam, że oznacza to, że nie znajduje się on w obszarze losowania), możesz nawet rzucić dodany widok i po prostu dodając FrameLayout, w którym go rozwiązałeś - użyj oryginalnych atrybutów układu na FrameLayout zamiast ImageView i spraw, aby ImageView był tylko tak duży, na jaki chcesz go klikać. –

0

Nie używaj OnClickListener, ale OnTouchListener i obsługiwać obszar kliknij samemu.

Na przykład poprzez skalowanie prostokąta dotykowego i przetłumaczenie go na środek widoku. Można również użyć przesunięć promienia lub ręcznego.

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; 
    } 
}); 
Powiązane problemy