之前 看过跟多App在页面中都有一个浮动的按钮,可以随意的在屏幕中拖动 释放后自动贴在屏幕边缘,这个效果其实很简单 就是onTouchEvent事件,在事件中分别处理Down,move,up事件即可。
先看效果图:
为了防止浮动按钮超出屏幕,还需要和屏幕宽高进行实时比对,以下方法是获取屏幕的宽高:
WindowManager wm = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE);
mWidth = wm.getDefaultDisplay().getWidth();
mHeight = wm.getDefaultDisplay().getHeight();
在复写view的onTouchEvent事件
@Override
public boolean onTouchEvent(MotionEvent event) {int x = (int) event.getX();
int y = (int) event.getY();
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
lastX = (int) event.getX();
lastY = (int) event.getY();
break;
case MotionEvent.ACTION_MOVE:
mParams = (LinearLayout.LayoutParams) getLayoutParams();
offsetX = getLeft() + x - lastX;
offsetY = getTop() + y - lastY;
if (offsetX <= 0) {
offsetX = 0;
}if (offsetX + DensityUtil.dip2px(mContext, getDpValue()) >= mWidth) {
offsetX = mWidth - DensityUtil.dip2px(mContext, getDpValue());
}if (offsetY <= 0) {
offsetY = 0;
}if (offsetY + DensityUtil.dip2px(mContext, getDpValue() + 25) >= mHeight) { //25是状态栏的高度
offsetY = mHeight - DensityUtil.dip2px(mContext, getDpValue() + 25);
}mParams.leftMargin = offsetX;
mParams.topMargin = offsetY;
setLayoutParams(mParams);
break;
case MotionEvent.ACTION_UP:if (offsetX > mWidth / 2) {
mParams.leftMargin = mWidth - DensityUtil.dip2px(mContext, getDpValue());
} else {
mParams.leftMargin = 0;
}
mParams.topMargin = offsetY;
setLayoutParams(mParams);
break;
}return true;
}private int getDpValue() {
return 50;
//布局的宽高大小
}
【View视图跟随手指移动】
以上便是浮动按钮跟随手指滑动的全部逻辑代码
使用:
我是源码
文章图片