【问题标题】:ImageView and touchListenerImageView 和 touchListener
【发布时间】:2012-06-18 06:26:32
【问题描述】:

我尝试让 imageview 可点击。 实际上它是可点击的,因此我可以在用户触摸 imageview 后调用 Intent。 但我正在努力改变触摸时的图像。

我想要以下内容:

  • 默认(无触摸):Image1
  • 用户触摸 imageview:更改为 image2
  • 用户用手指移出图像视图:更改回 Image1 (不调用 Intent)
  • 用户取消触摸 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 正在工作。 如果用户未触摸图像视图,则调用 ACTION_UP。但如果 untouch 是在 imageview 之外完成的,它也会被调用。如果发生这种情况,我想切换回 image1 但不调用 takePhoto() 函数。 ACTION_CANCEL 从未被调用,我认为它是上述情况的候选者。

【问题讨论】:

    标签: android imageview ontouchlistener


    【解决方案1】:

    您可以尝试使用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;
        }
    });
    

    对不起,我还没有测试过这个,但我认为你可以理解 :)

    【讨论】:

    • 我已经尝试过了,现在如果我移出图像,它会重新设置图像。但是尽管我在图像之外没有触摸,但仍然调用了 ACTION_UP。所以我只是在那里添加了 if 语句。现在工作
    猜你喜欢
    • 2015-10-06
    • 2023-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-22
    • 2019-04-24
    相关资源
    最近更新 更多