Android之浮動小窗口


//創建創建全局變量類

 1  public  class MyApplication  extends Application {
 2     
 3      /**
 4       * 創建全局變量
 5       * 全局變量一般都比較傾向於創建一個單獨的數據類文件,並使用static靜態變量
 6       * 
 7       * 這里使用了在Application中添加數據的方法實現全局變量
 8       * 注意在AndroidManifest.xml中的Application節點添加android:name=".MyApplication"屬性
 9       * 
10        */
11      private WindowManager.LayoutParams wmParams= new WindowManager.LayoutParams();
12 
13      public WindowManager.LayoutParams getMywmParams(){
14          return wmParams;
15     }

 

//Activity類 

 1  public  class MyFloatViewActivity  extends Activity {
 2    
 3 
 4      /**  Called when the activity is first created.  */
 5     
 6      private WindowManager wm= null;
 7      private WindowManager.LayoutParams wmParams= null;
 8     
 9      private MyFloatView myFV= null;
10 
11     
12     @Override
13      public  void onCreate(Bundle savedInstanceState) {
14          super.onCreate(savedInstanceState);
15         setContentView(R.layout.main);
16     
18     }
19     
22      private  void createView(){
23         myFV= new MyFloatView(getApplicationContext());
24         myFV.setImageResource(R.drawable.icon);
25          // 獲取WindowManager
26          wm=(WindowManager)getApplicationContext().getSystemService("window");
27          // 設置LayoutParams(全局變量)相關參數
28          wmParams = ((MyApplication)getApplication()).getMywmParams();
29 
30           /**
31           *以下都是WindowManager.LayoutParams的相關屬性
32           * 具體用途可參考SDK文檔
33            */
34         wmParams.type=LayoutParams.TYPE_PHONE;    // 設置window type
35          wmParams.format=PixelFormat.RGBA_8888;    // 設置圖片格式,效果為背景透明
36 
37           // 設置Window flag
38          wmParams.flags=LayoutParams.FLAG_NOT_TOUCH_MODAL
39                               | LayoutParams.FLAG_NOT_FOCUSABLE;
40          /*
41           * 下面的flags屬性的效果形同“鎖定”。
42           * 懸浮窗不可觸摸,不接受任何事件,同時不影響后面的事件響應。
43           wmParams.flags=LayoutParams.FLAG_NOT_TOUCH_MODAL 
44                                 | LayoutParams.FLAG_NOT_FOCUSABLE
45                                 | LayoutParams.FLAG_NOT_TOUCHABLE;
46           */
47         
48         
49         wmParams.gravity=Gravity.LEFT|Gravity.TOP;    // 調整懸浮窗口至左上角
50           // 以屏幕左上角為原點,設置x、y初始值
51          wmParams.x=0;
52         wmParams.y=0;
53         
54          // 設置懸浮窗口長寬數據
55          wmParams.width=40;
56         wmParams.height=40;
57     
58          // 顯示myFloatView圖像
59          wm.addView(myFV, wmParams);
60         
61     }
62     
63     @Override
64      public  void onDestroy(){
65          super.onDestroy();
66          // 在程序退出(Activity銷毀)時銷毀懸浮窗口
67          wm.removeView(myFV);
68     }
69     
70     @Override
71      protected  void onRestart() {
72          //  TODO Auto-generated method stub
73          wm.removeView(myFV);
74          super.onRestart();
75     }
76 
79     @Override
80      protected  void onStop() {
81          //  TODO Auto-generated method stub
82           // 創建懸浮窗口
83          createView();
84          super.onStop();
85     }  

 

//浮動窗口內容類

 

 1  public  class MyFloatView  extends ImageView {
 2      private  float mTouchStartX;
 3      private  float mTouchStartY;
 4      private  float x;
 5      private  float y;
 6     
 8      private WindowManager wm=(WindowManager)getContext().getApplicationContext().getSystemService("window");
 9     
10      // 此wmParams為獲取的全局變量,用以保存懸浮窗口的屬性
11       private WindowManager.LayoutParams wmParams = ((MyApplication)getContext().getApplicationContext()).getMywmParams();
12 
13      public MyFloatView(Context context) {
14          super(context);        
15          //  TODO Auto-generated constructor stub
16      }
17     
18      @Override
19       public  boolean onTouchEvent(MotionEvent event) {
20          
21           // getRawX()獲取相對屏幕的坐標,即以屏幕左上角為原點         
22           x = event.getRawX();   
23          y = event.getRawY()-25;    // 25是系統狀態欄的高度
24           Log.i("currP", "currX"+x+"====currY"+y);
25           switch (event.getAction()) {
26              case MotionEvent.ACTION_DOWN:
27                  // getX()獲取相對View的坐標,即以此View左上角為原點
28                  mTouchStartX =  event.getX(); 
29                 mTouchStartY =  event.getY();
30                 
31                 Log.i("startP", "startX"+mTouchStartX+"====startY"+mTouchStartY);
32                 
33                  break;
34              case MotionEvent.ACTION_MOVE:                
35                 updateViewPosition();
36                  break;
37 
38              case MotionEvent.ACTION_UP:
39                 updateViewPosition();
40                 mTouchStartX=mTouchStartY=0;
41                  break;
42             }
43              return  true;
44         }
45      
46       private  void updateViewPosition(){
47          // 更新浮動窗口位置參數,x是鼠標在屏幕的位置,mTouchStartX是鼠標在圖片的位置
48          wmParams.x=( int)( x-mTouchStartX);
49         System.out.println(mTouchStartX);
50         wmParams.y=( int) (y-mTouchStartY);
51         wm.updateViewLayout( this, wmParams);
52         
53      }
54 
55 }

 

在androidManifest中設置:

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM