1 package net.xsmile.fv; 2 3 4 import android.app.Application; 5 import android.view.WindowManager; 6 7 8 public class MyApplication extends Application { 9 10 /** 11 * 創建全局變量 12 * 全局變量一般都比較傾向於創建一個單獨的數據類文件,並使用static靜態變量 13 * 14 * 這里使用了在Application中添加數據的方法實現全局變量 15 * 注意在AndroidManifest.xml中的Application節點添加android:name=".MyApplication"屬性 16 * 17 */ 18 private WindowManager.LayoutParams wmParams=new WindowManager.LayoutParams(); 19 20 21 public WindowManager.LayoutParams getMywmParams(){ 22 return wmParams; 23 } 24 }
1 package net.xsmile.fv; 2 3 import android.content.Context; 4 import android.util.Log; 5 import android.view.MotionEvent; 6 import android.view.WindowManager; 7 import android.widget.ImageView; 8 9 public class MyFloatView extends ImageView { 10 private float mTouchStartX; 11 private float mTouchStartY; 12 private float x; 13 private float y; 14 15 16 private WindowManager wm=(WindowManager)getContext().getApplicationContext().getSystemService("window"); 17 18 //此wmParams為獲取的全局變量,用以保存懸浮窗口的屬性 19 private WindowManager.LayoutParams wmParams = ((MyApplication)getContext().getApplicationContext()).getMywmParams(); 20 21 public MyFloatView(Context context) { 22 super(context); 23 // TODO Auto-generated constructor stub 24 } 25 26 @Override 27 public boolean onTouchEvent(MotionEvent event) { 28 29 30 //獲取相對屏幕的坐標,即以屏幕左上角為原點 31 x = event.getRawX(); 32 y = event.getRawY()-25; //25是系統狀態欄的高度 33 Log.i("currP", "currX"+x+"====currY"+y); 34 switch (event.getAction()) { 35 case MotionEvent.ACTION_DOWN: 36 //獲取相對View的坐標,即以此View左上角為原點 37 mTouchStartX = event.getX(); 38 mTouchStartY = event.getY(); 39 40 Log.i("startP", "startX"+mTouchStartX+"====startY"+mTouchStartY); 41 42 break; 43 case MotionEvent.ACTION_MOVE: 44 updateViewPosition(); 45 break; 46 47 case MotionEvent.ACTION_UP: 48 updateViewPosition(); 49 mTouchStartX=mTouchStartY=0; 50 break; 51 } 52 return true; 53 } 54 55 private void updateViewPosition(){ 56 //更新浮動窗口位置參數 57 wmParams.x=(int)( x-mTouchStartX); 58 wmParams.y=(int) (y-mTouchStartY); 59 wm.updateViewLayout(this, wmParams); 60 61 } 62 63 }
1 package net.xsmile.fv; 2 3 import android.app.Activity; 4 import android.graphics.PixelFormat; 5 import android.os.Bundle; 6 import android.view.Gravity; 7 import android.view.WindowManager; 8 import android.view.WindowManager.LayoutParams; 9 10 public class MyFloatViewActivity extends Activity { 11 /** Called when the activity is first created. */ 12 13 private WindowManager wm=null; 14 private WindowManager.LayoutParams wmParams=null; 15 16 private MyFloatView myFV=null; 17 18 19 @Override 20 public void onCreate(Bundle savedInstanceState) { 21 super.onCreate(savedInstanceState); 22 setContentView(R.layout.main); 23 //創建懸浮窗口 24 createView(); 25 26 } 27 28 29 30 private void createView(){ 31 myFV=new MyFloatView(getApplicationContext()); 32 myFV.setImageResource(R.drawable.icon); 33 //獲取WindowManager 34 wm=(WindowManager)getApplicationContext().getSystemService("window"); 35 //設置LayoutParams(全局變量)相關參數 36 wmParams = ((MyApplication)getApplication()).getMywmParams(); 37 38 /** 39 *以下都是WindowManager.LayoutParams的相關屬性 40 * 具體用途可參考SDK文檔 41 */ 42 wmParams.type=LayoutParams.TYPE_PHONE; //設置window type 43 wmParams.format=PixelFormat.RGBA_8888; //設置圖片格式,效果為背景透明 44 45 //設置Window flag 46 wmParams.flags=LayoutParams.FLAG_NOT_TOUCH_MODAL 47 | LayoutParams.FLAG_NOT_FOCUSABLE; 48 /* 49 * 下面的flags屬性的效果形同“鎖定”。 50 * 懸浮窗不可觸摸,不接受任何事件,同時不影響后面的事件響應。 51 wmParams.flags=LayoutParams.FLAG_NOT_TOUCH_MODAL 52 | LayoutParams.FLAG_NOT_FOCUSABLE 53 | LayoutParams.FLAG_NOT_TOUCHABLE; 54 */ 55 56 57 wmParams.gravity=Gravity.LEFT|Gravity.TOP; //調整懸浮窗口至左上角 58 //以屏幕左上角為原點,設置x、y初始值 59 wmParams.x=0; 60 wmParams.y=0; 61 62 //設置懸浮窗口長寬數據 63 wmParams.width=40; 64 wmParams.height=40; 65 66 //顯示myFloatView圖像 67 wm.addView(myFV, wmParams); 68 69 } 70 71 @Override 72 public void onDestroy(){ 73 super.onDestroy(); 74 //在程序退出(Activity銷毀)時銷毀懸浮窗口 75 wm.removeView(myFV); 76 } 77 78 79 80 }
1 <?xml version="1.0" encoding="utf-8"?> 2 <manifest xmlns:android="http://schemas.android.com/apk/res/android" 3 package="net.xsmile.fv" 4 android:versionCode="1" 5 android:versionName="1.0"> 6 <application android:name=".MyApplication" android:icon="@drawable/icon" android:label="@string/app_name"> 7 <activity android:name=".MyFloatViewActivity" 8 android:label="@string/app_name"> 9 <intent-filter> 10 <action android:name="android.intent.action.MAIN" /> 11 <category android:name="android.intent.category.LAUNCHER" /> 12 </intent-filter> 13 </activity> 14 15 </application> 16 17 <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" /> 18 19 20 </manifest>