日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

Android UI开发第十四篇——可以移动的悬浮框

發布時間:2025/6/15 Android 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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;??
  • ????/**?Called?when?the?activity?is?first?created.?*/??
  • ????@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);??
  • ?????//獲取WindowManager??
  • ?????mWindowManager=(WindowManager)getApplicationContext().getSystemService(Context.WINDOW_SERVICE);??
  • ????????//設置LayoutParams(全局變量)相關參數??
  • ?????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;???//調整懸浮窗口至左上角??
  • ????????//以屏幕左上角為原點,設置x、y初始值??
  • ?????param.x=0;??
  • ?????param.y=0;??
  • ??????????
  • ????????//設置懸浮窗口長寬數據??
  • ?????param.width=140;??
  • ?????param.height=140;??
  • ??????????
  • ????????//顯示myFloatView圖像??
  • ?????mWindowManager.addView(mLayout,?param);??
  • ???????
  • ????}??
  • ????@Override??
  • ????public?void?onDestroy(){??
  • ?????super.onDestroy();??
  • ?????//在程序退出(Activity銷毀)時銷毀懸浮窗口??
  • ?????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);????
  • ??//?TODO?Auto-generated?constructor?stub??
  • ?}??
  • ???
  • ??@Override??
  • ??public?boolean?onTouchEvent(MotionEvent?event)?{??
  • ?????
  • ?????
  • ???//獲取相對屏幕的坐標,即以屏幕左上角為原點?????
  • ??????x?=?event.getRawX();?????
  • ??????y?=?event.getRawY()-25;???//25是系統狀態欄的高度??
  • ??????Log.i("currP",?"currX"+x+"====currY"+y);??
  • ??????switch?(event.getAction())?{??
  • ?????????case?MotionEvent.ACTION_DOWN:??
  • ??????????//獲取相對View的坐標,即以此View左上角為原點??
  • ??????????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?{??
  • ???
  • /**?
  • ??*?創建全局變量?
  • ??*?全局變量一般都比較傾向于創建一個單獨的數據類文件,并使用static靜態變量?
  • ??*??
  • ??*?這里使用了在Application中添加數據的方法實現全局變量?
  • ??*?注意在AndroidManifest.xml中的Application節點添加android:name=".MyApplication"屬性?
  • ??*??
  • ??*/??
  • ?private?WindowManager.LayoutParams?wmParams=new?WindowManager.LayoutParams();??
  • ??
  • ??
  • ?public?WindowManager.LayoutParams?getMywmParams(){??
  • ??return?wmParams;??
  • ?}??
  • ??
  • }??
  • 《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀

    總結

    以上是生活随笔為你收集整理的Android UI开发第十四篇——可以移动的悬浮框的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。