Android 实现view随意拖动
2017-11-23 本文已影响685人
YuGoal
需求
项目中使用到了视频直播,需要悬浮一个200*200的view在界面上,并且需要可拖动。
思路
- 使用帧布局来悬浮view;
- OnTouch来拖动改变view的位置;
实现
mRlayout 为父布局
private int lastX, lastY;
liveView.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
lastX = (int) event.getRawX();
lastY = (int) event.getRawY();
break;
case MotionEvent.ACTION_MOVE:
int dx = (int) event.getRawX() - lastX;
int dy = (int) event.getRawY() - lastY;
FrameLayout.LayoutParams layoutParams = (FrameLayout.LayoutParams) v.getLayoutParams();
int l =layoutParams.leftMargin + dx;
int t = layoutParams.topMargin + dy;
int b =mRlayout.getHeight()- t-v.getHeight();
int r =mRlayout.getWidth()- l-v.getWidth();
if (l < 0) {//处理按钮被移动到上下左右四个边缘时的情况,决定着按钮不会被移动到屏幕外边去
l = 0;
r =mRlayout.getWidth()-v.getWidth();
}
if (t < 0) {
t = 0;
b = mRlayout.getHeight()-v.getHeight();
}
if (r<0) {
r =0;
l = mRlayout.getWidth()-v.getWidth();
}
if (b<0) {
b = 0;
t = mRlayout.getHeight()-v.getHeight();
}
layoutParams.leftMargin = l;
layoutParams.topMargin = t;
layoutParams.bottomMargin = b;
layoutParams.rightMargin = r;
v.setLayoutParams(layoutParams);
lastX = (int) event.getRawX();
lastY = (int) event.getRawY();
v.postInvalidate();
break;
case MotionEvent.ACTION_UP:
break;
}
return true;
}
});
注意
这里是在view移动时通过setLayoutParams改变view位置,是为了避免更改页面的其它view时导致该view复位,因为更改页面view时会触发父布局重绘,使用layout时父布局并不知道子view的位置比发生了改变,这样就会使view复位。但是使用setLayoutParams时,父布局知道子布局发生了改变,就解决了子布局复位的问题。