在iOS中,如果我将按钮的背景设置为图像,当我按下按钮时,按钮的整个内容(包括文本)将被阴影覆盖。我可以在Android中实现相同的效果吗?或者我必须为不同的状态使用不同的图像吗?此外,即使我对不同的状态使用不同的图像,我如何使文本也有阴影?一种肮脏的方法是将OnClickListener
设置为按钮,并在按下时通过程序对文本进行阴影处理,但还有其他方法吗?
我已经试图找到一个解决方案有一段时间了,但什么都找不到,所以我想出了一个非常巧妙的解决方案,适用于所有图像按钮。就像iOS一样。
-
创建一个10%透明的黑色图像,并将其保存为PNG。我称之为button_pressed.png。您可以使用此图像,http://img84.imageshack.us/img84/7924/buttonpressed.png
-
创建一个称为相关内容的绘图,我称之为"button_pressed_layout.xml"
<?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/button_pressed" /> </selector>
-
现在将按钮图像放在LinearLayout中,然后将按钮放在Linear Layout中。在按钮中,使用Button_pressed_layout.xml作为背景。
<LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:background="@drawable/button_image"> <Button android:id="@+id/myButtonId" android:text="@string/Continue" android:layout_width="fill_parent" android:layout_height="fill_parent" android:background="@drawable/button_pressed_layout" android:textColor="#FFF" android:textSize="16dp" > </Button> </LinearLayout>
就是这样!
为了在不创建第二个按钮图像的情况下获得按下状态,我创建了一个OnTouchListener来更改按钮的alpha。这不是最美丽的按压状态,但提供了有效的自动行为。
public class PressedStateOnTouchListener implements OnTouchListener
{
PressedStateOnTouchListener( float alphaNormal )
{
mAlphaNormal = alphaNormal;
}
public boolean onTouch( View theView, MotionEvent motionEvent )
{
switch( motionEvent.getAction() ) {
case MotionEvent.ACTION_DOWN:
theView.setAlpha( mAlphaNormal / 2.0f );
break;
case MotionEvent.ACTION_UP:
theView.setAlpha( mAlphaNormal );
break;
}
// return false because I still want this to bubble off into an onClick
return false;
}
private float mAlphaNormal;
}
在"活动"中,将此监听器应用于每个按钮:
Button theButton = (Button)findViewById( R.id.my_button_id );
theButton.setOnTouchListener( new PressedStateOnTouchListener( theButton.getAlpha() ));
为了给按钮本身带来不同的效果,我认为你需要使用自定义图像,如图所示,在这里不太详细。至于文本,这篇文章看起来会对阴影起到作用