Как установить эффект нажатия кнопки в Android?
В Android, когда я устанавливаю фоновое изображение для кнопки, я не вижу никакого эффекта на кнопку.
Мне нужно какое-то влияние на кнопку, чтобы пользователь мог узнать, что кнопка нажата.
Кнопка должна быть темной в течение нескольких секунд, когда она нажата, так что я должен сделать для этого?
Благодарю.
Ответы
Ответ 1
Это может быть достигнуто путем создания гибкого 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 и назовите его 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>
В xml вашей кнопки установите фон как кнопку xml, например.
android:background="@drawable/button"
Надеюсь, это поможет!
Изменить: изменил приведенный выше код, чтобы показать изображение (YOURIMAGE) в кнопке, а не цвет блока.
Ответ 2
Проще, когда у вас много кнопок с изображениями, и вы не хотите писать xml-ы для каждой кнопки.
Котлин Версия:
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;
}
});
}
Ответ 3
Создайте свой AlphaAnimation
объект, который решит, насколько будет эффект затухания кнопки, а затем пусть начнется с onClickListener
ваших кнопок
Например:
private AlphaAnimation buttonClick = new AlphaAnimation(1F, 0.8F);
// some code
public void onClick(View v) {
v.startAnimation(buttonClick);
}
Конечно, это всего лишь способ, а не самый предпочтительный, просто проще
Ответ 4
Вы можете просто использовать передний план для своего View
, чтобы добиться кликабельного эффекта:
android:foreground="?android:attr/selectableItemBackground"
Для использования с темной темой добавьте также тему в свой layout
(чтобы эффект кликабельности был ясен):
android:theme="@android:style/ThemeOverlay.Material.Dark"
Ответ 5
Чтобы ваш элемент был совместим с внешним видом системы, нетрудно сделать ссылку на системный атрибут android: attr/selectableItemBackground. Например, если вы хотите сделать ImageView в своем виджете "выборочным" с правильной подсветкой и т.д.: Просто сделайте
<ImageView
...
android:background="?android:attr/selectableItemBackground"
...
/>
В android_sdk_path/platform/android-x есть много. Счастливые копания!
EDIT: я узнал позже, что этот простой атрибут не живет в SDK < v11. Поэтому лучший способ, который я знаю сейчас, - загрузить пакет шаблона appwidget и использовать его.
fooobar.com/questions/98874/...
Ответ 6
Или используя только одно фоновое изображение, вы можете добиться эффекта щелчка, используя 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);
Ответ 7
просто добавьте еще один простой способ сделать это: если ваш 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" />
Прокладки не позволят фону быть видимым и заставить кнопку действовать как другие кнопки.
Ответ 8
Это лучшее решение, которое я придумал, чтобы получить подсказки от ответа @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: клонирование выделенного файла, чтобы сделать StateListDrawable с фильтрами
mutate() используется, чтобы сделать Drawable clone не разделяющим его состояние с другими экземплярами Drawable. Об этом подробнее здесь:
https://developer.android.com/reference/android/graphics/drawable/Drawable.html#mutate()
Применение:
В качестве параметра функции вы можете передавать любые типы View (Button, ImageButton, View и т.д.), и они получат эффект клика, примененный к ним.
addClickEffect(myButton);
addClickEffect(myImageButton);
Ответ 9
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
Ответ 10
Используйте RippleDrawable для состояния дизайна материала, нажатие/нажатие эффекта.
Чтобы добиться этого, создайте элемент ряби в виде .xml в папке /drawable и используйте его в android: background для любых представлений.
-
Эффект для иконки нажатой/нажатой, используйте эффект круговой ряби, например:
<ripple xmlns:android="http://schemas.android.com/apk/res/android" android:color="@android:color/darker_gray"/>
-
Эффект для вида, кликаемого с границей прямоугольника, мы можем добавить ряби поверх существующего объекта, как показано ниже:
<?xml version="1.0" encoding="utf-8"?> <ripple xmlns:android="http://schemas.android.com/apk/res/android" android:color="#000000"> <item android:drawable="@drawable/your_background_drawable"/> </ripple>
Ответ 11
Небольшое дополнение к ответу Андраса:
Вы можете использовать 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 в соответствии с вашими потребностями.
Ответ 12
Если вы используете фоновый XML вместо IMG, просто удалите это:
<item>
<bitmap android:src="@drawable/YOURIMAGE"/>
</item>
из 1-го ответа, который @Ljdawson дал нам.