如何平滑移动用户手指在Android模拟器上的图像视图

当我在屏幕上移动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; } }); 

Solutions Collecting From Web of "如何平滑移动用户手指在Android模拟器上的图像视图"

以下是我认为可能会起作用的情况。

我看到你正在使用img.getX()img.getY() ,所以我假设你正在使用API​​ Level 11或更高版本。

我假设你的imgImageView的实例。 (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; 

而实际上,这只是一个loggingfloat x和float 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。 希望这会有所帮助。

  @Override public boolean onTouch(View v, MotionEvent event) { int X = (int) event.getRawX(); int Y = (int) event.getRawY(); RelativeLayout.LayoutParams paramsnew = (RelativeLayout.LayoutParams) v.getLayoutParams(); switch(event.getAction() & MotionEvent.ACTION_MASK) { case MotionEvent.ACTION_DOWN: _xDelta = X - paramsnew.leftMargin; _yDelta = Y - paramsnew.topMargin; imgposx = img.getX(); imgposy = img.getY(); break; case MotionEvent.ACTION_UP: img.setX(diyoposx); img.setY( diyoposy ); break; case MotionEvent.ACTION_MOVE: RelativeLayout.LayoutParams param = (RelativeLayout.LayoutParams) v.getLayoutParams(); param.leftMargin = X - _xDelta; param.topMargin = Y - _yDelta; param.rightMargin=(250*-1); param.bottomMargin=(250*-1); v.setLayoutParams(param); break; } mViewGroup.invalidate(); } 

这里mViewGroup是绑定ImageView的相对布局的ViewGroup实例

 mViewGroup= (ViewGroup) findViewById(R.id.relativeLayout); 

而且,imgposx,imgposy是全球可变的

 float imgposx, imgposy;