Android:如何减少View的可点击区域?

时间:2011-11-22 10:22:54

标签: android

我有两个图像,其透明区域相互重叠。我点击的时候 一个图像,另一个图像的onclicklistener被调用。无论如何都要减少ImageView的可点击区域。

3 个答案:

答案 0 :(得分:2)

您创建了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));
    }
});

引自here

答案 1 :(得分:1)

您只能使用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>

答案 2 :(得分: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;
    }
});