Java 如何在Android上拖动屏幕上的对象?我不知道';我不知道如何在Android doc网站上集成onTouchEvent()代码示例
我只想在屏幕上触摸并拖动/移动一个对象 我知道有很多给定的代码,使用surface holder和imageview矩阵。但是这些代码没有很好的注释,我不知道发生了什么。我只想复制并粘贴到我自己的代码中 我知道Android开发者网站上有一个教你如何拖动和缩放的工具。但对于拖动,它只给出了onTouchEvent()的一个示例,但我不知道如何将此方法集成到MainActivity.java和activity_main.xml文件中。具体地说,在代码片段中,有mPosX和mPosY,我不知道如何使用这些全局变量 我尝试创建一个扩展视图类的新类,并将onTouchEvent()放入其中 我知道可以使用onDraw()并重写它,以便在手指每次移动时使用mPosX和mPosY重新绘制对象,但具体如何我不知道。我需要一些实现onDraw()的示例代码 这就是我所说的代码片段:Java 如何在Android上拖动屏幕上的对象?我不知道';我不知道如何在Android doc网站上集成onTouchEvent()代码示例,java,android,Java,Android,我只想在屏幕上触摸并拖动/移动一个对象 我知道有很多给定的代码,使用surface holder和imageview矩阵。但是这些代码没有很好的注释,我不知道发生了什么。我只想复制并粘贴到我自己的代码中 我知道Android开发者网站上有一个教你如何拖动和缩放的工具。但对于拖动,它只给出了onTouchEvent()的一个示例,但我不知道如何将此方法集成到MainActivity.java和activity_main.xml文件中。具体地说,在代码片段中,有mPosX和mPosY,我不知道如何使
// 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));