【问题标题】:How to invoke drag event of a custom view inside SurfaceView?如何在 SurfaceView 中调用自定义视图的拖动事件?
【发布时间】:2016-12-05 12:37:52
【问题描述】:

如何在 SurfaceView 中拖动自定义视图。触摸事件未从 SurfaceView 分派到子自定义视图或未调用子视图的 onTouchEvent。

【问题讨论】:

  • SurfaceView 不是 ViewGroup,因此不能容纳任何子视图。您只能在表面视图的画布上绘制东西。例如,您可以在触摸 x,y 上绘制一个矩形。
  • 是的,你是对的。我有一个视图,我正在使用它的画布在 SurfaceView 上方的屏幕上绘制。但是这个视图(带边框的白色圆圈)没有收到任何事件。触摸和拖动事件都不会传播到此自定义视图。当我触摸它时,我想拖动它。我怎样才能做到这一点?
  • 我在自定义 SurfaceView 类中有视图。如果我从 SurfaceView 的public boolean dispatchTouchEvent(MotionEvent event) { dragCircle.dispatchTouchEvent(event); return true; } DragCircleView 实例调度事件以查看事件,但它在 SurfaceView 被触摸的任何地方得到,我尝试将 event.getX 和 getY 与圆形视图的 x 和 y 匹配,但它不起作用。跨度>

标签: android android-canvas surfaceview android-custom-view android-touch-event


【解决方案1】:

试试这个代码

 public class MoveViewTouchListener implements View.OnTouchListener
{
    private GestureDetector mGestureDetector;
    private View mView;


    public MoveViewTouchListener(View view)
    {
        mGestureDetector = new GestureDetector(view.getContext(), mGestureListener);
        mView = view;
    }

    @Override
    public boolean onTouch(View v, MotionEvent event)
    {
        return mGestureDetector.onTouchEvent(event);
    }

    private GestureDetector.OnGestureListener mGestureListener = new GestureDetector.SimpleOnGestureListener()
    {
        private float mMotionDownX, mMotionDownY;

        @Override
        public boolean onDown(MotionEvent e)
        {
            mMotionDownX = e.getRawX() - mView.getTranslationX();
            mMotionDownY = e.getRawY() - mView.getTranslationY();
            return true;
        }

        @Override
        public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY)
        {
            mView.setTranslationX(e2.getRawX() - mMotionDownX);
            mView.setTranslationY(e2.getRawY() - mMotionDownY);
            return true;
        }
        @Override
        public boolean onSingleTapUp(MotionEvent e) {
            if (g) {
                if (groupselecteditems.contains(mView)) {
                    mView.setBackgroundColor(Color.TRANSPARENT);
                    groupselecteditems.remove(mView);
                } else {
                    mView.setBackgroundResource(border);
                    groupselecteditems.add((MyTextView) mView);
                }
            } else {
                toucheditem = mView;
                xcountry = mView.getX();
                ycountry = mView.getY();
            }
            return true;
        }
        @Override
        public void onLongPress(MotionEvent e) {
            if (g) {
                if (groupselecteditems.size() > 0) {
                    editGroup();
                }
            } else {
                changtextfeatures((TextView) mView);
            }
        }
    };
}

用你的视图调用这个类

 view.setOnTouchListener(new MoveViewTouchListener(view));

【讨论】:

  • 请保留引用块(>Markdown 触发的黄色矩形)用于实际引用的内容。引用是某人或其他人所说的话,例如在演讲、手动摘录等中。改用普通段落文本。
猜你喜欢
  • 2013-01-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多