ImageView和touchListener

时间:2012-06-17 21:53:16

标签: android imageview ontouchlistener

我尝试将imageview设为可点击。 实际上它是可点击的,所以我可以在用户触摸imageview后调用Intent。 但我很想改变触摸时的图像。

我想要以下内容:

  • 默认(无触摸):Image1
  • 用户触摸imageview:更改为image2
  • 用户从手指移出imageview:更改回Image1 (不调用意图)
  • 用户触摸imageview:调用Intent并切换回Image1

其中一些内容正在使用以下代码:

final ImageView v = (ImageView) findViewById(R.id.profileImage);

    v.setOnTouchListener(new OnTouchListener() {
        @Override
        public boolean onTouch(View arg0, MotionEvent arg1) {
            switch (arg1.getAction()) {
            case MotionEvent.ACTION_DOWN: {
                   v.setImageResource(R.drawable.ic_contact_picture_down);

                break;
            }


            case MotionEvent.ACTION_CANCEL:{

                v.setImageResource(R.drawable.ic_contact_picture);
                break;

            }

            case MotionEvent.ACTION_UP: {

                takePhoto();

                v.setImageResource(R.drawable.ic_contact_picture);
                break;
            }

            }
            return true;
        }
    });

图像在触摸时正确地改变为image2。所以ACTION_DOWN正在运行。 如果用户触摸imageview,则调用ACTION_UP。但如果在图像视图之外完成了触摸,也会调用它。如果发生这种情况,我想切换回image1,但不要调用takePhoto()函数。 从未调用过ACTION_CANCEL,我认为它是上述情况的候选者。

1 个答案:

答案 0 :(得分:0)

您可以尝试使用Rect来保留ImageView的边界,然后使用ACTION_MOVE

例如,声明一个Rect对象,

private Rect rect;

然后在setOnTouchListener()中,初始化Rect并使用ACTION_MOVE进行检查,

v.setOnTouchListener(new OnTouchListener() {
    @Override
    public boolean onTouch(View arg0, MotionEvent arg1) {
        switch (arg1.getAction()) {
          case MotionEvent.ACTION_DOWN: {
            // Declare the bounds of the rect
            rect = new Rect(v.getLeft(), v.getTop(), v.getRight(), v.getBottom());   
            v.setImageResource(R.drawable.ic_contact_picture_down);

            break;
          }

          case MotionEvent.ACTION_MOVE:{
            if(!rect.contains((int)arg1.getX(), (int)arg1.getY())) {
                // Outside the bounds
                v.setImageResource(R.drawable.ic_contact_picture);
            }
            break;        
          }

          case MotionEvent.ACTION_UP: {

            takePhoto();

            v.setImageResource(R.drawable.ic_contact_picture);
            break;
          }
        }
        return true;
    }
});

对不起,我没有对此进行测试,但我认为你可以得到这个想法:)