其实就是根据监听view的Touch事件,然后动态来改变view的位置即可:
private TextView textTv = null;
private int screenWidth;
private int screenHeight;
private int lastX, lastY;
private int currentX, currentY;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_main);
textTv = (TextView) findViewById(R.id.text);
textTv.setOnTouchListener(this);
DisplayMetrics dm = getResources().getDisplayMetrics();
screenWidth = dm.widthPixels;
screenHeight = dm.heightPixels - getStatusBarHeight();
}
/**
* 获取状态栏的高度
*
* @return
*/
public int getStatusBarHeight() {
Class<?> c = null;
Object object = null;
Field field = null;
int x = 0;
int statusBarHeight = 0;
try {
c = Class.forName("com.android.internal.R$dimen");
object = c.newInstance();
field = c.getField("status_bar_height");
x = Integer.parseInt(field.get(object).toString());
statusBarHeight = this.getResources().getDimensionPixelSize(x);
} catch (Exception e) {
}
Log.d("MainActivity", "statusBarHeight is: " + statusBarHeight);
return statusBarHeight;
}
@Override
public boolean onTouch(View v, MotionEvent event) {
// TODO Auto-generated method stub
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
Toast.makeText(MainActivity.this, "Down...", Toast.LENGTH_SHORT)
.show();
lastX = (int) event.getRawX();
lastY = (int) event.getRawY();
break;
case MotionEvent.ACTION_MOVE:
currentX = (int) event.getRawX();//相对于屏幕的位置,而event.getX是相对于控件本身的位置
currentY = (int) event.getRawY();
System.out.println("event.getRawX():" + currentX);
System.out.println("event.getRawY():" + currentY);
int dx = currentX - lastX;
int dy = currentY - lastY;
int left = v.getLeft() + dx;
int top = v.getTop() + dy;
int right = v.getRight() + dx;
int bottom = v.getBottom() + dy;
// 设置不能出界
if (left < 0) {
left = 0;
right = left + v.getWidth();
}
if (right > screenWidth) {
right = screenWidth;
left = right - v.getWidth();
}
if (top < 0) {
top = 0;
bottom = top + v.getHeight();
}
if (bottom > screenHeight) {
bottom = screenHeight;
top = bottom - v.getHeight();
}
v.layout(left, top, right, bottom);
lastX = currentX;
lastY = currentY;
break;
case MotionEvent.ACTION_UP:
break;
}
return true;
}