需求
在日常开发中,我们可能需要实现全局悬浮窗的需求:
- 点击悬浮窗图标可以跳转到一个固定的 Activity A;
- 用户在 app 内的任一 Activity 里都能看到悬浮窗(除了 Activity A)
- 悬浮窗可以关闭,可以拖动,拖动过程中松手可以自动吸附到屏幕边缘。
FloatWindow 特性
-
支持拖动,提供自动贴边等动画
-
内部自动进行权限申请操作
-
可自由指定要显示悬浮窗的界面
-
应用退到后台时,悬浮窗会自动隐藏
-
除小米外,4.4~7.0 无需权限申请
-
位置及宽高可设置百分比值,轻松适配各分辨率
-
支持权限申请结果、位置等状态监听
-
链式调用,简洁清爽
使用
1. 声明权限
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
2. 添加依赖
- 在工程的 build.gradle 中添加:
allprojects {
repositories {
...
maven { url 'https://jitpack.io' }
}
}
- 在应用的 build.gradle 中添加:
dependencies {
implementation 'com.github.yhaolpz:FloatWindow:1.0.9'
}
3. 基础使用
FloatWindow
.with(getApplicationContext())
.setView(view)
.setWidth(100) //设置控件宽高
.setHeight(Screen.width,0.2f)
.setX(100) //设置控件初始位置
.setY(Screen.height,0.3f)
.setDesktopShow(true) //桌面显示
.setViewStateListener(mViewStateListener) //监听悬浮控件状态改变
.setPermissionListener(mPermissionListener) //监听权限申请结果
.build();
宽高及位置可设像素值或屏幕宽/高百分比,默认宽高为 wrap_content;默认位置为屏幕左上角,x、y 为偏移量。
4. 指定界面显示
.setFilter(true, A_Activity.class, C_Activity.class)
此方法表示 A_Activity、C_Activity 显示悬浮窗,其他界面隐藏。
.setFilter(false, B_Activity.class)
此方法表示 B_Activity 隐藏悬浮窗,其他界面显示。
注意:setFilter 方法参数可以识别该 Activity 的子类
5. 可拖动悬浮窗及回弹动画
.setMoveType(MoveType.slide)
.setMoveStyle(500, new AccelerateInterpolator()) //贴边动画时长为500ms,加速插值器
共提供 4 种 MoveType :
-
MoveType.slide : 可拖动,释放后自动贴边 (默认)
-
MoveType.back : 可拖动,释放后自动回到原位置
-
MoveType.active : 可拖动文章来源:https://www.toymoban.com/news/detail-616882.html
-
MoveType.inactive : 不可拖动文章来源地址https://www.toymoban.com/news/detail-616882.html
6. 后续操作
//手动控制
FloatWindow.get().show();
FloatWindow.get().hide();
//修改显示位置
FloatWindow.get().updateX(100);
FloatWindow.get().updateY(100);
//销毁
FloatWindow.destroy();
实例
1. 逻辑代码
public class MyAPP extends Application {
private static final String TAG = "FloatWindow";
@Override
public void onCreate() {
super.onCreate();
ImageView imageView = new ImageView(getApplicationContext());
imageView.setImageResource(R.drawable.icon);
FloatWindow
.with(getApplicationContext())
.setView(imageView)
.setWidth(Screen.width, 0.2f) //设置悬浮控件宽高
.setHeight(Screen.width, 0.2f)
.setX(Screen.width, 0.8f)
.setY(Screen.height, 0.3f)
.setMoveType(MoveType.slide,100,-100)
.setMoveStyle(500, new BounceInterpolator())
.setFilter(true, A_Activity.class, C_Activity.class)
.setViewStateListener(mViewStateListener)
.setPermissionListener(mPermissionListener)
.setDesktopShow(true)
.build();
imageView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(BaseApplication.this, "onClick", Toast.LENGTH_SHORT).show();
}
});
}
private PermissionListener mPermissionListener = new PermissionListener() {
@Override
public void onSuccess() {
Log.d(TAG, "onSuccess");
}
@Override
public void onFail() {
Log.d(TAG, "onFail");
}
};
private ViewStateListener mViewStateListener = new ViewStateListener() {
@Override
public void onPositionUpdate(int x, int y) {
Log.d(TAG, "onPositionUpdate: x=" + x + " y=" + y);
}
@Override
public void onShow() {
Log.d(TAG, "onShow");
}
@Override
public void onHide() {
Log.d(TAG, "onHide");
}
@Override
public void onDismiss() {
Log.d(TAG, "onDismiss");
}
@Override
public void onMoveAnimStart() {
Log.d(TAG, "onMoveAnimStart");
}
@Override
public void onMoveAnimEnd() {
Log.d(TAG, "onMoveAnimEnd");
}
@Override
public void onBackToDesktop() {
Log.d(TAG, "onBackToDesktop");
}
};
}
到了这里,关于【Android -- 开源库】推荐一个全局悬浮窗的框架(FloatWindow)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!