Android 如何在SurfaceView中调用自定义视图的拖动事件?

Android 如何在SurfaceView中调用自定义视图的拖动事件?,android,android-canvas,surfaceview,android-custom-view,android-touch-event,Android,Android Canvas,Surfaceview,Android Custom View,Android Touch Event,如何在SurfaceView中拖动自定义视图。触摸事件未从SurfaceView发送到子自定义视图,或者未调用子视图的onTouchEvent。请尝试此代码 public class MoveViewTouchListener implements View.OnTouchListener { private GestureDetector mGestureDetector; private View mView; public MoveViewTouchListe

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

请尝试此代码

 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));

SurfaceView不是视图组,因此无法保存任何子视图。只能在曲面视图的画布上绘制对象。例如,您可以在触摸屏x、y上绘制一个矩形。是的,您是对的。我有一个视图,我正在使用它的画布绘制到SurfaceView上方的屏幕上。但此视图(带边框的白色圆圈)未接收任何事件。触摸或拖动事件都不会传播到此自定义视图。我想在触摸此视图时将其拖动。如何实现这一点?我在自定义SurfaceView类中拥有视图。如果我从SurfaceView的
公共布尔dispatchTouchEvent(MotionEvent event){dragCircle.dispatchTouchEvent(event);return true;}
DragCircleView实例获取事件,但它在触摸SurfaceView的任何位置都得到,我尝试将event.getX和getY与圆形视图的x和y匹配,但它不起作用。请保留引号块(由
标记触发的黄色矩形)用于实际引用的内容。引用是指某人或其他人所说的话,例如在演讲、手册摘录等中。请使用普通段落文本。