ImageButton W't Change 'background' Когда нажата и выпущена - PullRequest
0 голосов
/ 27 февраля 2020

Я создаю приложение с кнопками, и когда кнопка нажата, она воспроизводит звук. Моя проблема в том, что я не смог найти способ изменить фон mSoundButton при нажатии и отпускании. Я использую 'background' вместо 'sr c', поэтому я могу сжать кнопку, не обрезая края. Я еще не добавил звуки, потому что хочу решить эту проблему перед тем, как начать добавлять звуки.

Вот мои коды для кнопки в MainActivity. java (Работает нормально, но не так, как я хотел. Он меняет фон, когда нажата, но не отпущена.)

        final ImageButton mSoundBtn;
        final boolean[] soundBtnClicked = {false};
        mSoundBtn = findViewById(R.id.soundButton);
        mSoundBtn.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                if(soundBtnClicked[0])
                    mSoundBtn.setBackgroundResource(R.drawable.button_clicked);
                else
                    mSoundBtn.setBackgroundResource(R.drawable.button_not_clicked);

                soundBtnClicked[0] = !soundBtnClicked[0];
            }
        });

и вот моя активность. xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center_horizontal"
    android:orientation="vertical">

    <ImageView
        android:id="@+id/soundButton"
        android:layout_width="match_parent"
        android:layout_height="70dp"
        android:background="@drawable/button_not_clicked"
        android:contentDescription="TODO" />

</LinearLayout>

ОБНОВЛЕНИЕ (ПРОБЛЕМА РЕШЕНА):

Я хотел, чтобы mSoundBtn изменил изображение при нажатии, а затем снова изменил изображение, когда оно будет выпущено. Я использовал класс Handler и метод postDelayed(), чтобы создать задержку между двумя изменениями изображения. На самом деле он не ждет, пока пользователь отпустит кнопку, но все же решил мою проблему. Вот решение, которое я нашел:

public ImageButton mSoundBtn;
Handler h = new Handler();

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    mSoundBtn = findViewById(R.id.soundButton);
    mSoundBtn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            mSoundBtn.setBackgroundResource(R.drawable.button_clicked);
            h.postDelayed(new Runnable() {
                public void run() {
                    mSoundBtn.setBackgroundResource(R.drawable.button_not_clicked);
                }
            }, 1000); // 1 Second
        }
    });

Что происходит, когда mSoundBtn нажимается, он меняет изображение и ждет 1000 миллисекунд (1 секунда), а затем возвращается к предыдущему изображению, которое создает некоторую анимацию когда она нажата, чтобы пользователь мог понять, когда нажата кнопка.

Спасибо всем, кто пытался помочь, спасибо за чтение. :)

Ответы [ 2 ]

0 голосов
/ 27 февраля 2020

Если я правильно вас понимаю, вы хотите, чтобы действие было выполнено после того, как пользователь убрал палец с кнопки (то есть нажатие сделано). Попробуйте использовать OnTouchListener вместо OnClickListener:

imageButton.setOnTouchListener(new OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) 
    {
        if(event.getAction() == MotionEvent.ACTION_UP)
        {
            // change background and other stuff...
            return true;
        }
        return false;
    }
});

Если вы хотите изменить фон кнопки только при ее нажатии, вы можете использовать селектор для рисования, например:

<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true"
    android:drawable="@color/black" /> <!-- pressed -->
<item android:state_activated="true"
    android:drawable="@color/colorAccent" /> <!-- focused -->
<item android:drawable="@color/colorPrimary" /> <!-- default -->

и просто поместите его в качестве фона кнопки.

Другой вариант заключается в использовании переключателя и прослушивателя OnChecked и изменении фона, когда пользователь проверяет (нажимает) кнопку. Если вы хотите, чтобы фон был постоянно изменен после первого переключения, вы можете реализовать это, изменив фон только после первого переключения.

0 голосов
/ 27 февраля 2020

Вы не должны определять это как 'final'
Пример:

    public class SampleActivity extends AppCompatActivity {

    //Variables
    public ImageButton mSoundBtn;
    public boolean isSoundBtnSelected = false; 

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_sample);

        mSoundBtn = findViewById(R.id.soundButton);
        mSoundBtn.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                if(!isSoundBtnSelected)
                    mSoundBtn.setBackgroundResource(R.drawable.button_clicked);
                else
                    mSoundBtn.setBackgroundResource(R.drawable.button_not_clicked);

                isSoundBtnSelected = !isSoundBtnSelected;
            }
        });
      }

    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...