[英]how to change the ImageButton's image when it is pressed and released?
[英]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.