android浮标制作
浮标项目 浮标特性
- 触摸浮标移动特性
- 点击浮标展开特性
- 3s内无操作,浮标自动掩藏在两侧(由于浮标只用了一张图片,所以两侧掩藏时只是靠边了)
文章图片
demo 实现原理 创建浮标
- 获取WindowManager系统服务
- 设置浮标显示的参数WindowManager.LayoutParams
- 获取浮标布局并添加到WindowManager里面去
- 代码示例:
mMansger = (WindowManager)context.getApplicationContext().getSystemService(Activity.WINDOW_SERVICE);
mParams = new WindowManager.LayoutParams();
screen_widht = mMansger.getDefaultDisplay().getWidth();
screen_height = mMansger.getDefaultDisplay().getHeight();
mParams.format = PixelFormat.RGBA_8888;
//图片格式为透明
mParams.type = WindowManager.LayoutParams.TYPE_PHONE;
//处于所有应用顶端,状态栏之下
mParams.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
//不获取焦点
mParams.gravity = Gravity.LEFT | Gravity.TOP;
//左上对齐
mParams.x = float_x;
mParams.y = float_y;
//相对于上面的原点
mParams.width = LayoutParams.WRAP_CONTENT;
mParams.height = LayoutParams.WRAP_CONTENT;
mFloatLayout = (LinearLayout)LayoutInflater.from(context).inflate(R.layout.float_window, null);
mMansger.addView(mFloatLayout, mParams);
触摸移动
设置浮标移动监听OnTuchListener,监听工作:
- 获取当前触摸位置,并将此位置更新至布局updateViewLayout
- 代码示例:
floatImage.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
isMove = true;
if(event.getAction() == MotionEvent.ACTION_DOWN){return false;
}//滑动操作
if(mFloatLayout != null){
float_x = (int)event.getRawX();
float_y = (int)event.getRawY();
int width = mFloatLayout.getWidth();
int height = mFloatLayout.getHeight();
if(float_x + width > screen_widht){
float_x = screen_height - width;
}if(float_y + height > screen_height){
float_y = screen_height - height;
}//作画默认是从view的左上角画,导致在移动过程中摸不着view所以要向上和左位置前移就能摸到了
mParams.x = (float_x - width/2) > 0 ? float_x - width/2 : 0;
mParams.y = (float_y - height/2) > 0 ? float_y - height/2 : 0;
mMansger.updateViewLayout(mFloatLayout, mParams);
}/**
* 抬起默认滑动结束
*/
if(event.getAction() == MotionEvent.ACTION_UP){
isMove = false;
task_restore.postDelayed(retoreFloatView, 3000);
//3s内无操作进行隐藏工作
}return false;
}
});
点击监听
- 点击就是setOnclickListener,这个很简单就不进行说明了
- 原理:
利用Handler延时操作执行浮标掩藏工作,其原理就是在滑动时抬起动作和点击事件后,执行掩藏,刷新的最后一步判断浮标是否还有操作,有操作就不掩藏了,反之则掩藏 - 代码示例:
private Runnable retoreFloatView = new Runnable() {
@Override
public void run() {account_left.setVisibility(View.GONE);
account_right.setVisibility(View.GONE);
if(float_x > screen_widht / 2){
floatImage.setImageDrawable(mContext.getDrawable(R.drawable.xy_icon));
//设置右边浮标icon
float_x = screen_widht - mFloatLayout.getWidth();
}else{
floatImage.setImageDrawable(mContext.getDrawable(R.drawable.xy_icon));
float_x = 0;
}
mParams.x = float_x;
if(isMove){
return;
}
mMansger.updateViewLayout(mFloatLayout, mParams);
}
};
使用方法
- clone工程至本地
- import as moudle
- 调用FloatUtil类即可使用
FloatUtil.getInstance().createFloatView(this);
FloatUtil.getInstance().removeFloatView();
github项目链接: 【android浮标制作】["Click here点击这里"](https://github.com/JackZhous/FloatView
推荐阅读
- android第三方框架(五)ButterKnife
- Android中的AES加密-下
- 带有Hilt的Android上的依赖注入
- android|android studio中ndk的使用
- Android事件传递源码分析
- RxJava|RxJava 在Android项目中的使用(一)
- Android7.0|Android7.0 第三方应用无法访问私有库
- 深入理解|深入理解 Android 9.0 Crash 机制(二)
- android防止连续点击的简单实现(kotlin)
- Android|Android install 多个设备时指定设备