繁体   English   中英

按下和释放时,ImageButton 不会改变“背景”

[英]ImageButton Won't Change 'background' When Pressed and Released

我正在制作一个带有按钮的应用程序,当单击按钮时,它会播放声音。 我的问题是我找不到在按下和释放时更改 mSoundButton 背景的方法。 我使用 'background' 而不是 'src',所以我可以缩小按钮而不会从边缘切开。 我还没有添加声音,因为我想在开始添加声音之前解决这个问题。

这是我在 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];
            }
        });

这是我的activity_main.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 秒),然后变回前一个图像,当它被按下时会创建某种动画,以便用户可以理解何时按下按钮。

感谢任何试图提供帮助的人,感谢您的阅读。 :)

您不应该将其定义为“最终”
样本:

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

    }

如果我理解正确,您希望在用户将手指从按钮上移开后执行操作(意味着按下已完成)。 尝试使用 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 侦听器,并在用户检查(按下)按钮时更改背景。 如果您希望在第一次切换后永久更改背景,您可以通过仅在第一次切换后更改背景来实现此目的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM