用WindowManager实现Android悬浮框以及拖动事件
生活随笔
收集整理的這篇文章主要介紹了
用WindowManager实现Android悬浮框以及拖动事件
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
下面的App程序代碼實現通過主Activity的啟動按鈕,啟動一個Service,然后在Service中創建添加懸浮窗口:(話不多說,直接上代碼) 在這里我們先看一下需要創建的類和布局和需要添加的權限
在使用要獲取CompatModeWrapper,首先得在應用程序的AndroidManifest.xml文件中添加權限
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />需要創建的類有:
???FloatWindowTest(Activity) ????FxService(class)(不用創建也可以,這里供參考使用,在本類中沒有用到此類) 需要創建的布局有:????????????layout_item.xml
????????????test_window_float.xml
在DrawAble下創建的xml有:
????????????shape_background_dark.xml
效果:點擊一個按鈕 ?彈出一個懸浮框 ? 并且懸浮框可以實現拖動效果
FloatWindowTest的代碼如下: import android.app.Activity; import android.graphics.PixelFormat; import android.os.Bundle; import android.view.Gravity; import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.View; import android.view.WindowManager; import android.widget.Button; import android.widget.LinearLayout; import android.widget.TextView; import android.widget.Toast;import activity.main.qixin.com.xinqingofqian.R;public class FloatWindowTest extends Activity implements View.OnClickListener {/*** Called when the activity is first created.*/WindowManager mWindowManager;WindowManager.LayoutParams wmParams;LinearLayout mFloatLayout;TextView mFloatView;private Button start_Btn;@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.test_window_float);//初始化控件initView();}private void createFloatView() {//獲取LayoutParams對象wmParams = new WindowManager.LayoutParams();//獲取的是LocalWindowManager對象mWindowManager = this.getWindowManager();//設置window typewmParams.type = WindowManager.LayoutParams.TYPE_PHONE;//設置圖片格式,效果為背景透明wmParams.format = PixelFormat.RGBA_8888;//設置浮動窗口不可聚焦(實現操作除浮動窗口外的其他可見窗口的操作)wmParams.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;//調整懸浮窗顯示的停靠位置為左側置頂wmParams.gravity = Gravity.LEFT | Gravity.TOP;// 以屏幕左上角為原點,設置x、y初始值,相對于gravitywmParams.x = 0;wmParams.y = 0;//設置懸浮窗口長寬數據wmParams.width = WindowManager.LayoutParams.WRAP_CONTENT;wmParams.height = WindowManager.LayoutParams.WRAP_CONTENT;/*// 設置懸浮窗口長寬數據wmParams.width = 200;wmParams.height = 80;*/LayoutInflater inflater = this.getLayoutInflater();//獲取浮動窗口視圖所在布局mFloatLayout = (LinearLayout) inflater.inflate(R.layout.layout_item, null);//浮動窗口按鈕mFloatView = mFloatLayout.findViewById(R.id.float_id);//添加mFloatLayoutmWindowManager.addView(mFloatLayout, wmParams);//綁定觸摸移動監聽mFloatView.setOnTouchListener(new View.OnTouchListener() {@Overridepublic boolean onTouch(View v, MotionEvent event) {// TODO Auto-generated method stubwmParams.x = (int) event.getRawX() - mFloatLayout.getWidth() / 2;//25為狀態欄高度wmParams.y = (int) event.getRawY() - mFloatLayout.getHeight() / 2 - 40;mWindowManager.updateViewLayout(mFloatLayout, wmParams);return false;}});//懸浮框設置點擊監聽mFloatView.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {// TODO Auto-generated method stubToast.makeText(FloatWindowTest.this, "我是懸浮框", Toast.LENGTH_SHORT).show();}});}private void initView() {start_Btn = (Button) findViewById(R.id.start_id);start_Btn.setOnClickListener(this);}@Overridepublic void onClick(View v) {switch (v.getId()) {case R.id.start_id:if (null == mWindowManager) {createFloatView();}break;}}@Overridepublic void onDestroy() {// TODO Auto-generated method stubsuper.onDestroy();if (mFloatLayout != null) {//移除懸浮窗口mWindowManager.removeView(mFloatLayout);}} } FxService的代碼如下: import android.app.Service; import android.content.Intent; import android.graphics.PixelFormat; import android.os.IBinder; import android.support.annotation.Nullable; import android.util.Log; import android.view.Gravity; import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.View; import android.view.WindowManager; import android.widget.Button; import android.widget.LinearLayout; import android.widget.Toast;import activity.main.qixin.com.xinqingofqian.R;public class FxService extends Service {//定義浮動窗口布局LinearLayout mFloatLayout;WindowManager.LayoutParams wmParams;//創建浮動窗口設置布局參數的對象WindowManager mWindowManager;Button mFloatView;private static final String TAG = "FxService";@Overridepublic void onCreate() {// TODO Auto-generated method stubsuper.onCreate();Log.i(TAG, "oncreat");createFloatView();}@Nullable@Overridepublic IBinder onBind(Intent intent) {return null;}private void createFloatView() {wmParams = new WindowManager.LayoutParams();//獲取的是WindowManagerImpl.CompatModeWrappermWindowManager = (WindowManager) getApplication().getSystemService(getApplication().WINDOW_SERVICE);Log.i(TAG, "mWindowManager--->" + mWindowManager);//設置window typewmParams.type = WindowManager.LayoutParams.TYPE_PHONE;//設置圖片格式,效果為背景透明wmParams.format = PixelFormat.RGBA_8888;//設置浮動窗口不可聚焦(實現操作除浮動窗口外的其他可見窗口的操作)wmParams.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;//調整懸浮窗顯示的停靠位置為左側置頂wmParams.gravity = Gravity.CENTER;// 以屏幕左上角為原點,設置x、y初始值,相對于gravitywmParams.x = 0;wmParams.y = 0;//設置懸浮窗口長寬數據wmParams.width = WindowManager.LayoutParams.WRAP_CONTENT;wmParams.height = WindowManager.LayoutParams.WRAP_CONTENT;/*// 設置懸浮窗口長寬數據wmParams.width = 200;wmParams.height = 80;*/LayoutInflater inflater = LayoutInflater.from(getApplication());//獲取浮動窗口視圖所在布局mFloatLayout = (LinearLayout) inflater.inflate(R.layout.layout_item, null);//添加mFloatLayoutmWindowManager.addView(mFloatLayout, wmParams);//浮動窗口按鈕mFloatView = (Button) mFloatLayout.findViewById(R.id.float_id);mFloatLayout.measure(View.MeasureSpec.makeMeasureSpec(0,View.MeasureSpec.UNSPECIFIED), View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED));Log.i(TAG, "Width/2--->" + mFloatView.getMeasuredWidth() / 2);Log.i(TAG, "Height/2--->" + mFloatView.getMeasuredHeight() / 2);//設置監聽浮動窗口的觸摸移動mFloatView.setOnTouchListener(new View.OnTouchListener() {@Overridepublic boolean onTouch(View v, MotionEvent event) {// TODO Auto-generated method stub//getRawX是觸摸位置相對于屏幕的坐標,getX是相對于按鈕的坐標wmParams.x = (int) event.getRawX() - mFloatView.getMeasuredWidth() / 2;Log.i(TAG, "RawX" + event.getRawX());Log.i(TAG, "X" + event.getX());//減25為狀態欄的高度wmParams.y = (int) event.getRawY() - mFloatView.getMeasuredHeight() / 2 - 25;Log.i(TAG, "RawY" + event.getRawY());Log.i(TAG, "Y" + event.getY());//刷新mWindowManager.updateViewLayout(mFloatLayout, wmParams);return false; //此處必須返回false,否則OnClickListener獲取不到監聽}});mFloatView.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {// TODO Auto-generated method stubToast.makeText(FxService.this, "onClick", Toast.LENGTH_SHORT).show();}});}@Overridepublic void onDestroy() {// TODO Auto-generated method stubsuper.onDestroy();if (mFloatLayout != null) {//移除懸浮窗口mWindowManager.removeView(mFloatLayout);}}}layout_item.xml的代碼如下:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"><TextViewandroid:id="@+id/float_id"android:layout_width="wrap_content"android:layout_height="50dp"android:layout_margin="10dp"android:padding="10dp"android:background="@drawable/shape_background_dark"android:gravity="center"android:text="你好,再見!"android:textColor="#ffffff"android:textSize="20sp" /> </LinearLayout>test_window_float.xml的代碼如下:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><Buttonandroid:id="@+id/start_id"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="添加懸浮框" /> </LinearLayout>shape_background_dark.xml的代碼如下:
<?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android"><solid android:color="#666666" /><corners android:radius="40dp" /> </shape>這里的懸浮框是可以隨便拖動的
May everyone be happy every day and everything go well!
總結
以上是生活随笔為你收集整理的用WindowManager实现Android悬浮框以及拖动事件的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 文件服务器访问权限分配,设置文件服务器的
- 下一篇: 使用windowManager实现音乐播