Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/343.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/186.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在Android上拖动屏幕上的对象?我不知道';我不知道如何在Android doc网站上集成onTouchEvent()代码示例_Java_Android - Fatal编程技术网

Java 如何在Android上拖动屏幕上的对象?我不知道';我不知道如何在Android doc网站上集成onTouchEvent()代码示例

Java 如何在Android上拖动屏幕上的对象?我不知道';我不知道如何在Android doc网站上集成onTouchEvent()代码示例,java,android,Java,Android,我只想在屏幕上触摸并拖动/移动一个对象 我知道有很多给定的代码,使用surface holder和imageview矩阵。但是这些代码没有很好的注释,我不知道发生了什么。我只想复制并粘贴到我自己的代码中 我知道Android开发者网站上有一个教你如何拖动和缩放的工具。但对于拖动,它只给出了onTouchEvent()的一个示例,但我不知道如何将此方法集成到MainActivity.java和activity_main.xml文件中。具体地说,在代码片段中,有mPosX和mPosY,我不知道如何使

我只想在屏幕上触摸并拖动/移动一个对象

我知道有很多给定的代码,使用surface holder和imageview矩阵。但是这些代码没有很好的注释,我不知道发生了什么。我只想复制并粘贴到我自己的代码中

我知道Android开发者网站上有一个教你如何拖动和缩放的工具。但对于拖动,它只给出了onTouchEvent()的一个示例,但我不知道如何将此方法集成到MainActivity.java和activity_main.xml文件中。具体地说,在代码片段中,有mPosX和mPosY,我不知道如何使用这些全局变量

我尝试创建一个扩展视图类的新类,并将onTouchEvent()放入其中

我知道可以使用onDraw()并重写它,以便在手指每次移动时使用mPosX和mPosY重新绘制对象,但具体如何我不知道。我需要一些实现onDraw()的示例代码

这就是我所说的代码片段:

// The ‘active pointer’ is the one currently moving our object.
private int mActivePointerId = INVALID_POINTER_ID;

@Override
public boolean onTouchEvent(MotionEvent ev) {
// Let the ScaleGestureDetector inspect all events.
mScaleDetector.onTouchEvent(ev);

final int action = MotionEventCompat.getActionMasked(ev);

switch (action) {
case MotionEvent.ACTION_DOWN: {
    final int pointerIndex = MotionEventCompat.getActionIndex(ev);
    final float x = MotionEventCompat.getX(ev, pointerIndex);
    final float y = MotionEventCompat.getY(ev, pointerIndex);

    // Remember where we started (for dragging)
    mLastTouchX = x;
    mLastTouchY = y;
    // Save the ID of this pointer (for dragging)
    mActivePointerId = MotionEventCompat.getPointerId(ev, 0);
    break;
}

case MotionEvent.ACTION_MOVE: {
    // Find the index of the active pointer and fetch its position
    final int pointerIndex =
            MotionEventCompat.findPointerIndex(ev, mActivePointerId);

    final float x = MotionEventCompat.getX(ev, pointerIndex);
    final float y = MotionEventCompat.getY(ev, pointerIndex);

    // Calculate the distance moved
    final float dx = x - mLastTouchX;
    final float dy = y - mLastTouchY;

    mPosX += dx;
    mPosY += dy;

    invalidate();

    // Remember this touch position for the next move event
    mLastTouchX = x;
    mLastTouchY = y;

    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 = MotionEventCompat.getActionIndex(ev);
    final int pointerId = MotionEventCompat.getPointerId(ev, pointerIndex);

    if (pointerId == mActivePointerId) {
        // This was our active pointer going up. Choose a new
        // active pointer and adjust accordingly.
        final int newPointerIndex = pointerIndex == 0 ? 1 : 0;
        mLastTouchX = MotionEventCompat.getX(ev, newPointerIndex);
        mLastTouchY = MotionEventCompat.getY(ev, newPointerIndex);
        mActivePointerId = MotionEventCompat.getPointerId(ev, newPointerIndex);
    }
    break;
}
}
return true;
}创建一个类MoveViewTouchListener

在活动呼叫中:


无论谁否决了这个问题,都需要给出一个理由。停止被动攻击。为什么侦听器构造函数中的每个onSomething方法中都有一个return true语句?因为重写方法返回布尔值。如果发生onDown或onScroll或任何操作,则应返回true。
 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();

            Log.d("imageview"," down");
            return true;
        }

        @Override
        public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY)
        {
            mView.setTranslationX(e2.getRawX() - mMotionDownX);
            mView.setTranslationY(e2.getRawY() - mMotionDownY);

            if((distanceX==0)&&(distanceY==0))
            {
                Log.d("imageview"," zoomed");
            }

            return true;
        }
        @Override
        public boolean onSingleTapUp(MotionEvent e) {
            Log.d("imageview"," tapped");
            return true;
        }

    };
}
ImageView imageView= findViewById(R.id.imageView);
imageView.setOnTouchListener(new MoveViewTouchListener(imageView));