日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

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

發(fā)布時(shí)間:2025/6/15 46 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android UI开发第十四篇——可以移动的悬浮框 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

工作中遇到一些項(xiàng)目需要把窗體顯示在最上層,像來電彈窗顯示電話號碼等信息或攔截短信信息顯示給用戶,我們想這些數(shù)據(jù)放在最上層,activity就滿足不了我們的需求了,有些開發(fā)者使用了循環(huán)顯示Toast的方式,toast是不能獲得焦點(diǎn)的,這種方法是不可取的。這個(gè)時(shí)候,我們?nèi)绾翁幚砟?#xff1f;
?????? 原來,整個(gè)Android的窗口機(jī)制是基于一個(gè)叫做 WindowManager,這個(gè)接口可以添加view到屏幕,也可以從屏幕刪除view。它面向的對象一端是屏幕,另一端就是View,直接忽略我們以前的Activity或者Dialog之類的東東。其實(shí)我們的Activity或者Diolog底層的實(shí)現(xiàn)也是通過WindowManager,這個(gè) WindowManager是全局的,整個(gè)系統(tǒng)就是這個(gè)唯一的東東。它是顯示View的最底層了。

???WindowManager主要用來管理窗口的一些狀態(tài)、屬性、view增加、刪除、更新、窗口順序、消息收集和處理等。通過Context.getSystemService(Context.WINDOW_SERVICE)的方式可以獲得WindowManager的實(shí)例.

WindowManager繼承自ViewManager,里面涉及到窗口管理的三個(gè)重要方法,分別是:

??? ?* addView();

???? * updateViewLayout();

???? * removeView();?

?

效果圖如下:

?

?

可以移動的懸浮框?qū)崿F(xiàn)代碼如下:

[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);??
  • ????????//設(shè)置LayoutParams(全局變量)相關(guān)參數(shù)??
  • ?????param?=?((MyApplication)getApplication()).getMywmParams();??
  • ??
  • ?????param.type=WindowManager.LayoutParams.TYPE_SYSTEM_ALERT;?????//?系統(tǒng)提示類型,重要??
  • ?????param.format=1;??
  • ?????param.flags?=?WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;?//?不能搶占聚焦點(diǎn)??
  • ?????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;???//調(diào)整懸浮窗口至左上角??
  • ????????//以屏幕左上角為原點(diǎn),設(shè)置x、y初始值??
  • ?????param.x=0;??
  • ?????param.y=0;??
  • ??????????
  • ????????//設(shè)置懸浮窗口長寬數(shù)據(jù)??
  • ?????param.width=140;??
  • ?????param.height=140;??
  • ??????????
  • ????????//顯示myFloatView圖像??
  • ?????mWindowManager.addView(mLayout,?param);??
  • ???????
  • ????}??
  • ????@Override??
  • ????public?void?onDestroy(){??
  • ?????super.onDestroy();??
  • ?????//在程序退出(Activity銷毀)時(shí)銷毀懸浮窗口??
  • ?????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)?{??
  • ?????
  • ?????
  • ???//獲取相對屏幕的坐標(biāo),即以屏幕左上角為原點(diǎn)?????
  • ??????x?=?event.getRawX();?????
  • ??????y?=?event.getRawY()-25;???//25是系統(tǒng)狀態(tài)欄的高度??
  • ??????Log.i("currP",?"currX"+x+"====currY"+y);??
  • ??????switch?(event.getAction())?{??
  • ?????????case?MotionEvent.ACTION_DOWN:??
  • ??????????//獲取相對View的坐標(biāo),即以此View左上角為原點(diǎn)??
  • ??????????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(){??
  • ??//更新浮動窗口位置參數(shù)??
  • ??wmParams.x=(int)(?x-mTouchStartX);??
  • ??wmParams.y=(int)?(y-mTouchStartY);??
  • ?????wm.updateViewLayout(this,?wmParams);??
  • ???????
  • ??}??
  • ??
  • }??

  • ?

    ?

    ?

    [java]?view plaincopyprint?
  • public?class?MyApplication?extends?Application?{??
  • ???
  • /**?
  • ??*?創(chuàng)建全局變量?
  • ??*?全局變量一般都比較傾向于創(chuàng)建一個(gè)單獨(dú)的數(shù)據(jù)類文件,并使用static靜態(tài)變量?
  • ??*??
  • ??*?這里使用了在Application中添加數(shù)據(jù)的方法實(shí)現(xiàn)全局變量?
  • ??*?注意在AndroidManifest.xml中的Application節(jié)點(diǎn)添加android:name=".MyApplication"屬性?
  • ??*??
  • ??*/??
  • ?private?WindowManager.LayoutParams?wmParams=new?WindowManager.LayoutParams();??
  • ??
  • ??
  • ?public?WindowManager.LayoutParams?getMywmParams(){??
  • ??return?wmParams;??
  • ?}??
  • ??
  • }??
  • 《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀

    總結(jié)

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

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。