如何在不缩放背景的情况下增加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,而不拉伸图像本身。 如果你想要一些最小宽度或最小高度,你可以使用minWidth
和minHeight
标签
我不确定你的意思是什么“不增加背景可绘画”。 如果你的意思是你只是不希望你的绘制拉伸,那么你有一个选项是背景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。 只需添加保证金。