ImageView:按下时更改图像,释放时恢复原图

3

当ImageView被按下时,我希望更改它的图片,并在释放压力时再次更改。该ImageView包含一个按钮的图片,当用户按下它时,我想通过更改图片来给用户反馈(就像按下普通按钮一样)。以下是我的代码:

final ImageView imageView = (ImageView) findViewById(R.id.imageView1);
imageView.setOnTouchListener(new OnTouchListener() {

    @Override
    public boolean onTouch(View v, MotionEvent event) {
        Log.i("IMAGE", "motion event: " + event.toString());
        switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN: {
            imageView.setImageResource(R.drawable.button_hover);
        }
        case MotionEvent.ACTION_UP: {
            imageView.setImageResource(R.drawable.button);
        }
        }
        return false;
    }
    });

这是XML格式的代码

 <ImageView
    android:id="@+id/imageView1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:contentDescription="std_button"
    android:src="@drawable/button" />

但它不起作用。如果我只使用ACTION_DOWN事件,图片会按照我的要求更改,怎么了?

3个回答

7
在drawable文件夹中创建选择器xml,内容如下:
    <?xml version="1.0" encoding="utf-8"?>
    <selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/ic_green" android:state_pressed="true"/>
    <item android:drawable="@drawable/ic_red"/>
    </selector>

2
将此可绘制的 XML 文件设置为 android:src="@drawable/selector"。 - ranjith
我已经尝试过了,但是它没有起作用。无论如何,我仍然需要通过编程的方式来实现它。谢谢。 - giozh
@giozh - 在Android中声明的几乎所有XML内容都可以通过编程实现。 - Adam Jenkins
完美运行!在Android API 23上进行了测试。 - Benjamin RD

5

尝试在每个case后添加break;语句。

并且像giozh所说,我在onTouch内始终返回false,因此触摸事件结果始终未被消耗。只需在每个case语句后面放置return true即可。


1
此外,在编写 switch-case 语句时不需要使用括号。 - VonL
1
我使用了你的建议,但是我用不同的方式解决了我的问题!在onTouch中,我总是返回false,因此触摸事件结果总是未被消耗。只需在每个case语句后面加上return true即可。 - giozh
你如何在每个case后返回true并跳出switch语句?放置其中一个将跳过另一个。 - Junior Frogie

0

如果想在事件按下时进行更改,可以尝试这个方法......

final ImageView imagen = (Imagen) findViewById(R.id.imageViewX);
 ImageView imagen = (ImageView)findViewById(R.id.imageViewX);
     imagen.setOnClickListener(new View.OnClickListener() {
         @Override
         public void onClick(View view) {
             ImageView perse = (ImageView) findViewById(R.id.imageViewX);
             perse.setImageResource(R.drawable.backgroundtwo);

         }
     });

这不是答案。实际的 OP 代码中缺少 break 语句。此外,您不能重新初始化 final 变量。 - Soumya
不仅具有break函数,还具有counter++。 - mfig

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接