生活随笔
收集整理的這篇文章主要介紹了
Android UI开发第十四篇——可以移动的悬浮框
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
工作中遇到一些項目需要把窗體顯示在最上層,像來電彈窗顯示電話號碼等信息或攔截短信信息顯示給用戶,我們想這些數據放在最上層,activity就滿足不了我們的需求了,有些開發者使用了循環顯示Toast的方式,toast是不能獲得焦點的,這種方法是不可取的。這個時候,我們如何處理呢?
?????? 原來,整個Android的窗口機制是基于一個叫做 WindowManager,這個接口可以添加view到屏幕,也可以從屏幕刪除view。它面向的對象一端是屏幕,另一端就是View,直接忽略我們以前的Activity或者Dialog之類的東東。其實我們的Activity或者Diolog底層的實現也是通過WindowManager,這個 WindowManager是全局的,整個系統就是這個唯一的東東。它是顯示View的最底層了。
???WindowManager主要用來管理窗口的一些狀態、屬性、view增加、刪除、更新、窗口順序、消息收集和處理等。通過Context.getSystemService(Context.WINDOW_SERVICE)的方式可以獲得WindowManager的實例.
WindowManager繼承自ViewManager,里面涉及到窗口管理的三個重要方法,分別是:
??? ?* addView();
???? * updateViewLayout();
???? * removeView();?
?
效果圖如下:
?
?
可以移動的懸浮框實現代碼如下:
[java]?view plaincopyprint?
public?class?WindowManageDemoActivity?extends?Activity?{?? ??? private?WindowManager?mWindowManager;?? ?private?WindowManager.LayoutParams?param;?? ?private?FloatView?mLayout;?? ?????? ????@Override?? ????public?void?onCreate(Bundle?savedInstanceState)?{?? ????????super.onCreate(savedInstanceState);?? ????????setContentView(R.layout.main);?? ???????????????? ????????showView();?? ????}?? ????private?void?showView(){?? ?????mLayout=new?FloatView(getApplicationContext());?? ?????mLayout.setBackgroundResource(R.drawable.faceback_head);?? ??????? ?????mWindowManager=(WindowManager)getApplicationContext().getSystemService(Context.WINDOW_SERVICE);?? ?????????? ?????param?=?((MyApplication)getApplication()).getMywmParams();?? ?? ?????param.type=WindowManager.LayoutParams.TYPE_SYSTEM_ALERT;??????? ?????param.format=1;?? ?????param.flags?=?WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;??? ?????param.flags?=?param.flags?|?WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH;?? ?????param.flags?=?param.flags?|?WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS;??? ???????? ?????param.alpha?=?1.0f;?? ?????????? ?????param.gravity=Gravity.LEFT|Gravity.TOP;????? ?????????? ?????param.x=0;?? ?????param.y=0;?? ?????????? ?????????? ?????param.width=140;?? ?????param.height=140;?? ?????????? ?????????? ?????mWindowManager.addView(mLayout,?param);?? ??????? ????}?? ????@Override?? ????public?void?onDestroy(){?? ?????super.onDestroy();?? ??????? ?????mWindowManager.removeView(mLayout);?? ????}?? }??
?
[java]?view plaincopyprint?
public?class?FloatView?extends?View?{?? ?private?float?mTouchStartX;?? ????private?float?mTouchStartY;?? ????private?float?x;?? ????private?float?y;?? ?????? ????private?WindowManager?wm=(WindowManager)getContext().getApplicationContext().getSystemService(Context.WINDOW_SERVICE);?? ????private?WindowManager.LayoutParams?wmParams?=?((MyApplication)getContext().getApplicationContext()).getMywmParams();?? ?? ?public?FloatView(Context?context)?{?? ??super(context);???? ???? ?}?? ??? ??@Override?? ??public?boolean?onTouchEvent(MotionEvent?event)?{?? ????? ????? ????? ??????x?=?event.getRawX();????? ??????y?=?event.getRawY()-25;????? ??????Log.i("currP",?"currX"+x+"====currY"+y);?? ??????switch?(event.getAction())?{?? ?????????case?MotionEvent.ACTION_DOWN:?? ???????????? ??????????mTouchStartX?=??event.getX();???? ????????????????mTouchStartY?=??event.getY();?? ?????????????????? ?????????????Log.i("startP",?"startX"+mTouchStartX+"====startY"+mTouchStartY);?? ??????????????? ?????????????break;?? ?????????case?MotionEvent.ACTION_MOVE:??????????????? ?????????????updateViewPosition();?? ?????????????break;?? ?? ?????????case?MotionEvent.ACTION_UP:?? ??????????updateViewPosition();?? ??????????mTouchStartX=mTouchStartY=0;?? ??????????break;?? ?????????}?? ?????????return?true;?? ??}?? ???? ??private?void?updateViewPosition(){?? ???? ??wmParams.x=(int)(?x-mTouchStartX);?? ??wmParams.y=(int)?(y-mTouchStartY);?? ?????wm.updateViewLayout(this,?wmParams);?? ??????? ??}?? ?? }??
?
?
?
[java]?view plaincopyprint?
public?class?MyApplication?extends?Application?{?? ??? ? ? ? ? ? ? ? ?? ?private?WindowManager.LayoutParams?wmParams=new?WindowManager.LayoutParams();?? ?? ?? ?public?WindowManager.LayoutParams?getMywmParams(){?? ??return?wmParams;?? ?}?? ?? }??
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀
總結
以上是生活随笔為你收集整理的Android UI开发第十四篇——可以移动的悬浮框的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。