2010-06-01 71 views
28

有时我的UI中有一个按钮,它很小,很难点击。到目前为止,我的解决方案是在photoshop中的按钮周围添加一个透明边框。只是增加按钮上的填充不起作用,因为这也会拉伸图像。由于每次我想要改变可点击的表面时打开photoshop是一件大事,有没有办法以编程的方式做到这一点?我已经尝试在按钮后面放置一个框架布局,并使其可点击,但随后该按钮不会改变触摸的外观,因为它应该。当然,我还可以在framelayout上添加一个ontouchlistener,它可以改变按钮的外观,但如果我有几个这样的按钮,那么它就是一些代码。我可以通过编程方式增加按钮onclick-area吗?

干杯,

回答

29

我刚刚发现了一个巧妙的方法来解决这个问题。

  1. 将按钮用一个说法放在围绕按钮的一个LinearLayout中,该按钮带有填充四周的按钮。
  2. 将相同的onclick添加到按钮的LinearLayout。
  3. 在按钮中将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> 
    
+5

这只适用于sortof。为了使它完全工作,你需要使按钮setClickable(false),否则单击botton本身不会突出显示,因为它从父节点处获得它的状态,此时未被点击。 一旦你使按钮不可点击,就不需要在其上设置onClick监听器。 – 2013-01-16 03:50:50

2

我认为你的解决方案是目前可用的最好的解决方案,如果你不想深入一些android的东西,并自己拦截所有的motionEvent和TouchEvents,那么你也需要触发按下的视图你自己的按钮等。

只需创建一个带有可拉伸透明边框的nine patch image。通过这种方式,您可以更改图像的大小而无需更改图像本身,并且您的按钮会随着显示背景的变化而变大或缩小。

33

我个人,我会使用TouchDelegate。这可以让你处理触摸目标,并将视觉界限视为两个不同的东西。非常方便...

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

+0

感谢GeorgeLawrence,你已经在stackoverflow上发表了一篇文章,并且我正在寻找它! – 2011-04-28 15:03:23

+0

这通常是触摸区域问题的最佳解决方案。 – 2011-08-20 01:27:43

+3

关于'TouchDelegate'和一段代码的解释:http://developer.android.com/training/gestures/viewgroup.html#delegate – 2014-07-08 10:46:27

1

Anothe想法是让新的透明图像,并把它图标,触摸区域会越来越设计看起来很完美。 Check out the image

谢谢。

0

到位保证金只需提供填充布局

<ImageView 
    android:id="@+id/back_btn" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:padding="25dip" 
    android:src="@drawable/back_btn" /> 
+1

这将扩大视图的背景,这可能不是所期望的。 – pgsandstrom 2012-10-03 11:23:16

+0

是的,这是正确的,但在布局和按钮很少的情况下,它可能会有所帮助。 – sidhanshu 2012-10-04 05:45:45

+0

如果不希望图像被拉伸,则填充不够,必须使用'android:scaleType =“centerInside”'以及填充以获得所需的效果。 – ForceMagic 2014-02-06 18:49:00

12

这是非常晚的“跟风”,但来这和寻找一个解决其他问题后,我发现了一个简单,优雅我自己的解决方案。

另一个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。没有额外的听众。它不会将任何视图或组添加到您的层次结构中,并且您不会整天干扰填充和边距。

简单。优雅。

+3

这实际上非常整洁,谢谢! – pgsandstrom 2013-01-14 11:49:24

+0

好主意,如果你可以使用ImageButton,但很多按钮是基于文本的,这使得这更难以应用。 – greg7gkb 2015-04-30 20:26:10

+0

@ greg7gkb为基于文本的按钮,您只需添加'padding'。 (将填充添加到基于图像的按钮会拉伸图像,这就是人们寻找除填充以外的其他解决方案的原因。) – ToolmakerSteve 2015-10-07 01:36:20

相关问题