2011-11-22 18 views

答えて

2

あなたはTouchDelegateを作成:  here

+6

あなたの方法では、タッチ可能な領域を増やすことができましたが、領域を減らすことができませんでした。 – Amit

1

から参照さ

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)); 
    } 
}); 

あなたが唯一のXMLを使用してそれを解決することができます。あなたのイメージをフレームに置き、別の透明なビューを配置して、その上にあるイベントをクリックするだけです。レイアウトパラメータでサイズや位置を調整します。

<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

クリック可能な領域が透明なので、追加されたビューを削除することもできます。また、FrameLayoutを追加するだけで、元のレイアウト属性を使用することができます。 ImageViewの代わりにFrameLayoutを使用し、ImageViewをクリック可能な大きさにします。 –

0

はOnClickListenerを使用していますが、OnTouchListenerと自分でクリック領域を処理しないでください。

たとえば、タッチ矩形を拡大縮小して、それをビューの中央に移動することによって行います。 半径または手動オフセットを使用することもできます。

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; 
    } 
}); 
関連する問題