模仿苹果虚拟悬浮按钮(自动靠边、可浮现任何界面上)
生活随笔
收集整理的這篇文章主要介紹了
模仿苹果虚拟悬浮按钮(自动靠边、可浮现任何界面上)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
? 由于最近小蔡的手機音量鍵壞了,調節音量有點麻煩,突發奇想,想自己實現一個快捷鍵來調節音量,總結出一般本章,分享給大家。
首先 按鈕要想實現懸浮在任何界面,那么必須是要寫在服務里面的,使用定時器,2.5s不觸摸后,背景變淡
下載地址
?
清單文件中加權限
?
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />?
?
public class FloatViewService extends Service {private static final String TAG = "FloatViewService";// 定義浮動窗口布局private LinearLayout mFloatLayout;private WindowManager.LayoutParams wmParams;// 創建浮動窗口設置布局參數的對象private WindowManager mWindowManager;private ImageButton mFloatView;private int screenHeight;private int screenWidth;private MyCountDownTimer myCountDownTimer;@Overridepublic void onCreate() {super.onCreate();Log.i(TAG, "onCreate");screenHeight = ScreenParam.getInstance().height;//自己寫的工具類用來獲取屏幕寬高。screenWidth = ScreenParam.getInstance().width;createFloatView();myCountDownTimer = new MyCountDownTimer(2500, 1000); //設置計時2.5smyCountDownTimer.start();}@SuppressWarnings("static-access")@SuppressLint("InflateParams")private void createFloatView() {wmParams = new WindowManager.LayoutParams();// 通過getApplication獲取的是WindowManagerImpl.CompatModeWrappermWindowManager = (WindowManager) getApplication().getSystemService(getApplication().WINDOW_SERVICE);// 設置window typewmParams.type = LayoutParams.TYPE_PHONE;// 設置圖片格式,效果為背景透明wmParams.format = PixelFormat.RGBA_8888;// 設置浮動窗口不可聚焦(實現操作除浮動窗口外的其他可見窗口的操作)wmParams.flags = LayoutParams.FLAG_NOT_FOCUSABLE;// 調整懸浮窗顯示的停靠位置為右側底部wmParams.gravity = Gravity.RIGHT | Gravity.BOTTOM;// 以屏幕左上角為原點,設置x、y初始值,相對于gravitywmParams.x = 0;wmParams.y = 150;// 設置懸浮窗口長寬數據wmParams.width = WindowManager.LayoutParams.WRAP_CONTENT;wmParams.height = WindowManager.LayoutParams.WRAP_CONTENT;LayoutInflater inflater = LayoutInflater.from(getApplication());// 獲取浮動窗口視圖所在布局mFloatLayout = (LinearLayout) inflater.inflate(R.layout.alert_window_menu, null);// 添加mFloatLayoutmWindowManager.addView(mFloatLayout, wmParams);// 浮動窗口按鈕mFloatView = (ImageButton) mFloatLayout.findViewById(R.id.alert_window_imagebtn);mFloatLayout.measure(View.MeasureSpec.makeMeasureSpec(0,View.MeasureSpec.UNSPECIFIED), View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED));// 設置監聽浮動窗口的觸摸移動mFloatView.setOnTouchListener(new OnTouchListener() {boolean isClick;private int leftDistance;private float rawX;private float rawY;@SuppressLint("ClickableViewAccessibility")@Overridepublic boolean onTouch(View v, MotionEvent event) {switch (event.getAction()) {case MotionEvent.ACTION_DOWN:mFloatLayout.setAlpha(1.0f);myCountDownTimer.cancel();取消計時rawX = event.getRawX();rawY = event.getRawY();break;case MotionEvent.ACTION_MOVE:// getRawX是觸摸位置相對于屏幕的坐標,getX是相對于按鈕的坐標int distanceX = (int) (event.getRawX()-rawX);int distanceY = (int) (event.getRawY()-rawY);leftDistance = (int) event.getRawX()+ mFloatView.getMeasuredWidth() / 2;wmParams.x = wmParams.x-distanceX;wmParams.y = wmParams.y-distanceY;// 刷新mWindowManager.updateViewLayout(mFloatLayout, wmParams);rawX = event.getRawX();rawY = event.getRawY();break;case MotionEvent.ACTION_UP:myCountDownTimer.start();重新開始計時if(wmParams.x>leftDistance){wmParams.x = screenWidth-mFloatView.getMeasuredWidth() / 2;}else{wmParams.x = 0;}mWindowManager.updateViewLayout(mFloatLayout, wmParams);break;}return false;}});mFloatView.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {AudioManager audioManager = (AudioManager) getSystemService(Service.AUDIO_SERVICE);audioManager.setStreamVolume(AudioManager.STREAM_MUSIC,audioManager.getStreamVolume(AudioManager.STREAM_MUSIC), AudioManager.FLAG_SHOW_UI); // Toast.makeText(FloatViewService.this, "hello!", // Toast.LENGTH_SHORT).show();}});}@Overridepublic void onDestroy() {super.onDestroy();if (mFloatLayout != null) {// 移除懸浮窗口mWindowManager.removeView(mFloatLayout);}}@Overridepublic IBinder onBind(Intent intent) {return null;}public class MyCountDownTimer extends CountDownTimer {public MyCountDownTimer(long millisInFuture, long countDownInterval) {super(millisInFuture, countDownInterval);}@Overridepublic void onTick(long millisUntilFinished) {}@Overridepublic void onFinish() {mFloatLayout.setAlpha(0.4f);}}}?
?
然后再Activity里啟動服務就好了
?
protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);ScreenParam.getInstance().init(this);}@Overrideprotected void onStart() {// TODO Auto-generated method stubIntent intent = new Intent(MainActivity.this, FloatViewService.class); //啟動FloatViewService startService(intent); super.onStart();}
如果不想顯示Activity界面的話,可以在配置這個屬性就ok了
android:theme="@android:style/Theme.NoDisplay"
就是這么簡單!
總結
以上是生活随笔為你收集整理的模仿苹果虚拟悬浮按钮(自动靠边、可浮现任何界面上)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【计算方法】非线性方程和优化
- 下一篇: 苹果手机悬浮窗怎么打开_悬浮窗搜题神器_