第一次在屏幕上移动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;
}
});
答案 0 :(得分:36)
以下是我认为可行的情况。
我看到你正在使用img.getX()
,img.getY()
,
所以我假设您使用的是API级别11或更高级别。
我认为您的img
是ImageView
的实例。
(FrameLayout.LayoutParams
对ImageView的使用虽然很糟糕......)
以下是如何正确使用它:
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;
实际上,这只是一个用于记录float 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; }
}
答案 1 :(得分:1)
此代码可帮助您在屏幕边界内拖动图像视图。希望这会有所帮助。
@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;