我可以通过编程方式增加按钮onclick-area吗?
有时我的UI中有一个按钮,它很小,很难点击。到目前为止,我的解决方案是在photoshop中的按钮周围添加一个透明边框。只是增加按钮上的填充不起作用,因为这也会拉伸图像。由于每次我想要改变可点击的表面时打开photoshop是一件大事,有没有办法以编程的方式做到这一点?我已经尝试在按钮后面放置一个框架布局,并使其可点击,但随后该按钮不会改变触摸的外观,因为它应该。当然,我还可以在framelayout上添加一个ontouchlistener,它可以改变按钮的外观,但如果我有几个这样的按钮,那么它就是一些代码。我可以通过编程方式增加按钮onclick-area吗?
干杯,
我刚刚发现了一个巧妙的方法来解决这个问题。
- 将按钮用一个说法放在围绕按钮的一个LinearLayout中,该按钮带有填充四周的按钮。
- 将相同的onclick添加到按钮的LinearLayout。
-
在按钮中将duplicateParentState设置为true,当按钮在按钮外部但在LinearLayout内部单击时,该按钮将突出显示。
<LinearLayout android:layout_height="fill_parent" android:onClick="searchButtonClicked" android:layout_centerVertical="true" android:orientation="horizontal" android:layout_width="wrap_content" android:paddingRight="10dp" android:paddingLeft="30dp"> <Button android:id="@+id/search_button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="@drawable/toggle_button_selector" android:textColor="#fff" android:text="Search" android:focusable="true" android:textStyle="bold" android:onClick="searchButtonClicked" android:layout_gravity="center_vertical" android:duplicateParentState="true"/> </LinearLayout>
我认为你的解决方案是目前可用的最好的解决方案,如果你不想深入一些android的东西,并自己拦截所有的motionEvent和TouchEvents,那么你也需要触发按下的视图你自己的按钮等。
只需创建一个带有可拉伸透明边框的nine patch image。通过这种方式,您可以更改图像的大小而无需更改图像本身,并且您的按钮会随着显示背景的变化而变大或缩小。
我个人,我会使用TouchDelegate。这可以让你处理触摸目标,并将视觉界限视为两个不同的东西。非常方便...
http://developer.android.com/reference/android/view/TouchDelegate.html
感谢GeorgeLawrence,你已经在*上发表了一篇文章,并且我正在寻找它! – 2011-04-28 15:03:23
这通常是触摸区域问题的最佳解决方案。 – 2011-08-20 01:27:43
关于'TouchDelegate'和一段代码的解释:http://developer.android.com/training/gestures/viewgroup.html#delegate – 2014-07-08 10:46:27
到位保证金只需提供填充布局
<ImageView
android:id="@+id/back_btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="25dip"
android:src="@drawable/back_btn" />
这将扩大视图的背景,这可能不是所期望的。 – pgsandstrom 2012-10-03 11:23:16
是的,这是正确的,但在布局和按钮很少的情况下,它可能会有所帮助。 – sidhanshu 2012-10-04 05:45:45
如果不希望图像被拉伸,则填充不够,必须使用'android:scaleType =“centerInside”'以及填充以获得所需的效果。 – ForceMagic 2014-02-06 18:49:00
这是非常晚的“跟风”,但来这和寻找一个解决其他问题后,我发现了一个简单,优雅我自己的解决方案。
另一个question抱怨说他们的图片的透明背景是不可点击的。如果这是一个问题,这似乎也可以解决这个问题。
这里的按钮:
<ImageButton
android:id="@+id/arrowUp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/arrow_up"
android:background="@drawable/clear_button_background" />
相关的代码行是最后两个。 "@drawable/arrow_up"
是在可抽拉* .xml文件定义如下* .png文件的几个按钮状态:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android" >
<item android:state_pressed="true"
android:drawable="@drawable/tri_up_blue" /> <!-- pressed -->
<item android:state_selected="true"
android:drawable="@drawable/tri_up_blue" /> <!-- selected -->
<item android:state_focused="true"
android:drawable="@drawable/tri_up_blue" /> <!-- focused -->
<item android:drawable="@drawable/tri_up_green" /> <!-- default -->
</selector>
只要你的基本按钮。没什么特别的。而"@drawable/clear_button_background"
仅仅是这样的:
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<solid android:color="@android:color/transparent"/>
<size android:width="20dp" android:height="30dp" />
</shape>
高度和宽度这里是点击区域,根据需要调整。您可以在单个视图中重复使用此按钮,因为您需要在单个视图中使用该按钮,而不像荒谬的TouchDelegate。没有额外的听众。它不会将任何视图或组添加到您的层次结构中,并且您不会整天干扰填充和边距。
简单。优雅。
这实际上非常整洁,谢谢! – pgsandstrom 2013-01-14 11:49:24
好主意,如果你可以使用ImageButton,但很多按钮是基于文本的,这使得这更难以应用。 – greg7gkb 2015-04-30 20:26:10
@ greg7gkb为基于文本的按钮,您只需添加'padding'。 (将填充添加到基于图像的按钮会拉伸图像,这就是人们寻找除填充以外的其他解决方案的原因。) – ToolmakerSteve 2015-10-07 01:36:20
这只适用于sortof。为了使它完全工作,你需要使按钮setClickable(false),否则单击botton本身不会突出显示,因为它从父节点处获得它的状态,此时未被点击。 一旦你使按钮不可点击,就不需要在其上设置onClick监听器。 – 2013-01-16 03:50:50