进入商显行业半年,看过每一家商显会议系统的侧拉菜单几乎都如出一辙,但是发现友商的似乎可以实现上下移动,所以这边也给自己的侧边栏实现上下自由移动功能,效果如图
实现关键代码:
给想实现的控件设置onTouch事件
this.setOnTouchListener(new View.OnTouchListener(){
float lastY;
@Override
public boolean onTouch(View view, MotionEvent event) {
float y = event.getRawY();
switch (event.getAction()){
case MotionEvent.ACTION_DOWN:
lastY = y; //记录按下时的Y坐标
break;
case MotionEvent.ACTION_MOVE:
//获取移动后的坐标
int dy = (int) (y - lastY);//记录总共移动的坐标
Log.i("gyx","dy="+dy);
FloatWindowManager.updateMenuLeftParams(mContext,dy);//实时更新窗口位置
FloatWindowManager.updateMenuParams(mContext,dy);
break;
case MotionEvent.ACTION_UP:
Log.e("gyx", "抬起了");
FloatWindowManager.updateDy(); //记录抬起时控件的Y坐标
break;
}
return true;
}
});
private static void initMenuLeftParams(Context context, int screenWidth, int screenHeight) {
if (menuParamsLeft == null) {
menuParamsLeft = new LayoutParams();
menuParamsLeft.x = 0;
// 默认位置
int defaultY = 294;
menuParamsLeft.y = (int) SPUtil.getData(context, DrawConsts.LAST_POINT_Y_KEY, defaultY);
updateDy(); //初始化窗口的时候记录默认的Y坐标
menuParamsLeft.type = LayoutParams.TYPE_PHONE;
// 所有其它程序是可点击的,悬浮窗不获取焦点
menuParamsLeft.flags = LayoutParams.FLAG_NOT_TOUCH_MODAL
| LayoutParams.FLAG_NOT_FOCUSABLE;
menuParamsLeft.format = PixelFormat.RGBA_8888;
menuParamsLeft.gravity = Gravity.LEFT | Gravity.TOP;
menuParamsLeft.width = ControlMenuLayout.viewWidth;
menuParamsLeft.height = ControlMenuLayout.viewHeight;
}
}
static int lastY;
static public void updateDy() {
lastY = menuParamsLeft.y;
}
public static void updateMenuLeftParams(Context context, int y) {
if (menuParamsLeft != null) {
// 默认位置
menuParamsLeft.y = lastY + y;
getWindowManager(context).updateViewLayout(menuWindowLeft, menuParamsLeft);
}
}
代码很简单,有不懂的朋友评论回复哦。