Эффект щелчка на кнопке в Android

В андроиде, когда я устанавливаю фоновое изображение на кнопку Я не вижу никакого эффекта на кнопке. Мне нужно некоторое влияние на кнопку, чтобы пользователь мог распознать нажатие этой кнопки. Кнопка должна быть темной, а через несколько секунд, когда она щелкнула, так что я должен сделать для этого?

Этого можно добиться, создав гибкий 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) в кнопке, а не цвет блока.

Это проще, когда у вас много кнопок изображения, и вы не хотите писать xml-ы для каждой кнопки.

 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 в своем виджете «выбираемым» с правильной подсветкой и т. Д.: Просто сделайте

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

В android_sdk_path / platform / android-x есть много. Счастливый копать!

EDIT: позже я узнал, что этот простой атрибут не живет в 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 остается его фоном, и вы не устанавливаете его в нуль, он будет работать как обычная кнопка и покажет анимацию клика, щелкая точно так же, как другие кнопки. Способ скрыть Фон, пока он еще есть:

 <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" /> 1 <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" /> 1 <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" /> 1 <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" /> 1 <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 

Это лучшее решение, которое я придумал, принимая подсказки от ответа Винаяка. Все другие решения имеют разные недостатки.

Прежде всего создайте такую ​​функцию.

 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); 
Intereting Posts
Как сделать число недоступным (похоже на блокировщик вызовов)? AndroidRuntime :: getJNIEnv () возвращает NULL Как реализовать Карты Google в фрагменте и использовать объект GoogleMap? Что является лучшим способом общения между действиями веб-сайта asp.net и андроидным приложением? Android – «Ресурсы не содержат пакет для номера ресурса» Не удалось построить проект градиента android – для проекта cordova Тестирование категорий Android Какой формат предназначен для камеры Android с необработанным PictureCallback? Задача Async не работает должным образом (doInBackground не выполняется), когда служба работает в фоновом режиме, Android DrawableCompat.unwrap не работает до Lollipop Выравнивание ImageView с помощью EditText по горизонтали Android: сохранить стек активности задачи после перезагрузки из HOME Импортирование CardView и RecyclerView (Android 5.0) в мой существующий проект (eclipse) Является ли R.layout.listview таким же, как R.id.listview Android – imageView.getDrawable () возвращает null