1 package com.bi.dialogactivity_xuanfuchuang.app; 2 3 import android.graphics.Color; 4 import android.graphics.PixelFormat; 5 import android.support.v7.app.ActionBarActivity; 6 import android.os.Bundle; 7 import android.view.*; 8 import android.widget.LinearLayout; 9 import android.widget.TextView; 10 11 12 public class MainActivity extends ActionBarActivity { 13 14 private LinearLayout ll; 15 16 @Override 17 protected void onCreate(Bundle savedInstanceState) { 18 super.onCreate(savedInstanceState); 19 setContentView(R.layout.activity_main); 20 21 22 ll=new LinearLayout(this); 23 ll.setBackgroundColor(Color.BLUE); 24 Window window=getWindow(); 25 WindowManager.LayoutParams layoutParams = window.getAttributes(); 26 27 layoutParams.gravity= Gravity.CENTER; 28 29 //x只有gravity设置了Left right之后才起作用 30 //y只有gravity设置了top bottom之后才起作用 31 layoutParams.x=10; 32 layoutParams.y=10; 33 layoutParams.width=WindowManager.LayoutParams.MATCH_PARENT; 34 layoutParams.height=300; 35 36 window.setAttributes(layoutParams); 37 38 WindowManager manager=getWindowManager(); 39 WindowManager.LayoutParams lp=new WindowManager.LayoutParams(); 40 lp.gravity=Gravity.TOP|Gravity.LEFT; 41 lp.x=100; 42 lp.y=10; 43 lp.width=200; 44 lp.height=30; 45 lp.type=WindowManager.LayoutParams.TYPE_SYSTEM_ALERT 46 |WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY; 47 lp.flags=WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE 48 |WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL;//用户点击悬浮窗之外区域能传递事件 49 //悬浮窗通过addView后如果悬浮窗可以获取焦点那么下层的activity将不能交互 50 manager.addView(ll,lp); 51 52 } 53 //不重写此方法会导致回退键不能用 54 @Override 55 protected void onDestroy() { 56 //释放悬浮窗 57 WindowManager manager=getWindowManager(); 58 manager.removeViewImmediate(ll); 59 super.onDestroy(); 60 } 61 62 63 }
Main
上面是activity级别的悬浮窗 activity销毁的话 悬浮窗也会销毁
下面的是系统级别的不会销毁
1 package com.bi.xuanfuchuangxitong.app; 2 3 import android.graphics.PixelFormat; 4 import android.support.v7.app.ActionBarActivity; 5 import android.os.Bundle; 6 import android.util.Log; 7 import android.view.*; 8 import android.widget.ImageView; 9 10 11 public class MainActivity extends ActionBarActivity { 12 13 14 private WindowManager.LayoutParams lp; 15 private WindowManager manager; 16 private static ImageView imageView; 17 18 @Override 19 protected void onCreate(Bundle savedInstanceState) { 20 super.onCreate(savedInstanceState); 21 setContentView(R.layout.activity_main); 22 23 manager = (WindowManager)getApplicationContext().getSystemService(WINDOW_SERVICE); 24 //利用Application来创建ImageView避免activity退出导致的Context问题 25 if(imageView!=null){ 26 manager.removeViewImmediate(imageView); 27 } 28 29 imageView = new ImageView(getApplicationContext()); 30 imageView.setImageResource(R.mipmap.ic_launcher); 31 //设置触摸监听 32 //建议使用匿名内部类来设置触摸的监听器 33 imageView.setOnTouchListener(new View.OnTouchListener() { 34 private float lastX, lastY; 35 36 @Override 37 public boolean onTouch(View v, MotionEvent event) { 38 boolean ret = false; 39 int action = event.getAction(); 40 switch (action) { 41 case MotionEvent.ACTION_DOWN: 42 lastX = event.getRawX(); 43 lastY = event.getRawY(); 44 ret = true; 45 Log.d("ff", "-->" + action); 46 break; 47 case MotionEvent.ACTION_MOVE: 48 float cx = event.getRawX(); 49 float cy = event.getRawY(); 50 float ccx = cx - lastX; 51 float ccy = cy - lastY; 52 53 lp.x += ccx; 54 lp.y += ccy; 55 //更新悬浮窗 56 manager.updateViewLayout(imageView, lp); 57 lastY=cy; 58 lastX=cx; 59 60 Log.d("ff", "-->" + action); 61 break; 62 case MotionEvent.ACTION_UP: 63 Log.d("ff", "-->" + action); 64 break; 65 } 66 67 return ret; 68 } 69 }); 70 71 72 lp = new WindowManager.LayoutParams(); 73 //对于应用程序实用的系统类型 74 //TYPE_SYSTEM_ALERT允许接收事件 TYPE_SYSTEM_OVERLAY只是悬浮 75 lp.type=WindowManager.LayoutParams.TYPE_SYSTEM_ALERT 76 |WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY; 77 lp.flags=WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE 78 |WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL;//用户点击悬浮窗之外区域能传递事件 79 lp.gravity= Gravity.LEFT|Gravity.TOP; 80 lp.x=300; 81 lp.y=300; 82 lp.width=WindowManager.LayoutParams.WRAP_CONTENT; 83 lp.height=WindowManager.LayoutParams.WRAP_CONTENT; 84 lp.format= PixelFormat.TRANSPARENT; 85 manager.addView(imageView, lp); 86 87 88 } 89 90 91 92 93 }
main
最后需要添加权限
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
时间: 2024-11-12 04:22:00