一、功能需求
最近遇到一个需求,一下把我愣住了,在IPTV电视系统上实现一个全局跑马灯广告效果,简单说就是后台定时或手动推送广告文字,电视端要能实时显示,要求是无论当前打开的是第三方的软件还是网页等,都要及时显示滚动文字,并要求不影响系统的正常操作。
二、采坑记录
拿到需求后管他三七二十一,撸起袖子就是干,一开始想的是用Dialog来实现,反正桌面都是自己的,直接跳过进程保活,当收到后台推送后强行加载Dialog即可。
此处跳过一万个mmp后决定用WindowManager来实现,直接调整window的层级范围为系统window不就可以了。
三、希望的曙光
重点了重点了重点了,应用window的层级范围:1-99,子window的层级范围:1000-1999,系统window的层级范围:2000-2999。
设置window层级
WindowManager.LayoutParams.TYPE_SYSTEM_ERROR;
加载悬浮窗
WindowManager mWindowManager = (WindowManager) getApplicationContext().getSystemService(Context.WINDOW_SERVICE);
mImageView = new ImageView(this);
mImageView.setBackgroundResource(R.mipmap.ic_launcher);
WindowManager.LayoutParams mLayoutParams = new WindowManager.LayoutParams(
WindowManager.LayoutParams.WRAP_CONTENT, WindowManager.LayoutParams.WRAP_CONTENT, 2099,
WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL
| WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
| WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED,
PixelFormat.TRANSPARENT);
mLayoutParams.type = WindowManager.LayoutParams.TYPE_SYSTEM_ERROR;
mLayoutParams.gravity = Gravity.TOP | Gravity.LEFT;
mLayoutParams.x = 0;
mLayoutParams.y = 300;
mImageView.setOnTouchListener(this);
mWindowManager.addView(mImageView, mLayoutParams);
悬浮窗权限
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
四、完整代码
WindowManager mWindowManager = (WindowManager) context
.getSystemService(Context.WINDOW_SERVICE);
WindowManager.LayoutParams param = new WindowManager.LayoutParams();
param = new LayoutParams();
param.type = WindowManager.LayoutParams.TYPE_SYSTEM_ERROR;
param.format = PixelFormat.RGBA_8888;
param.flags = LayoutParams.FLAG_NOT_TOUCH_MODAL
| LayoutParams.FLAG_NOT_FOCUSABLE
| LayoutParams.FLAG_FULLSCREEN
| LayoutParams.FLAG_LAYOUT_IN_SCREEN;
// 调整悬浮窗口至左上角
param.gravity = Gravity.CENTER | Gravity.TOP;
param.x = 0;
param.y = 0;
// 设置悬浮窗口长宽数据
param.width = LayoutParams.MATCH_PARENT;
param.height = 70;
mWindowManager.addView(view(你自己的view), param);
其实并不难、是你太悲观,想要跑马灯代码的朋友记得下边留言我发给你哈。
版权声明:本文为qq_35350654原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。