国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統(tǒng) > Android > 正文

在當(dāng)前Activity之上創(chuàng)建懸浮view之WindowManager懸浮窗效果

2020-04-11 10:56:00
字體:
供稿:網(wǎng)友

最近有學(xué)生做畢業(yè)設(shè)計(jì),想使用懸浮窗這種效果,其實(shí)很簡單,我們可以通過系統(tǒng)服務(wù)WindowManager來實(shí)現(xiàn)此功能,本章我們來試驗(yàn)一下在當(dāng)前Activity之上創(chuàng)建一個(gè)懸浮的view。

第一步:認(rèn)識(shí)WindowManager

這個(gè)接口用于與 window manager (窗口管理器, 應(yīng)用框架層) 進(jìn)行交互。

通過getSystemService(Context.WINDOW_SERVICE)可以獲取到WM的實(shí)例.

繼承關(guān)系

public interface WindowManager implements ViewManager

所屬包

android.view.WindowManager

重要方法

addView() 添加view
removeView() 刪除view
updateViewLayout () 改變view的參數(shù)

  Window Manager Service 是全局的,是唯一的。 它將用戶的操作,翻譯成為指令,發(fā)送給呈現(xiàn)在界面上的各個(gè)Window。Activity會(huì)將頂級的控件注冊到 Window Manager 中,當(dāng)用戶真是觸碰屏幕或鍵盤的時(shí)候,Window Manager就會(huì)通知到,而當(dāng)控件有一些請求產(chǎn)生,也會(huì)經(jīng)由ViewParent送回到Window Manager中。從而完成整個(gè)通信流程

第二步:重寫ImageView 的onTouchEvent方法

  上一步我們知道了 WindowManager可以添加,刪除,改變view,那么想要實(shí)現(xiàn)懸浮窗的拖動(dòng)效果我們就要獲取ImageView的坐標(biāo)位置。

獲取相對屏幕的坐標(biāo),即以屏幕左上角為原點(diǎn)

float x = event.getRawX();float y = event.getRawY()-25; //25是系統(tǒng)狀態(tài)欄的高度

通過WindowManager.LayoutParams wmParams 設(shè)置 x ,y

wmParams.x=(int)( x-mTouchStartX);wmParams.y=(int) (y-mTouchStartY);

再通過updateViewLayout()方法設(shè)置懸浮窗的當(dāng)前位置

第三步:加入權(quán)限

  在AndroidManifest.xml中加入如下的權(quán)限:

<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" /> 

效果如下:

重要代碼 : 創(chuàng)建 MyApplication

import android.app.Application;import android.view.WindowManager;public class MyApplication extends Application {/*** 創(chuàng)建全局變量* 注意在AndroidManifest.xml中的Application節(jié)點(diǎn)添加android:name=".MyApplication"屬性**/private WindowManager.LayoutParams wmParams=new WindowManager.LayoutParams();public WindowManager.LayoutParams getMywmParams(){return wmParams;}}

創(chuàng)建自定義View 繼承ImageView

import android.content.Context;import android.util.Log;import android.view.MotionEvent;import android.view.WindowManager;import android.widget.ImageView;public class MyFloatView extends ImageView {private float mTouchStartX;private float mTouchStartY;private float x;private float y;private WindowManager wm=(WindowManager)getContext().getApplicationContext().getSystemService(Context.WINDOW_SERVICE);//此wmParams為獲取的全局變量,用以保存懸浮窗口的屬性private WindowManager.LayoutParams wmParams = ((MyApplication)getContext().getApplicationContext()).getMywmParams();public MyFloatView(Context context) {super(context);// TODO Auto-generated constructor stub}@Overridepublic 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();break;case MotionEvent.ACTION_MOVE:updateViewPosition();break;case MotionEvent.ACTION_UP:updateViewPosition();mTouchStartX=mTouchStartY=0;break;}return true;}private void updateViewPosition(){//更新浮動(dòng)窗口位置參數(shù)wmParams.x=(int)( x-mTouchStartX);wmParams.y=(int) (y-mTouchStartY);wm.updateViewLayout(this, wmParams);}}

創(chuàng)建Activity

import android.app.Activity;import android.content.Context;import android.graphics.PixelFormat;import android.os.Bundle;import android.util.Log;import android.view.Gravity;import android.view.View;import android.view.WindowManager;import android.view.View.OnClickListener;import android.view.WindowManager.LayoutParams;public class MyFloatViewActivity extends Activity{private WindowManager wm=null;private WindowManager.LayoutParams wmParams=null;private MyFloatView myFV=null;@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);//創(chuàng)建懸浮窗口createView();}private void createView(){myFV=new MyFloatView(getApplicationContext());myFV.setImageResource(R.drawable.angry_birds);//獲取WindowManagerwm=(WindowManager)getApplicationContext().getSystemService(Context.WINDOW_SERVICE);//設(shè)置LayoutParams(全局變量)相關(guān)參數(shù)wmParams = ((MyApplication)getApplication()).getMywmParams();wmParams.type=LayoutParams.TYPE_PHONE; //設(shè)置window typewmParams.format=PixelFormat.RGBA_8888; //設(shè)置圖片格式,效果為背景透明//設(shè)置Window flagwmParams.flags=LayoutParams.FLAG_NOT_TOUCH_MODAL| LayoutParams.FLAG_NOT_FOCUSABLE;wmParams.gravity=Gravity.LEFT|Gravity.TOP; //調(diào)整懸浮窗口至左上角//以屏幕左上角為原點(diǎn),設(shè)置x、y初始值wmParams.x=0;wmParams.y=0;//設(shè)置懸浮窗口長寬數(shù)據(jù)wmParams.width=40;wmParams.height=40;//顯示myFloatView圖像wm.addView(myFV, wmParams);}@Overridepublic void onDestroy(){super.onDestroy();//在程序退出(Activity銷毀)時(shí)銷毀懸浮窗口wm.removeView(myFV);}}

通過以上實(shí)例代碼給大家詳解了在當(dāng)前Activity之上創(chuàng)建懸浮view之WindowManager懸浮窗效果的相關(guān)知識(shí),希望本文所述對大家有所幫助。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 旌德县| 孙吴县| 盐边县| 芜湖县| 都昌县| 商河县| 南华县| 宜黄县| 平果县| 沙坪坝区| 兴业县| 义乌市| 承德市| 涞源县| 青龙| 武山县| 孙吴县| 五华县| 志丹县| 葫芦岛市| 库尔勒市| 华容县| 丁青县| 凉城县| 定西市| 阿荣旗| 宜君县| 阳原县| 巴彦县| 隆回县| 龙山县| 冷水江市| 潼南县| 伊通| 蕉岭县| 抚顺县| 余江县| 张北县| 昌宁县| 苍梧县| 洛扎县|