Android ImageButton如何拥有一个比图像本身更大的可点击区域?

时间:2012-05-01 20:06:57

标签: android

我在屏幕上有一个代表图标的小型Android ImageButton。问题是难以触摸和激活。我不想增加图像本身的大小,但我想扩展可点击区域并使其更大,因此如果用户足够接近图像,它将激活onClick事件。如果不为周围的屏幕区域实现onTouch事件,怎么做呢?

5 个答案:

答案 0 :(得分:18)

您可以将ImageButton打包到另一个ViewGroup并在ViewGroup上设置填充。然后你会听取ViewGroup的点击。这是一个例子:

<FrameLayout
    android:id="@+id/button_layout"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:padding="20dp" >

    <ImageButton
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/my_button"
        android:duplicateParentState="true"
        android:clickable="false"
        android:focusable="false" />

</FrameLayout>

然后,您会收听R.id.button_layout上的点击次数,而您的ImageButton应该会收到所有相同的状态(按下,点击等)作为父级布局。

答案 1 :(得分:0)

我有类似的情况...我只是使用相对布局放置图标,然后在其顶部放置一个较大的按钮,使用在正常状态下完全透明的drawable,并添加半透明颜色压制/聚焦/等

答案 2 :(得分:0)

我不确定我们的布局是如何配置的,但有一点我想到的是使用相对布局。使用大透明背景创建图标。您必须摆弄布局才能正确定位,但透明区域也可以点击。

答案 3 :(得分:0)

另一种方法是在要扩展其可点击区域的子视图的父布局上设置TouchDelegate

从技术上讲,View可以将触摸事件在定义的范围内委派给其他视图。 您需要创建一个接收两个参数的TouchDelegate
a)您要委派给其他视图的bounds可触摸区域
b)您要接收此触摸事件的view

TouchDelegate delegate = new TouchDelegate(bounds, view);

然后您可以将其传递给父视图:

parent.setTouchDelegate(delegate);

现在,您的父视图将把定义的bounds中的触摸事件委派给您传递的child



这是一个完整的示例:

public class ExpandTouchableAreaActivity extends AppCompatActivity {

  FrameLayout rootFrame;
  Button btnHello;

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_expand_touchable_area);
    rootFrame = findViewById(R.id.root_frame);
    btnHello = findViewById(R.id.btn_hello);
    btnHello.setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View v) {
        Toast.makeText(ExpandTouchableAreaActivity.this, "Hello", Toast.LENGTH_SHORT).show();
      }
    });
    expandTouchableArea(rootFrame, btnHello);
  }

  public static void expandTouchableArea(final View parent, final View child) {
    child.addOnLayoutChangeListener(new View.OnLayoutChangeListener() {
      @Override
      public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) {
        int expansion = 100; // how much pixels you want to expand touchable are (on each side)
        Rect bounds = new Rect(left - expansion, top - expansion, right + expansion, bottom + expansion);
        TouchDelegate delegate = new TouchDelegate(bounds, child);
        parent.setTouchDelegate(delegate);
      }
    });

  }

}

答案 4 :(得分:0)

简单的方法:

    <ImageButton
  ..
  android:padding="16dp"
  android:margin="-16dp"
  .. />