本Demo主要展示如何拖动一个Button.
1. 主程序代码
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 去除title(即显示信号,电量状态栏)
requestWindowFeature(Window.FEATURE_NO_TITLE);
// 去掉Activity上面的状态栏
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
setContentView(R.layout.activity_main);
// 获得屏幕的宽和高
DisplayMetrics dm = getResources().getDisplayMetrics();
final int screenWidth = dm.widthPixels;
final int screenHeight = dm.heightPixels;
Button dragBtn = (Button) findViewById(R.id.bt_drag);
// button的Touch事件监听
dragBtn.setOnTouchListener(new OnTouchListener() {
boolean isDraging = false;
float lastX, lastY;
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
isDraging = true;
// 获得相对于屏幕位置坐标
lastX = event.getRawX();
lastY = event.getRawY();
break;
case MotionEvent.ACTION_MOVE:
if (isDraging) {
// 计算移动的距离dx,dy
int dx = (int) (event.getRawX() - lastX);
int dy = (int) (event.getRawY() - lastY);
// 计算上下左右位置
int l = v.getLeft() + dx;
int t = v.getTop() + dy;
int r = v.getRight() + dx;
int b = v.getBottom() + dy;
// 判断超出屏幕
if (l < 0) {
l = 0;
r = l + v.getWidth();
}
if (t < 0) {
t = 0;
b = t + v.getHeight();
}
if (r > screenWidth) {
r = screenWidth;
l = r - v.getWidth();
}
if (b > screenHeight) {
b = screenHeight;
t = b - v.getHeight();
}
// 设置参数,并异步刷新
v.layout(l, t, r, b);
v.postInvalidate();
// 更新坐标
lastX = event.getRawX();
lastY = event.getRawY();
}
break;
case MotionEvent.ACTION_UP:
isDraging = false;
break;
default:
break;
}
return false;
}
});
}
}
2. xml文件
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<Button
android:id="@+id/bt_drag"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/hello_world" />
</LinearLayout>