нажмите кнопку действие на кнопку в Андроид


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

11 67

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

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;
        }
});

enter image description here

и если вы не хотите использовать 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 в соответствии с вашими потребностями.

Если вы используете xml-фон вместо IMG, просто удалите это:

<item>
    <bitmap android:src="@drawable/YOURIMAGE"/>
</item>

из 1-го ответа, который дал нам @Ljdawson.

вы можете просто использовать передний план для вашего view для достижения кликабельны эффект:

android:foreground="?android:attr/selectableItemBackground"