先上图:
布局文件:
核心代码:
public class MoveDemoActivity extends Activity {
private TextView tv;
private Button bt;
private boolean isEditMode;
private ViewGroup root;
private int startX;
private int startY;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
root = (ViewGroup) findViewById(R.id.root);
tv = (TextView) findViewById(R.id.tv);
bt = (Button) findViewById(R.id.bt);
bt.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if (isEditMode) {
bt.setText("点击模式");
} else {
bt.setText("编辑模式");
}
isEditMode = !isEditMode;
}
});
tv.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if (!isEditMode) {
return false;
}
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
// 获取手指按下的坐标
startX = (int) event.getRawX();
startY = (int) event.getRawY();
break;
case MotionEvent.ACTION_MOVE:
// 获取手指移动到了哪个点的坐标
int movingX = (int) event.getRawX();
int movingY = (int) event.getRawY();
// 相对于上一个点,手指在X和Y方向分别移动的距离
int dx = movingX - startX;
int dy = movingY - startY;
// 获取TextView上一次上 下 左 右各边与父控件的距离
int left = tv.getLeft();
int right = tv.getRight();
int top = tv.getTop();
int bottom = tv.getBottom();
// 设置本次TextView的上 下 左 右各边与父控件的距离
tv.layout(left + dx, top + dy, right + dx, bottom + dy);
// 本次移动的结尾作为下一次移动的开始
startX = (int) event.getRawX();
startY = (int) event.getRawY();
break;
case MotionEvent.ACTION_UP:
break;
}
root.invalidate();
return true;//如果返回true,从手指接触屏幕到手指离开屏幕,将不会触发点击事件。
}
});
tv.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(getApplicationContext(), "TextView Click", 0)
.show();
}
});
}
}
版权声明:本文为liu537192原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。