上一篇文章已经上过图了,这里就不上图了。
布局文件:
public class MainActivity extends Activity {
private ViewGroup root;
private TextView tv;
private Button bt;
private boolean isEditMode;
private int startX;
private int startY;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_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;
// 重新对控件的位置进行设置
RelativeLayout.LayoutParams params = (LayoutParams) v
.getLayoutParams();
params.leftMargin += dx;
params.topMargin += dy;
params.rightMargin = -250;
params.bottomMargin = -250;
v.setLayoutParams(params);
// 本次移动的结尾作为下一次移动的开始
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();
}
});
}
}
这里解释一下第57行的rightMargin为什么要设置成-250?其实我也不太清除,但是如果没有对rightMargin进行设置的话,当TextView移动到屏幕的边缘时,会出现下面这种现象:
而我们希望出现的是这种现象: