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