可移动悬浮球的实现
可移動(dòng)懸浮球的實(shí)現(xiàn)
近期看到魅族的懸浮球功能,初步研究了下,實(shí)現(xiàn)了基本的功能。
?
一、Window 和WindowManger 的概念
Window:一個(gè)抽象類,具體實(shí)現(xiàn)在PhoneWindow。表示一個(gè)窗口的概念,Android中所有的View都是通過(guò)Window來(lái)顯示的,Actvity/Dialog/Toast中的View都是附加在Window上的——Window是View的直接管理者。View的事件是由Window傳遞給DecorView,然后DecorView傳遞給View;setContentView的底層也是通過(guò)Window來(lái)完成
WindowManger:Window的管理者。有三大接口 Window添加——addView,Window刪除——removeView,Window更新——updateViewLayout
?
二、使用WindowManger添加一個(gè)Window來(lái)實(shí)現(xiàn)懸浮效果
private void setFloatingButton() {mFloatingBtn = new Button(this);mFloatingBtn.setText("Suspend");mLayoutParams = new WindowManager.LayoutParams(WindowManager.LayoutParams.WRAP_CONTENT,WindowManager.LayoutParams.WRAP_CONTENT,0,0,PixelFormat.TRANSPARENT);mLayoutParams.flags =//本區(qū)域內(nèi)的事件自己處理,本區(qū)域外的事件底層Window處理WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL//不獲取焦點(diǎn),也不接收輸入事件| WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE//可以顯示鎖屏界面| WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED;mLayoutParams.gravity = Gravity.LEFT | Gravity.TOP;mLayoutParams.x = 100;mLayoutParams.y = 300;//選用系統(tǒng)層級(jí)的Type,這樣Window會(huì)顯示在最頂層mLayoutParams.type = WindowManager.LayoutParams.TYPE_SYSTEM_ERROR;//利用WindowManger添加一個(gè)WindowgetWindowManager().addView(mFloatingBtn, mLayoutParams);}?
三、懸浮球隨手指滑動(dòng)的效果
首先,要先給懸浮球設(shè)置onTouchListener
mFloatingBtn.setOnTouchListener(this);然后,在onTouch方法中,不斷更新View的位置即可,更新View位置使用了WindowManger的Window更新(updateViewLayout)方法
@Overridepublic boolean onTouch(View v, MotionEvent event) {int x = (int) event.getRawX();int y = (int) event.getRawY();switch (event.getAction()) {case MotionEvent.ACTION_DOWN:mLastX = x;mLastY = y;break;case MotionEvent.ACTION_MOVE:int deltaX = x - mLastX;int deltaY = y - mLastY;mLayoutParams.x = mLayoutParams.x + deltaX;mLayoutParams.y = mLayoutParams.y + deltaY;mWM.updateViewLayout(v, mLayoutParams);mLastX = x;mLastY = y;break;default:break;}return false;}
?
這樣,一個(gè)具備基本功能的懸浮球效果就實(shí)現(xiàn)了。
擴(kuò)展:
1.給這個(gè)懸浮球賦予更豐富的功能
2.在懸浮球隨手指滑動(dòng)的效果上做些動(dòng)畫,提升滑動(dòng)體驗(yàn)
?
?
參考資料:《Android開發(fā)藝術(shù)探索》
? ? ? ? ? ? ? https://github.com/xerrard/SuspendedBall
轉(zhuǎn)載于:https://www.cnblogs.com/xerrard/p/4967711.html
《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
- 上一篇: Redis总结(二)C#中如何使用red
- 下一篇: 上下文学习