如何在不缩放背景的情况下增加Androidbutton的命中区域?

我有一个自定义drawable的button。

<Button android:layout_width="22dip" android:layout_height="23dip" android:background="@drawable/triangle" /> 

drawable是一个透明背景的三angular形。

 |\ | \ |__\ 

我发现这个button很难挖掘。 首先,它相对较小。 其次,透明像素不可点击。 我想保持可绘制的大小相同,但是使命中区域是三angular形尺寸两倍的正方形。

 _____________ | | | |\ | | | \ | | |__\ | |____________| 

你想要“填充”它会把视图内的空间。 保证金将外部空间,这将不会增加命中面积。

  <Button android:layout_width="22dip" android:layout_height="23dip" android:background="@drawable/triangle" android:padding="10dp" /> 

你可以使用TouchDelegate API。

 final View parent = (View) button.getParent(); // button: the view you want to enlarge hit area parent.post( new Runnable() { public void run() { final Rect rect = new Rect(); button.getHitRect(rect); rect.top -= 100; // increase top hit area rect.left -= 100; // increase left hit area rect.bottom += 100; // increase bottom hit area rect.right += 100; // increase right hit area parent.setTouchDelegate( new TouchDelegate( rect , button)); } }); 

您需要使用在API文档中定义的TouchDelegate作为“帮助器类来处理您希望视图的触摸面积大于实际视图边界的情况”

http://developer.android.com/reference/android/view/TouchDelegate.html

我喜欢这个解决scheme:

只需在布局资源文件中添加一个正面的填充和负面的填充:

 <some.View .. android:padding="12dp" android:margin="-12dp" .. /> 

与使用TouchDelegates相比,这是一个非常小的变化。 我也不想运行Runnable来添加我的Java代码中的可点击区域。

有一件事你可能会考虑如果视图应该像素完美: 填充不能总是等于边距填充应该始终在指定位置。 边距取决于周围的视图,并将与其他视图的边距值相抵消。

只需通过添加填充button

  <Button android:layout_width="wrap_contant" android:layout_height="wrap_contant" android:background="@drawable/triangle" android:padding="20dp" /> 

所以通过这样做..你的button将采取三angular形图像的高度和宽度,并将20dp填充添加到button,而不拉伸图像本身。 如果你想要一些最小宽度或最小高度,你可以使用minWidthminHeight标签

我不确定你的意思是什么“不增加背景可绘画”。 如果你的意思是你只是不希望你的绘制拉伸,那么你有一个选项是背景PNG,并添加一个额外的透明像素的边界。 这会增加你的命中区域,但不会延长你的形象。

如果你的意思是说你根本不想改变那个drawable,那么我认为你唯一的select就是使用较大的硬编码值来表示高度和宽度。

试试这个

  <Button android:id="@+id/btn_profile" android:layout_width="50dp" android:layout_height="50dp" android:layout_alignParentLeft="true" android:background="@android:color/transparent" android:drawableBottom="@drawable/moreoptionicon" android:onClick="click" android:paddingBottom="15dp" android:visibility="visible" /> 

请参阅我是否可以通过编程方式增加buttononclick-area? 。 这看起来像是我确定的最简单的方法。 甚至在允许背景获得点击的同时,只包含一点animation只有实际可点击的对象。 我将很快将这个应用到我自己的代码中。

这对我工作:

 public void getHitRect(Rect outRect) { outRect.set(getLeft(), getTop(), getRight(), getBottom() + 30); } 

虽然真的,你应该转换30下降或button高度的百分比。

我只是需要相同的:可点击区域大于button的图像。 我将它包装到FrameLayout中,大于背景可绘制的大小,并将内部Button标记更改为TextView。 比我指示一个点击处理程序来处理这个FrameLayout,而不是内部的TextView。 一切正常!

为此,我使用ImageButton。 在xml defenition中你会看到这两个属性:

  • android:background – 作为背景的drawable。
  • android:scr – 设置一个drawable作为这个ImageView的内容。

所以我们有两个可绘制的:背景和源。 在你的例子中,源代码将是triagle(drawable / trianlge):

 |\ | \ |__\ 

和背景是正方形(drawable / square):

 _____________ | | | | | | | | |____________| 

这里是ImageButton xml的例子:

 <ImageButton ... android:src="@drawable/triangle" android:background="@drawable/square"> 

结果:

 _____________ | | | |\ | | | \ | | |__\ | |____________| 

也方形绘制,可以有几个不同的状态(按下,聚焦)。 你可以使用填充来扩展背景可绘制的大小。

以防万一,这里是Android Compat Actionbar的背景示例:

 <?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <!-- Even though these two point to the same resource, have two states so the drawable will invalidate itself when coming out of pressed state. --> <item android:state_focused="true" android:state_enabled="false" android:state_pressed="true" android:drawable="@drawable/abc_list_selector_disabled_holo_dark" /> <item android:state_focused="true" android:state_enabled="false" android:drawable="@drawable/abc_list_selector_disabled_holo_dark" /> <item android:state_focused="true" android:state_pressed="true" android:drawable="@drawable/abc_list_selector_background_transition_holo_dark" /> <item android:state_focused="false" android:state_pressed="true" android:drawable="@drawable/abc_list_selector_background_transition_holo_dark" /> <item android:state_focused="true" android:drawable="@drawable/abc_list_focused_holo" /> <item android:drawable="@android:color/transparent" /> </selector> 

你可以设置填充到视图,即你的button。

 <Button android:layout_width="50dp" android:layout_height="50dp" android:background="@android:color/transparent" android:padding="15dp" /> 

希望这对你有用。

你可以使用这样的透明button…

 <Button android:layout_width="50dp" android:layout_height="50dp" android:background="@android:color/transparent" /> 

您可以根据需要增加或减lessbutton大小,并enter code here使用enter code here ImageView上的button….

 <ImageView android:layout_width="22dip" android:layout_height="23dip" android:background="@drawable/triangle" /> 
 <Button android:layout_width="32dp" android:layout_height="36dp" android:layout_margin="5dp" android:background="@drawable/foo" /> 

背景的大小仍然是22x26dp。 只需添加保证金。