实现悬浮球的桌面显示

mac2022-12-09  28

实现悬浮球的桌面显示

本篇是Android实战之悬浮球菜单App实现的分支,做学习记录使用。 本篇介绍悬浮球的桌面显示部分,主要分为WindowManager部分,以及菜单的策略和显示位置的计算。

WindowManager

通过WindowManager来托管悬浮球view,首先初始化:

mWindowManager = (WindowManager) getSystemService(Context.WINDOW_SERVICE); wmParams = new WindowManager.LayoutParams(); wmParams.type = WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY; wmParams.format = PixelFormat.RGBA_8888; wmParams.width = WindowManager.LayoutParams.WRAP_CONTENT; wmParams.height = WindowManager.LayoutParams.WRAP_CONTENT; //这是我设置起始位置 wmParams.gravity = Gravity.LEFT | Gravity.TOP; wmParams.x = 1000; wmParams.y = 500; //托管悬浮球view mWindowManager.addView(mFloatingLayout, wmParams); //托管菜单view mWindowManager.addView(menu, wmParams);

再通过setOnTouchListener()对悬浮球做追踪,实现可拖动:

private class FloatingListener implements View.OnTouchListener { @Override public boolean onTouch(View v, MotionEvent event) { int action = event.getAction(); if (!isExpanded) { switch (action) { case MotionEvent.ACTION_DOWN: isMove = false; mTouchStartX = (int) event.getRawX(); mTouchStartY = (int) event.getRawY(); mStartX = (int) event.getX(); mStartY = (int) event.getY(); break; case MotionEvent.ACTION_MOVE: mTouchCurrentX = (int) event.getRawX(); mTouchCurrentY = (int) event.getRawY(); wmParams.x += mTouchCurrentX - mTouchStartX; wmParams.y += mTouchCurrentY - mTouchStartY; mWindowManager.updateViewLayout(menu, wmParams); mWindowManager.updateViewLayout(mFloatingLayout, wmParams); mTouchStartX = mTouchCurrentX; mTouchStartY = mTouchCurrentY; break; case MotionEvent.ACTION_UP: mStopX = (int) event.getX(); mStopY = (int) event.getY(); Log.d(TAG, "initWindow: " + wmParams.x + "" + wmParams.y); if (abs(mStartX - mStopX) >= 1 || abs(mStartY - mStopY) >= 1) { isMove = true; } attachSide(); break; } return isMove; } return false; } } public void attachSide(){ if(wmParams.x<550){ wmParams.x = 0; } else{ wmParams.x = 1000; } mWindowManager.updateViewLayout(menu,wmParams); mWindowManager.updateViewLayout(mFloatingLayout,wmParams); }

其中的attachSide()是实现的贴边函数,这里出现的像素数字替换成统一的参数比较好,方便后期管理和适配。做到这里,就实现了悬浮球在桌面显示,并且可以拖动和自动贴边。当然,别忘了申请权限:

startActivityForResult(new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION, Uri.parse("package:" + getPackageName())), 0); @override protected void onActivityResult(int requestCode, int resultCode, Intent data){ super.onActivityResult(request, resultCode, data); if(requestCode == 0){ if(!Settings.canDrawOverlays(this)){ Toast.makeTest(this, "FAILED", Toast.LENGTH_SHORT).show(); } else { Toast.makeTest(this, "SUCCEED", Toast.LENGTH_SHORT).show(); //startService } } }

在此处我采用的startActivityForResult来进行授权申请,成功授权后开启悬浮球服务,即可在窗口显示。

最新回复(0)