android 悬浮球 (所有界面可用) 开发
16lz
2022-03-19
创建 service 后台启动
public class FBService extends Service { private static final String TAG = "FBService"; public static final int TYPE_ADD = 0; public static final int TYPE_DEL = 1; private FloatBallManager mFBManager; @Override public void onCreate() { super.onCreate(); Log.d(TAG,"onCreate"); mFBManager = FloatBallManager.getInstance(this); } private void showFloatBall() { Log.d(TAG,"showFloatBall"); mFBManager.addBallView(); //通过mFBManager 在windowmanager添加view } @Override public int onStartCommand(Intent intent, int flags, int startId) { Log.d(TAG,"onStartCommand");showFloatBall(intent); showFloatBall(); return super.onStartCommand(intent, flags, startId); } @Override public IBinder onBind(Intent intent) { return null; } @Override public void onDestroy() { super.onDestroy(); Log.d(TAG,"onDestroy"); }}
通过FloatBallManager 在windowmanager 加载 悬浮球布局
public class FloatBallManager { private static final String TAG = "FloatBallManager"; private FloatBallManager(Context ctx){ mCtx = ctx; mWindowManager = (WindowManager) mCtx.getSystemService(Context.WINDOW_SERVICE); //获取WindowManager } public static FloatBallManager getInstance(Context ctx){ if(instance == null){ synchronized(FloatBallManager.class){ if(instance == null){ instance = new FloatBallManager(ctx); } } } return instance; } public void addBallView() { if (mFloatBallView == null) { //获取 整个手机的宽度和高度 DisplayMetrics dm = new DisplayMetrics(); mWindowManager.getDefaultDisplay().getMetrics(dm); mScreenWidth = dm.widthPixels; mScreenHeight = dm.heightPixels; //填充悬浮球 布局 mFBWindow = LayoutInflater.from(mCtx).inflate(R.layout.float_ball, null); mFloatBallView = mFBWindow.findViewById(R.id.float_ball); mFBParams = new LayoutParams(); //设置悬浮球布局的参数 mFBParams.x = mScreenWidth-mFloatBallView.getWidth(); mFBParams.y = mScreenHeight / 2; mFBParams.width = WindowManager.LayoutParams.WRAP_CONTENT; mFBParams.height = WindowManager.LayoutParams.WRAP_CONTENT; mFBParams.gravity = Gravity.LEFT | Gravity.TOP; mFBParams.type = LayoutParams.TYPE_SYSTEM_ALERT | LayoutParams.TYPE_SYSTEM_OVERLAY;//顶层的View ,就要用这两个type mFBParams.format = PixelFormat.TRANSLUCENT;//半透明 mFBParams.flags = LayoutParams.FLAG_NOT_TOUCH_MODAL | LayoutParams.FLAG_NOT_FOCUSABLE;//设置没有焦点不能touch,这样其他的界面才可以滑动和操作 mWindowManager.addView(mFBWindow, mFBParams); //将View 按照mFBParams参数设置,添加到mWindowManager ,mFBParams是告诉mFBWindow 的父view } } //这个方法用来拖动时使用,更新位置 public void updateBallView(int deltaX,int deltaY) { mFBParams.x += deltaX; mFBParams.y += deltaY; if (mWindowManager != null) {// Log.d(TAG,"updateBallView mParams.x = "+mFBParams.x+" mParams.y = "+mFBParams.y); mWindowManager.updateViewLayout(mFBWindow, mFBParams); } }}
悬浮球布局
<?xml version="1.0" encoding="utf-8"?>"http://schemas.android.com/apk/res/android" android:id="@+id/fl_button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="@android:color/transparent" android:orientation="vertical"> "@+id/img_bg" android:layout_width="wrap_content" android:layout_height="wrap_content" android:scaleX="0.7" android:scaleY="0.7" android:background="@drawable/icon_bg" android:layout_gravity="center"/> "@+id/img_ball" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:alpha="0.5" android:scaleX="0.7" android:scaleY="0.7" android:background="@drawable/icon_ball"/> "@+id/img_big_ball" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:scaleX="0.7" android:scaleY="0.7" android:background="@drawable/icon_big_ball" android:visibility="invisible" /> "@+id/tv_switch" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:text="@string/switch_off"/>
以上一个悬浮球 就可以显示了,但是不能操作
完整代码
更多相关文章
- Android(安卓)ListView异步加载网络图片
- [置顶] Android(安卓)Studio 配置
- android中异步加载图片信息
- 检查Android进程当前是否正在后台运行
- android 加载 网络图片
- Android判断应用程序从后台回到前台
- Android(安卓)使用IPC和后台Service通信
- android加载进度条
- android ImageLoader加载本地图片的工具类