如何在android emulator上使用用户手指平滑移动图像视图

如何在android emulator上使用用户手指平滑移动图像视图,android,android-imageview,Android,Android Imageview,当我第一次在屏幕上移动ImageView时,一切都很好,但第二次ImageView移动不正常 这就是我到目前为止所做的 img.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { // TODO Auto-generated method stub int eid = event.g

当我第一次在屏幕上移动
ImageView
时,一切都很好,但第二次
ImageView
移动不正常

这就是我到目前为止所做的

img.setOnTouchListener(new View.OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        // TODO Auto-generated method stub
        int eid = event.getAction();
        switch (eid) {
            case MotionEvent.ACTION_MOVE:
                FrameLayout.LayoutParams mParams = (FrameLayout.LayoutParams) img.getLayoutParams();
                int x = (int) event.getRawX();
                int y = (int) event.getRawY();
                mParams.leftMargin = x-50;
                mParams.topMargin = y-50; 
                img.setLayoutParams(mParams);
                break;
            case MotionEvent.ACTION_DOWN:
                x1=img.getX();
                y1=img.getY(); 
                break;                         
            case MotionEvent.ACTION_UP:
                img.setX(x1);
                img.setY(y1);                          
                break; 
            default:
                break;
            }
        return true;
    }
});

以下是我认为可行的情况

我看到您正在使用
img.getX()
img.getY()
, 所以我假设您使用的是API级别11或更高

我假设您的
img
ImageView
的实例。 (ImageView的
FrameLayout.LayoutParams
的用法非常复杂…)

以下是如何正确制作它:

img.setOnTouchListener(new OnTouchListener()
{
    PointF DownPT = new PointF(); // Record Mouse Position When Pressed Down
    PointF StartPT = new PointF(); // Record Start Position of 'img'

    @Override
    public boolean onTouch(View v, MotionEvent event)
    {
        switch (event.getAction())
        {
            case MotionEvent.ACTION_MOVE :
                img.setX((int)(StartPT.x + event.getX() - DownPT.x));
                img.setY((int)(StartPT.y + event.getY() - DownPT.y));
                StartPT.set( img.getX(), img.getY() );
                break;
            case MotionEvent.ACTION_DOWN :
                DownPT.set( event.getX(), event.getY() );
                StartPT.set( img.getX(), img.getY() );
                break;
            case MotionEvent.ACTION_UP :
                // Nothing have to do
                break;
            default :
                break;
        }
        return true;
    }
});



==============================================================================================
===============================[2013/05/15新增]========================================
==============================================================================================

这里显示的新对象是
PointF
。 请使用以下代码导入
PointF
对象:

import android.graphics.PointF;
实际上,这只是一个记录浮点x和浮点y的对象。 如果确实无法导入该对象,请自己编写一个,如下所示:

public class PointF
{
  public float x = 0;
  public float y = 0;
  public PointF(){};
  public PointF( float _x, float _y ){ x = _x; y = _y; }
  public void set( float _x, float _y ){ x = _x; y = _y; }

}
此代码帮助您在屏幕边界内拖动imageview。希望这会有所帮助

此处,mViewGroup是限制ImageView的相对布局的视图组实例

此外,imgposx、imgposy是全局变量

float imgposx, imgposy;

PointF DownPT=新的PointF();//按下PointF StartPT=new PointF()时记录鼠标位置;//记录“img”的起始位置,请向我提供上述代码的详细信息。我怎样才能声明这些对象。@user2380151:对不起,我的错。请使用以下代码导入“PointF”对象:导入android.graphics.PointF;实际上,这只是一个记录浮点x和浮点y的对象。如果确实无法导入该对象,请自己编写一个如下的对象:公共类PointF{public float x=0;public float y=0;public PointF(){};public PointF(float{x,float{y){x=\U x;y=\U y;}很好的解决方案,但如何防止图像进入虚拟按钮部分。它使我的图像消失???@IEBasara我想在触摸屏上旋转图像视图,而不使用其中的矩阵。。。。下一步我能做什么?如何使视图在特定范围内可拖动?下面是一个例子本文就是一个很好的例子。它还处理缩放手势和多点触摸
mViewGroup= (ViewGroup) findViewById(R.id.relativeLayout);
float imgposx, imgposy;