【问题标题】:Delegate touch event from one view to another将触摸事件从一个视图委托给另一个视图
【发布时间】:2014-06-06 18:13:16
【问题描述】:

我正在尝试使用触摸视图事件实现我自己的拖放操作。我想通过长按触发拖动,在 onLongClick 中我将视图阴影创建为位图,并且该位图设置为 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;
        }
    };

当我在长按后仍将手指放在屏幕上时,没有日志输出。

【问题讨论】:

    标签: android view drag-and-drop touch-event


    【解决方案1】:

    这是一个迟到的答案,但我遇到了类似的问题并找到了这个解决方案:

    将 MotionEvent 传递给应该通过 dispatchTouchEvent 方法接管它的视图。

    View myView = findViewById(R.id.myView);
    @Override
    public boolean onTouchEvent(MotionEvent event) {
        myView.dispatchTouchEvent(event);
    }
    

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

    【讨论】:

    • 如果可能的话,你能分享一个与这个问题相关的示例代码
    【解决方案2】:

    如果您在onLongClick() 中返回true,则意味着回调具有consumed the event,因此不会进一步传播。如果你返回false,那么它将到达子视图。 (我假设触摸监听器设置在阴影 ImageView 上)。

    【讨论】:

      【解决方案3】:

      我相信委托尝试返回 false

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-01-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-31
        • 2018-01-01
        • 2012-01-08
        相关资源
        最近更新 更多