可移动悬浮球的实现
可移動懸浮球的實現
近期看到魅族的懸浮球功能,初步研究了下,實現了基本的功能。
?
一、Window 和WindowManger 的概念
Window:一個抽象類,具體實現在PhoneWindow。表示一個窗口的概念,Android中所有的View都是通過Window來顯示的,Actvity/Dialog/Toast中的View都是附加在Window上的——Window是View的直接管理者。View的事件是由Window傳遞給DecorView,然后DecorView傳遞給View;setContentView的底層也是通過Window來完成
WindowManger:Window的管理者。有三大接口 Window添加——addView,Window刪除——removeView,Window更新——updateViewLayout
?
二、使用WindowManger添加一個Window來實現懸浮效果
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 =//本區域內的事件自己處理,本區域外的事件底層Window處理WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL//不獲取焦點,也不接收輸入事件| WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE//可以顯示鎖屏界面| WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED;mLayoutParams.gravity = Gravity.LEFT | Gravity.TOP;mLayoutParams.x = 100;mLayoutParams.y = 300;//選用系統層級的Type,這樣Window會顯示在最頂層mLayoutParams.type = WindowManager.LayoutParams.TYPE_SYSTEM_ERROR;//利用WindowManger添加一個WindowgetWindowManager().addView(mFloatingBtn, mLayoutParams);}?
三、懸浮球隨手指滑動的效果
首先,要先給懸浮球設置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;}
?
這樣,一個具備基本功能的懸浮球效果就實現了。
擴展:
1.給這個懸浮球賦予更豐富的功能
2.在懸浮球隨手指滑動的效果上做些動畫,提升滑動體驗
?
?
參考資料:《Android開發藝術探索》
? ? ? ? ? ? ? https://github.com/xerrard/SuspendedBall
轉載于:https://www.cnblogs.com/xerrard/p/4967711.html
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
- 上一篇: Redis总结(二)C#中如何使用red
- 下一篇: 上下文学习