我在代表图标的屏幕上有一个小的 Android ImageButton。问题是难以触摸和激活。我不想增加图像本身的大小,但我想扩大可点击区域并使其更大,因此如果用户离图像足够近,它将激活 onClick 事件。如果不为周围的屏幕区域实现 onTouch 事件,如何做到这一点?
问问题
7763 次
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);
现在您的父视图会将定义内的触摸事件委托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);
}
});
}
}
于 2020-05-27T11:18:40.887 回答
0
简单的方法:
<ImageButton
..
android:padding="16dp"
android:margin="-16dp"
.. />
于 2021-02-17T20:20:59.267 回答