13

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

4

5 回答 5

21

您可以将您的包装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应该收到与父布局相同的所有状态(按下、点击等)。

于 2012-05-01T20:12:03.637 回答
0

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

于 2012-05-01T20:10:05.430 回答
0

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

于 2012-05-01T20:12:46.383 回答
0

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

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

TouchDelegate delegate = new TouchDelegate(bounds, view);

然后你可以将它传递给父视图:

parent.setTouchDelegate(delegate);

现在您的父视图会将定义内的触摸事件委托boundschild您传递的。



这是一个完整的例子:

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

  }

}
于 2020-05-27T11:18:40.887 回答
0

简单的方法:

    <ImageButton
  ..
  android:padding="16dp"
  android:margin="-16dp"
  .. />
于 2021-02-17T20:20:59.267 回答