Подтвердить что ты не робот

Как установить эффект нажатия кнопки в Android?

В Android, когда я устанавливаю фоновое изображение для кнопки, я не вижу никакого эффекта на кнопку.

Мне нужно какое-то влияние на кнопку, чтобы пользователь мог узнать, что кнопка нажата.

Кнопка должна быть темной в течение нескольких секунд, когда она нажата, так что я должен сделать для этого?

Благодарю.

4b9b3361

Ответ 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 дал нам.