эффект щелчка на кнопке на Android
в андроиде, когда я устанавливаю фоновое изображение на кнопку Я не вижу никакого эффекта на кнопке. Мне нужно некоторое влияние на кнопку, чтобы пользователь мог распознать нажатие этой кнопки. Кнопка должна быть темной, а через несколько секунд, когда она щелкнула, так что я должен сделать для этого?
- Что означает публикация сообщения об ошибке Google Play APK?
- Как удалить фокус, не устанавливая фокус на другой элемент управления?
- Как изменить имя приложения Android?
- как слушать изменения в базе данных контактов
- Отключение выбора текста в PhoneGap
- Почему BitmapFactory.decodeByteArray возвращает значение null?
- Как я могу развернуть и выполнить приложение на устройстве, подключенном к удаленной системе?
- Как масштабировать bitmap до размера экрана?
Этого можно добиться, создав гибкий XML-файл, содержащий список состояний для кнопки. Например, если вы создаете новый xml-файл с именем «button.xml» со следующим кодом:
Чтобы сохранить фоновое изображение с затемненным внешним видом, нажмите второй файл xml и назовите его gradient.xml следующим кодом:
-
-
В xml вашей кнопки установите фон как кнопку xml, например
android:background="@drawable/button"
Надеюсь это поможет!
Изменить: изменил приведенный выше код, чтобы показать изображение (YOURIMAGE) в кнопке, а не цвет блока.
Это проще, когда у вас много кнопок изображения, и вы не хотите писать xml-ы для каждой кнопки.
Kotlin Версия:
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_sdk_path / platform / 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 остается его фоном, и вы не устанавливаете его в нуль, он будет работать как обычная кнопка и покажет анимацию клика, щелкая точно так же, как другие кнопки. Способ скрыть фон, пока он еще есть:
1
1
1
1
Прокладки не позволят фону быть видимым и заставить кнопку действовать как другие кнопки.
Step: set a button in XML with onClick Action: 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
Это лучшее решение, которое я придумал, принимая подсказки от ответа Винаяка. Все другие решения имеют разные недостатки.
Прежде всего создайте такую функцию.
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);
Сделав небольшое дополнение к Андре, ответьте:
Вы можете использовать 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 в соответствии с вашими потребностями.
Если вы используете xml-фон вместо IMG, просто удалите это:
-
от первого ответа, который дал нам @Ljdawson.