点击Android中的button效果

在android中,而我设置背景图像button我看不到任何button的影响。 我需要一些button效果,使用户可以识别button被点击。 点击时button应该是黑暗的,所以我应该怎么做?

这可以通过创build一个包含button状态列表的可绘制xml文件来实现。 所以例如,如果你用下面的代码创build一个叫做“button.xml”的新的xml文件:

<selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_focused="true" android:state_pressed="false" android:drawable="@drawable/YOURIMAGE" /> <item android:state_focused="true" android:state_pressed="true" android:drawable="@drawable/gradient" /> <item android:state_focused="false" android:state_pressed="true" android:drawable="@drawable/gradient" /> <item android:drawable="@drawable/YOURIMAGE" /> </selector> 

为了保持背景图像在按下时变暗,请创build第二个xml文件并使用以下代码调用gradient.xml:

 <?xml version="1.0" encoding="utf-8"?> <layer-list xmlns:android="http://schemas.android.com/apk/res/android" > <item> <bitmap android:src="@drawable/YOURIMAGE"/> </item> <item> <shape xmlns:android="http://schemas.android.com/apk/res/android"> <gradient android:angle="90" android:startColor="#880f0f10" android:centerColor="#880d0d0f" android:endColor="#885d5d5e"/> </shape> </item> </layer-list> 

在你的button的xml设置背景是buttonxml例如

 android:background="@drawable/button" 

希望这可以帮助!

编辑:更改上面的代码显示button中的图像(YOURIMAGE),而不是块的颜色。

当你有很多的图像button,并且你不想为每个button写xml-s时,这是很简单的。

 public static void buttonEffect(View button){ button.setOnTouchListener(new OnTouchListener() { public boolean onTouch(View v, MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: { v.getBackground().setColorFilter(0xe0f47521,PorterDuff.Mode.SRC_ATOP); v.invalidate(); break; } case MotionEvent.ACTION_UP: { v.getBackground().clearColorFilter(); v.invalidate(); break; } } return false; } }); } 

创build你的AlphaAnimation对象,决定多less将是button的衰落效果,然后让它开始在你的button的onClickListener

例如 :

 private AlphaAnimation buttonClick = new AlphaAnimation(1F, 0.8F); // some code public void onClick(View v) { v.startAnimation(buttonClick); } 

当然这只是一种方式,不是最受欢迎的方式,这只是简单而已

通过引用系统属性android:attr / selectableItemBackground,使您的项目与系统外观一致并不困难。 例如,如果你想在你的小部件中使用适当的突出显示等“可选”,就可以了

 <ImageView ... android:background="?android:attr/selectableItemBackground" ... /> 

android_sdk_path / platforms / android-x中有很多。 快乐挖!

编辑:我后来发现,这个简单的属性不住在SDK <v11。 所以我现在知道的最好的方法是下载appwidget模板包并使用它。

https://stackoverflow.com/a/11513474/4683601

或者只使用一个背景图片,您可以通过使用setOnTouchListener来实现点击效果

两种方式

 ((Button)findViewById(R.id.testBth)).setOnTouchListener(new OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: { Button view = (Button) v; view.getBackground().setColorFilter(0x77000000, PorterDuff.Mode.SRC_ATOP); v.invalidate(); break; } case MotionEvent.ACTION_UP: // Your action here on button click case MotionEvent.ACTION_CANCEL: { Button view = (Button) v; view.getBackground().clearColorFilter(); view.invalidate(); break; } } return true; } }); 

在这里输入图像说明

如果你不想使用setOnTouchLister ,另一种实现方法是

  myButton.getBackground().setColorFilter(.setColorFilter(0xF00, Mode.MULTIPLY); StateListDrawable listDrawable = new StateListDrawable(); listDrawable.addState(new int[] {android.R.attr.state_pressed}, drawablePressed); listDrawable.addState(new int[] {android.R.attr.defaultValue}, myButton); myButton.setBackgroundDrawable(listDrawable); 

只是想添加另一个简单的方法来做到这一点:如果你的ImageButton保持其背景,而不是它设置为null,它将像一个正常的button,将显示点击animation,同时点击完全像其他button。隐藏的方式它仍然存在的背景:

 <ImageButton android:id="@+id/imageButton2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:paddingBottom="1dp" android:paddingLeft="1dp" android:paddingRight="1dp" android:paddingTop="1dp" android:src="@drawable/squareicon" /> 

填充不会让背景可见,使button像其他button一样。

 Step: set a button in XML with onClick Action: <Button android:id="@+id/btnEditUserInfo" style="?android:borderlessButtonStyle" android:layout_width="wrap_content" android:layout_height="@dimen/txt_height" android:layout_gravity="center" android:background="@drawable/round_btn" android:contentDescription="@string/image_view" android:onClick="edit_user_info" android:text="Edit" android:textColor="#000" android:textSize="@dimen/login_textSize" /> Step: on button clicked show animation point //pgrm mark ---- ---- ----- ---- ---- ----- ---- ---- ----- ---- ---- ----- public void edit_user_info(View view) { // show click effect on button pressed final AlphaAnimation buttonClick = new AlphaAnimation(1F, 0.8F); view.startAnimation(buttonClick); Intent intent = new Intent(getApplicationContext(), EditUserInfo.class); startActivity(intent); }// end edit_user_info 

这是我从Vinayak的回答中得到提示的最佳解决scheme。 所有其他解决scheme都有不同的缺点。

首先创build一个这样的function。

 void addClickEffect(View view) { Drawable drawableNormal = view.getBackground(); Drawable drawablePressed = view.getBackground().getConstantState().newDrawable(); drawablePressed.mutate(); drawablePressed.setColorFilter(Color.argb(50, 0, 0, 0), PorterDuff.Mode.SRC_ATOP); StateListDrawable listDrawable = new StateListDrawable(); listDrawable.addState(new int[] {android.R.attr.state_pressed}, drawablePressed); listDrawable.addState(new int[] {}, drawableNormal); view.setBackground(listDrawable); } 

说明:

getConstantState()。newDrawable()用于克隆现有的Drawable,否则将使用相同的drawable。 从这里阅读更多: Android:克隆绘图为了使用filter的StateListDrawable

mutate()用于使Drawable克隆不与其他Drawable实例共享状态。 阅读更多关于它在这里: https : //developer.android.com/reference/android/graphics/drawable/Drawable.html#mutate()

用法:

您可以将任何types的View(Button,ImageButton,View等)作为parameter passing给函数,并获得应用于它们的点击效果。

 addClickEffect(myButton); addClickEffect(myImageButton);