1. 加入浮窗
1.1 获取悬浮窗权限
在 Android 6.0 以上的系统中,需要获取悬浮窗权限才能创建悬浮窗。获取权限有两种方式:
代码获取:
可以在 Activity 的 onCreate() 中添加以下代码:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
? ?if (!Settings.canDrawOverlays(this)) {
? ? ? ?Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION);
? ? ? ?intent.setData(Uri.parse("package:" + getPackageName()));
? ? ? ?startActivity(intent);
? ?}
}
手动获取:
用户可以在应用设置的权限管理中,手动打开悬浮窗权限。
1.2 添加悬浮窗代码
悬浮窗的创建需要使用 WindowManager,可通过以下代码创建:
windowManager = (WindowManager) getSystemService(Context.WINDOW_SERVICE);
windowManagerParams = new WindowManager.LayoutParams();
windowManagerParams.type = WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY; // 悬浮窗类型,允许浮在应用之上
windowManagerParams.format = PixelFormat.RGBA_8888; // 悬浮窗颜色
windowManagerParams.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE; // 设置是否能够获取焦点
windowManagerParams.width = WindowManager.LayoutParams.WRAP_CONTENT; // 悬浮窗的宽度
windowManagerParams.height = WindowManager.LayoutParams.WRAP_CONTENT; // 悬浮窗的高度
windowManagerParams.gravity = Gravity.TOP | Gravity.LEFT; // 悬浮窗的位置
windowManagerParams.x = 0; // 悬浮窗x坐标
windowManagerParams.y = 0; // 悬浮窗y坐标
windowManager.addView(mFloatingView, mLayoutParams); // 添加悬浮窗
其中,mFloatingView 为悬浮窗视图,mLayoutParams 为悬浮窗布局参数。
2. 浮窗教程
2.1 实现浮窗拖拽
用户可以通过拖拽悬浮窗来改变它的位置。实现拖拽的方法如下:
1. 设置触摸事件:
mFloatingView.setOnTouchListener(new View.OnTouchListener() {
? ?@Override
? ?public boolean onTouch(View v, MotionEvent event) {
? ? ? ?// TODO 实现拖拽
? ? ? ?return false;
? ?}
});
2. 处理触摸事件:
int lastX, lastY;
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
lastX = (int) event.getRawX();
lastY = (int) event.getRawY();
break;
case MotionEvent.ACTION_MOVE:
int dx = (int) (event.getRawX() - lastX);
int dy = (int) (event.getRawY() - lastY);
mParams.x += dx;
mParams.y += dy;
windowManager.updateViewLayout(mFloatingView, mParams);
lastX = (int) event.getRawX();
lastY = (int) event.getRawY();
break;
default:
break;
}
return false;
}
代码中,使用两个变量记住触摸前的坐标,然后处理移动事件时计算移动距离,然后根据移动距离来更新悬浮窗。
2.2 实现浮窗关闭
用户可以通过关闭按钮来关闭悬浮窗。实现方法如下:
1. 添加关闭按钮:
在悬浮窗视图中,添加一个关闭按钮的布局:
? ?android:id="@+id/layout_close"
? ?android:layout_width="wrap_content"
? ?android:layout_height="wrap_content"
? ?android:layout_alignParentRight="true"
? ?android:layout_marginRight="15dp"
? ?android:layout_marginTop="15dp">
? ?
? ? ? ?android:id="@+id/image_close"
? ? ? ?android:layout_width="wrap_content"
? ? ? ?android:layout_height="wrap_content"
? ? ? ?android:src="@drawable/close"
? ? ? ?/>
2. 设置关闭按钮监听:
mCloseBtn = (ImageView) mFloatingView.findViewById(R.id.image_close);
mCloseBtn.setOnClickListener(new View.OnClickListener() {
? ?@Override
? ?public void onClick(View v) {
? ? ? ?windowManager.removeView(mFloatingView);
? ?}
});
其中,mCloseBtn 为关闭按钮。
2.3 实现浮窗弹出菜单
在悬浮窗中,可以弹出菜单。弹出菜单的实现方法如下:
1. 添加弹出菜单:
在悬浮窗视图中,添加一个弹出菜单的布局:
? ?android:layout_width="wrap_content"
? ?android:layout_height="wrap_content">
? ?
? ? ? ?android:id="@+id/image_menu"
? ? ? ?android:layout_width="wrap_content"
? ? ? ?android:layout_height="wrap_content"
? ? ? ?android:src="@drawable/menu"
? ? ? ?/>
? ?
? ? ? ?android:id="@+id/layout_menu"
? ? ? ?android:layout_width="150dp"
? ? ? ?android:layout_height="100dp"
? ? ? ?android:layout_marginTop="50dp"
? ? ? ?android:background="@android:color/white"
? ? ? ?android:visibility="gone">
? ? ? ?
? ? ? ? ? ?android:id="@+id/menu_item1"
? ? ? ? ? ?android:layout_width="wrap_content"
? ? ? ? ? ?android:layout_height="wrap_content"
? ? ? ? ? ?android:textColor="@android:color/black"
? ? ? ? ? ?android:text="菜单项1"/>
? ? ? ?
? ? ? ? ? ?android:id="@+id/menu_item2"
? ? ? ? ? ?android:layout_width="wrap_content"
? ? ? ? ? ?android:layout_height="wrap_content"
? ? ? ? ? ?android:textColor="@android:color/black"
? ? ? ? ? ?android:text="菜单项2"/>
? ? ? ?
? ? ? ? ? ?android:id="@+id/menu_item3"
? ? ? ? ? ?android:layout_width="wrap_content"
? ? ? ? ? ?android:layout_height="wrap_content"
? ? ? ? ? ?android:textColor="@android:color/black"
? ? ? ? ? ?android:text="菜单项3"/>
? ?
2. 设置菜单按钮监听:
mMenuBtn = (ImageView) mFloatingView.findViewById(R.id.image_menu);
mMenuBtn.setOnClickListener(new View.OnClickListener() {
? ?@Override
? ?public void onClick(View v) {
? ? ? ?if (mMenuView.getVisibility() == View.GONE) {
? ? ? ? ? ?mMenuView.setVisibility(View.VISIBLE);
? ? ? ?} else {
? ? ? ? ? ?mMenuView.setVisibility(View.GONE);
? ? ? ?}
? ?}
});
3. 设置菜单项监听:
mMenuItem1 = (TextView) mFloatingView.findViewById(R.id.menu_item1);
mMenuItem1.setOnClickListener(new View.OnClickListener() {
? ?@Override
? ?public void onClick(View v) {
? ? ? ?// TODO 处理菜单项1点击事件
? ?}
});
其中,mMenuBtn 为菜单按钮,mMenuItem1 为菜单项。
总结归纳
浮窗在移动应用中发挥着重要的作用,它可以提高应用的用户体验和便利性。添加浮窗功能的关键在于获取悬浮窗权限和实现悬浮窗拖拽、关闭和弹出菜单等功能。本篇文章简要介绍了添加浮窗和实现浮窗的教程,希望对开发者和对浮窗感兴趣的用户能有所帮助。