제가 카메라 프리뷰를 띄워놓고 그위에 이미지를 올려 드래그 할수 있게 만들고 싶은데요
카메라 프리뷰는 surfaceview에 띄우고 이미지는 새로운 클래스에 view를 상속받아
드래그할수있게 구현을 했습니다.
정상적으로 구동은 되는데 이미지 드래그를 따로 구현해서 드래그 했을때는 정상적으로
끈김없이 드래그가 되는데요
카메라 프리뷰위에 addview로 이미지를 올려서 구동했을때
뚝뚝 끈기는 현상과 드래그 할때 멈춰있다가 몇초있다가 움직이는 현상이 발생합니다.

카메라 프리뷰 위에 이미지 올려 드래그할때 끊김현상 없이 부드럽게 움직이게 할수 있는 방법이 있을까요?


public class CameraImage extends Activity
{

    private ImageView img;
    NaviImageView nImageView;

    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);

        requestWindowFeature(Window.FEATURE_NO_TITLE);
        this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);

        setContentView(R.layout.main);

        nImageView = new NaviImageView(this);
        Preview preview = new Preview(this);
        FrameLayout frame = (FrameLayout) findViewById(R.id.frame);
        RelativeLayout rela = (RelativeLayout) findViewById(R.id.rela);
        frame.addView(preview);
        rela.addView(nImageView);

    }

    class NaviImageView extends View
    {
        private Drawable mIcon;
        private float mPosX;
        private float mPosY;

        private float mLastTouchX;
        private float mLastTouchY;

        private static final int INVALID_POINTER_ID = -1;
        private int mActivePointerid = INVALID_POINTER_ID;

        public NaviImageView(Context context)
        {
            this(context, null, 0);
        }

        public NaviImageView(Context context, AttributeSet attrs)
        {
            this(context, attrs, 0);
        }

        public NaviImageView(Context context, AttributeSet attrs, int defStyle)
        {
            super(context, attrs, 0);
            mIcon = context.getResources().getDrawable(R.drawable.icon);
            mIcon.setBounds(0, 0, mIcon.getIntrinsicWidth(), mIcon.getIntrinsicHeight());

        }

        @Override
        public void onDraw(Canvas canvas)
        {
            super.onDraw(canvas);

            canvas.save();
            canvas.translate(mPosX, mPosY);
            mIcon.draw(canvas);
            canvas.restore();
        }

        @Override
        public boolean onTouchEvent(MotionEvent ev)
        {

            final int action = ev.getAction();

            switch(action)
            {
                case MotionEvent.ACTION_DOWN:// 스크린 눌렀을때
                {
                    final float x = ev.getX();// 현재 좌표
                    final float y = ev.getY();

                    mLastTouchX = x;
                    mLastTouchY = y;

                    mActivePointerid = ev.getPointerId(0);
                    break;
                }

                case MotionEvent.ACTION_MOVE: // 터치상태에서 움직일때
                {
                    final int pointerIndex = ev.findPointerIndex(mActivePointerid); // mActivePointerid에 해당하는 포인터의 인덱스 값
                    final float x = ev.getX();// 현재 좌표
                    final float y = ev.getY();

                    final float dx = x - mLastTouchX;
                    final float dy = y - mLastTouchY;

                    mPosX += dx;
                    mPosY += dy;

                    mLastTouchX = x;
                    mLastTouchY = y;

                    invalidate();

                    break;
                }

                case MotionEvent.ACTION_UP: // 스크린에서 떼었을때
                {
                    mActivePointerid = INVALID_POINTER_ID;
                    break;
                }

                case MotionEvent.ACTION_CANCEL:
                {
                    mActivePointerid = INVALID_POINTER_ID;
                    break;
                }

                case MotionEvent.ACTION_POINTER_UP:// 다른 포인터가 떼어지는 경우
                {
                    final int pointerIndex = (action & MotionEvent.ACTION_POINTER_ID_MASK);
                    final int pointerId = ev.getPointerId(pointerIndex); // 포인터 ID값

                    if(pointerId == mActivePointerid)
                    {
                        final int newPointerIndex = pointerIndex == 0 ? 1 : 0;

                        mLastTouchX = ev.getX(newPointerIndex);
                        mLastTouchY = ev.getY(newPointerIndex);
                        mActivePointerid = ev.getPointerId(newPointerIndex);
                    }
                    break;
                }

            }
            return true;
        }
    }
}