首页 文章

AndroidStudio MotionEvent:在第二个视图上仅检测ACTION_UP,在第一个视图上启动ACTION_DOWN

提问于
浏览
0

我正在使用Android Studio .

我搜索了解决方案但找不到类似的东西 .

我想知道在不同的ImageView上启动DOWN操作时,哪个ImageView出现UP动作(最终能够将一个图像拖到另一个上,并通过获取拖动的图像的位置使其捕捉到相同的位置) .

我的例子有两个带有id imageView(左)和imageView2(右)的ImageView . 在我的例子中,我还没有拖动任何东西,我只想触摸左侧图像,在日志中看到“动作已关闭”并将手指抬起右侧图像,显示“动作已关闭2” .

我不知道这是否容易实现 .

据我所知,测试时,MotionEvent.ACTION_UP只会在你事先按下它时触发ImageView . 因此,当我在imageView2上发布时,它只显示左图像中的“动作已启动” .

我想知道是否有可能通过返回false来播放,因为返回值告诉我是否消耗了一个ActionEvent,所以我想如果imageView的UP事件返回false,可能它会触发imageView2的UP事件但是没有 . (要么我完全误解,要么在第二个时不识别UP,因为它不是以DOWN开始,而MotionEvents可能总是以DOWN开始) .

public class MainActivity extends Activity {
ImageView imageView;
ImageView imageView2;
String DEBUG_TAG = "action";

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    imageView = findViewById(R.id.imageView);
    imageView2 = findViewById(R.id.imageView2);

    imageView.setOnTouchListener(new View.OnTouchListener() {
        public boolean onTouch(View v, MotionEvent event) {
            //int action = MotionEventCompat.getActionMasked(event);
            int action = event.getActionMasked();

            switch(action) {
                case (MotionEvent.ACTION_DOWN) :
                    Log.d(DEBUG_TAG,"Action was DOWN"+v.toString());
                    return true;
                case (MotionEvent.ACTION_MOVE) :
                    //Log.d(DEBUG_TAG,"Action was MOVE");
                    return true;
                case (MotionEvent.ACTION_UP) :
                    Log.d(DEBUG_TAG,"Action was UP"+v.toString());
                    return false;

                default :
                    //return true;
            }
            return true;
        }
    });

    imageView2.setOnTouchListener(new View.OnTouchListener() {
        public boolean onTouch(View v, MotionEvent event) {
            //int action = MotionEventCompat.getActionMasked(event);
            int action = event.getActionMasked();

            switch(action) {
                case (MotionEvent.ACTION_DOWN) :
                    Log.d(DEBUG_TAG,"Action was DOWN2"+v.toString());
                    return true;
                case (MotionEvent.ACTION_MOVE) :
                    //Log.d(DEBUG_TAG,"Action was MOVE");
                    return true;
                case (MotionEvent.ACTION_UP) :
                    Log.d(DEBUG_TAG,"Action was UP2"+v.toString());
                    return true;

                default :
                    //return true;
            }
            return true;
        }
    });
}

}

如果没有简单的方法可以做到这一点,我正在考虑用数学方法解决这个问题,但也许你们中的一些人可以提供帮助 .

所以我的问题是,有没有办法在第二个ImageView上识别UP动作,而当前正处于另一个ImageView的MotionEvent中?

1 回答

  • 0

    我想你想知道哪个是你从屏幕上释放手指的视图,对吗?

    为此,您可以对所有视图使用相同的“View.OnTouchListener()”,在ACTION_UP中,您必须调用与此类似的新方法(伪代码):

    ....
    case (MotionEvent.ACTION_UP) :
        View[] cArrayOfPossibileViews = new View[]{ findViewById(IMAGE_1), findViewById(IMAGE2) }
        getDroppedView(v, event.getRawX(), event.getRawY(), cArrayOfPossibileViews);
        break;
    }
    ....
    
    @Nullable
    private View getDroppedView(View view, int x, int y, View[] arrayOfPossibilities) {
        Rect cVisibleBoundsRect = new Rect();
        for (View cView : arrayOfPossibilities) {
            if (!cView.getGlobalVisibleRect(cVisibleBoundsRect)) continue;
            if (cVisibleBoundsRect.contains(x, y)) {
                //THIS "cView" IS THE VIEW WHERE YOU RELEASED THE FINGER
                return cView;
            }
        }
        return null;
    }
    

    此方法获取View界限并比较它们的触摸事件的X和Y.如果X和Y包含在View边界内,则意味着View是您需要的 .

相关问题