由于比较简单,就直接上代码:
public class MyActivity extends Activity {
private ImageView mIv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//布局文件就忽略了
setContentView(R.layout.activity_main);
mIv = (ImageView)findViewById(R.id.iv);
//重点是设置触摸事件
mIv.setOnTouchListener(new View.OnTouchListener() {
private float mStartY;
private float mStartX;
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
switch (motionEvent.getAction()) {
case MotionEvent.ACTION_DOWN://手指按下
// 1手指会的一个开始坐标
mStartX = motionEvent.getRawX();
mStartY = motionEvent.getRawY();
break;
case MotionEvent.ACTION_MOVE://手指移动
// 2 获得移动后的坐标
float newX = motionEvent.getRawX();
float newY = motionEvent.getRawY();
//3 获得两次坐标的差值
int dX = (int) (newX - mStartX);
int dY = (int) (newY - mStartY);
// 4 开始移动
// mView.layout();这个方法只能在activity中使用
params.x += dX;
params.y += dY;
//控制移动显示的位置不能超出屏幕边界
if(params.x<0)params.x=0;
if(params.y<0)params.y=0;
if(params.x>mWM.getDefaultDisplay().getWidth()-mView.getWidth()) {
params.x=mWM.getDefaultDisplay().getWidth()-mView.getWidth();
}
if(params.y>mWM.getDefaultDisplay().getHeight()-mView.getHeight()) {
params.y=mWM.getDefaultDisplay().getHeight()-mView.getHeight();
}
//5重新设置开始位置
mStartX = motionEvent.getRawX();
mStartY = motionEvent.getRawY();
// 多了一个通知更新
mWM.updateViewLayout(mView,params);
break;
case MotionEvent.ACTION_UP://手指抬起
//保存移动后的坐标,方便开始这个view还是现实在上次最后设置的位置
SPUtils.putInt(getApplicationContext(),Constacts.X,params.x);
SPUtils.putInt(getApplicationContext(),Constacts.Y,params.y);
break;
}
//此时返回必须是为true,move和up二个状态才会被激活
return true;
}
});
}
}
以上,就可以实现控件的移动了!效果图就不发布了!见谅