нажмите кнопку действие на кнопку в Андроид
в android, пока я устанавливаю фоновое изображение на кнопку, Я не вижу никакого эффекта на кнопке. Мне нужен некоторый эффект на кнопку, чтобы пользователь мог распознать, что кнопка нажата. Кнопка должна быть темной в то время как несколько секунд , когда он нажал, так что я должен сделать для этого ?
11 ответов:
Это может быть достигнуто путем создания drawable xml-файл, содержащий список состояний для кнопки. Так, например, если вы создаете новый xml-файл с именем " button.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>
чтобы сохранить фоновое изображение с затемненным внешним видом при нажатии, создайте второй xml-файл и назовите его градиентом.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>
в xml вашей кнопки установите фон, чтобы быть кнопка xml например
android:background="@drawable/button"
надеюсь, что это помогает!
изменить: изменил приведенный выше код, чтобы показать изображение (YOURIMAGE) в кнопке, а не цвет блока.
это проще, когда у вас есть много кнопок изображения, и вы не хотите писать xml-s для каждой кнопки.
Котлин Версия:
fun buttonEffect(button: View) { button.setOnTouchListener { v, event -> when (event.action) { MotionEvent.ACTION_DOWN -> { v.background.setColorFilter(-0x1f0b8adf, PorterDuff.Mode.SRC_ATOP) v.invalidate() } MotionEvent.ACTION_UP -> { v.background.clearColorFilter() v.invalidate() } } false } }
Java Версия:
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; } }); }
создать свой
AlphaAnimation
объект, который решает, сколько будет эффект затухания кнопки, а затем пусть он начнется в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. счастливый копать!
EDIT: позже я узнал, что этот простой атрибут не живет в SDK
или с помощью только одного фонового изображения вы можете достичь эффекта щелчка с помощью
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, он будет работать как обычная кнопка и покажет анимацию щелчка при нажатии точно так же, как и другие кнопки.Способ скрыть фон, пока он все еще там:
<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" />
отступы не позволят Фону быть видимым и заставить кнопку действовать как другие кнопки.
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. Все остальные решения имеют разные недостатки.
прежде всего создайте такую функцию.
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: клонирование drawable для того, чтобы сделать StateListDrawable с помощью фильтры
mutate () используется для того, чтобы клон Drawable не делился своим состоянием с другими экземплярами Drawable. Подробнее об этом читайте здесь: https://developer.android.com/reference/android/graphics/drawable/Drawable.html#mutate()
использование:
вы можете передать любой тип представления (Button, ImageButton, View и т. д.) В качестве параметра функции, и они получат эффект щелчка, примененный к ним.
addClickEffect(myButton); addClickEffect(myImageButton);
делая незначительное дополнение к ответу Андраса:
можно использовать
postDelayed
чтобы сделать цветовой фильтр длительным в течение небольшого периода времени, чтобы сделать его более заметным:@Override public boolean onTouch(final View v, MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: { v.getBackground().setColorFilter(color, PorterDuff.Mode.SRC_ATOP); v.invalidate(); break; } case MotionEvent.ACTION_UP: { v.postDelayed(new Runnable() { @Override public void run() { v.getBackground().clearColorFilter(); v.invalidate(); } }, 100L); break; } } return false; }
Вы можете изменить значение задержки 100L в соответствии с вашими потребностями.