将触摸事件从一个视图委托到另一个视图

6

我正在尝试使用触摸视图事件实现自己的拖放。我希望通过长按来触发拖动,在onLongClick中,我创建了一个视图阴影作为位图,并将此位图设置为imageview。我想拖动这个imageview。我的问题是,长按事件后,imageview不能立即响应触摸事件。我必须停止触摸屏幕并再次点击imageview,然后我的图像才会移动。

一些相关代码:

  mCategoryNews.setOnLongClickListener(new View.OnLongClickListener() {
            @Override
            public boolean onLongClick(View v) {
                v.setVisibility(View.INVISIBLE);
                ImageView shadow = (ImageView) getView().findViewById(R.id.imgViewShadow);
                shadow.setLayoutParams(new FrameLayout.LayoutParams(v.getWidth(), v.getHeight()));
                shadow.setImageBitmap(Utils.loadBitmapFromView(v));
                shadow.bringToFront();
                ((FrameLayout.LayoutParams) shadow.getLayoutParams()).leftMargin = rowCategories1.getLeft();
                ((FrameLayout.LayoutParams) shadow.getLayoutParams()).topMargin = rowCategories1.getTop();

                return true;
            }

        });

private View.OnTouchListener mDragShadowTouchListener = new View.OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            Log.d(TAG, "onTouch");
            switch (event.getAction()) {

                case MotionEvent.ACTION_MOVE:
                    Log.d(TAG, "action move");
                    int x = (int) event.getRawX();//- rowCategories1.getLeft() - v.getWidth() / 2;
                    int y = (int) event.getRawY();//- rowCategories1.getTop() - v.getHeight();
                    FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(mRowWidth / 2, mRowHeight);
                    params.setMargins(x, y, 0, 0);
                    v.setLayoutParams(params);

                    break;
                case MotionEvent.ACTION_DOWN:
                    break;
            }
            return true;
        }
    };

长时间按住屏幕后,没有任何日志输出。

3个回答

7
这是一个晚回答,但我遇到了类似的问题并找到了解决方案:
通过dispatchTouchEvent方法将MotionEvent传递给应该接收它的视图。
View myView = findViewById(R.id.myView);
@Override
public boolean onTouchEvent(MotionEvent event) {
    myView.dispatchTouchEvent(event);
}

当MotionEvent被传递后,myView接管并响应新的触摸事件。


是否可以分享一个与此问题相关的示例代码? - Satya siva prasad

1
如果在onLongClick()中返回true,则表示回调已经消耗了事件,因此不会进一步传播。如果返回false,那么它将传递到子视图。(我假设触摸监听器设置在阴影ImageView上)。

0

我相信委托尝试返回false


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