Android开发实战:悬浮窗高级技巧大揭秘
创作时间:
作者:
@小白创作中心
Android开发实战:悬浮窗高级技巧大揭秘
引用
CSDN
等
11
来源
1.
https://blog.csdn.net/m0_64561613/article/details/139056707
2.
https://blog.csdn.net/CJohn1994/article/details/119917581
3.
https://blog.csdn.net/xingchenxuanfeng/article/details/128626109
4.
https://blog.csdn.net/gitblog_00044/article/details/138701370
5.
https://www.sohu.com/a/846046801_121798711
6.
https://blog.csdn.net/qq_43358469/article/details/139964948
7.
https://blog.csdn.net/2401_84102689/article/details/137360364
8.
https://developer.aliyun.com/article/1604808
9.
https://cloud.tencent.com/developer/article/2449651
10.
https://juejin.cn/post/7462956526711472138
11.
https://www.cnblogs.com/xqxacm/p/18535258
在Android开发中,悬浮窗功能可以显著提升用户体验。本文将从基础实现到高级技巧,再到实战案例,全面解析Android悬浮窗的开发要点。
01
基础篇:悬浮窗基本实现原理
悬浮窗的实现主要依赖于两个核心组件:Service和WindowManager。
1. 创建悬浮窗服务
首先需要创建一个Service类,用于后台运行悬浮窗逻辑。在Service的onCreate()方法中,初始化WindowManager并加载悬浮窗布局。
public class FloatingWindowService extends Service {
private WindowManager windowManager;
private View floatingView;
@Override
public void onCreate() {
super.onCreate();
windowManager = (WindowManager) getSystemService(WINDOW_SERVICE);
floatingView = LayoutInflater.from(this).inflate(R.layout.floating_window, null);
final WindowManager.LayoutParams params = new WindowManager.LayoutParams(
70, // 宽
70, // 高
Build.VERSION.SDK_INT >= Build.VERSION_CODES.O ?
WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY :
WindowManager.LayoutParams.TYPE_PHONE,
WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
PixelFormat.TRANSLUCENT
);
params.gravity = Gravity.TOP | Gravity.START;
params.x = 0;
params.y = 100;
windowManager.addView(floatingView, params);
}
}
2. 请求悬浮窗权限
由于悬浮窗涉及系统级操作,需要在AndroidManifest.xml中声明权限:
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
并在代码中检查和申请权限:
if (!Settings.canDrawOverlays(this)) {
Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION,
Uri.parse("package:" + getPackageName()));
startActivityForResult(intent, REQUEST_CODE);
}
02
进阶篇:高级技巧分享
1. 多语言环境下的悬浮窗适配
当系统语言切换时,悬浮窗的布局和文本需要相应更新。可以通过监听ACTION_LOCALE_CHANGED广播来实现:
private BroadcastReceiver mLocaleBroadcastReceiver;
private void registerLocaleReceiver() {
if (mLocaleBroadcastReceiver == null) {
mLocaleBroadcastReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
mTvWindowTitle.setText(mContext.getString(R.string.window_title));
}
};
IntentFilter filter = new IntentFilter(Intent.ACTION_LOCALE_CHANGED);
mContext.registerReceiver(mLocaleBroadcastReceiver, filter);
}
}
同时需要注意文本方向和图片翻转问题,特别是对于从右到左书写的语言(如阿拉伯语):
mLayoutWindow.setLayoutDirection(isRtl() ? View.LAYOUT_DIRECTION_RTL : View.LAYOUT_DIRECTION_LTR);
mTvWindowTitle.setTextDirection(isRtl() ? View.TEXT_DIRECTION_RTL : View.TEXT_DIRECTION_LTR);
2. 实现流畅的拖动功能
拖动功能是悬浮窗的重要特性。关键在于正确处理触摸事件,使用getRawX()和getRawY()获取屏幕坐标:
binding.root.setOnTouchListener(new View.OnTouchListener() {
float xDown, yDown;
float interactorTranslationXWhenDown, interactorTranslationYWhenDown;
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
xDown = event.getRawX();
yDown = event.getRawY();
interactorTranslationXWhenDown = interactorTranslationX;
interactorTranslationYWhenDown = interactorTranslationY;
break;
case MotionEvent.ACTION_MOVE:
float dx = event.getRawX() - xDown;
float dy = event.getRawY() - yDown;
interactorTranslationX = interactorTranslationXWhenDown + dx;
interactorTranslationY = interactorTranslationYWhenDown + dy;
updateTranslation();
break;
}
return false;
}
});
03
实战篇:FloatWindow开源项目解析
FloatWindow是一个功能强大的悬浮窗库,支持拖动、动画、界面过滤等功能。其核心特点包括:
- 权限处理:自动处理4.4-7.0系统版本的权限申请
- 拖动动画:支持流畅的拖动和边缘吸附效果
- 界面过滤:可设定特定Activity显示或隐藏悬浮窗
- 百分比定位:支持屏幕宽度和高度的百分比定位
使用FloatWindow库可以大大简化悬浮窗的开发工作。以下是基本的集成步骤:
- 在build.gradle中添加依赖:
implementation 'com.github.yhaolpz:FloatWindow:1.0.0'
- 初始化并显示悬浮窗:
FloatWindow.with(this)
.setView(R.layout.floating_window)
.setWidth(70)
.setHeight(70)
.setX(0)
.setY(100)
.setFilterActivity(MainActivity.class)
.build()
.show();
FloatWindow库的源码地址:https://gitcode.com/gh_mirrors/fl/FloatWindow
04
注意事项
- 性能影响:悬浮窗会占用系统资源,建议在低配置设备上谨慎使用。
- 隐私保护:避免在悬浮窗中显示敏感信息,特别是在公共场合使用时。
- 用户体验:合理设置悬浮窗的位置和大小,避免遮挡重要界面元素。
通过本文的介绍,相信你已经掌握了Android悬浮窗开发的核心技巧。无论是实现简单的悬浮按钮,还是复杂的悬浮窗应用,都可以基于这些知识进行开发。希望这些内容能帮助你提升开发效率,为用户带来更好的使用体验。
热门推荐
如何制定有效的舆论舆情应对预案?
花可以用灯光照明吗?灯光对植物生长的影响全解析
股票的行业龙头地位是否稳固?如何判断行业龙头的竞争力?
一篇全!2025年英国高校申请变动汇总!
哈尔滨传统民俗文化大全 带你去冰雪大世界里看二人转 扭大秧歌
三相交流变频电源的优势
古希腊的典型服装:性别、阶级和功能
古希腊的典型服装:性别、阶级和功能
房子抵押需要夫妻到场吗
正史中的司马懿:忠诚与权谋的交织
电池容量的符号及计算方法详解
东北大米的种植技术在不断创新中取得了显著的进步
鹅蛋为何少见?营养价值大揭秘
2024年高含金量数学建模竞赛时间轴
新媒体内容的表现形式有哪些
吐的都是黄水什么原因
福建女子眼皮粘连,一看手机眼睛就“烧”得不行!医生紧急提醒
单位职工食堂承包注意事项
阿修罗:印度神话中半神半人的大力神,为佛教天龙八部之一
“酒店大王”破产清算,“悦榕庄”上百栋烂尾别墅7亿整体法拍
凝血四项检查详解:指标解读与临床应用
猫狗通用定位器:智能设计满足多样化宠物需求
创新型QC课题优秀案例的评审标准是什么?
C1驾照新政策:2项调整,车主必看
Win11最近更新音量键不能用?原因分析及解决方法详解
城镇居民如何申请建房手续
不胜任本职工作的员工沟通与反馈指南
桡骨远端骨折术后一个月应避免哪些行为
生产订单中的计划成本、目标成本和实际成本详解
10万级车8年养车成本对比:SUV VS 轿车,一探究竟