标签:
这里介绍的是一个浮动窗口以及用该浮动窗口显示当前在顶层的应用信息~一个需要写2个layout和2个java
在MainActivity中主要是那两个按钮的的监听事件,通过Intent启动和关闭另一个activity.
1 public class MainActivity extends Activity { 2 @Override 3 public void onCreate(Bundle savedInstanceState) { 4 super.onCreate(savedInstanceState); 5 setContentView(R.layout.main); 6 // FloatingWindowActivity的布局视图按钮 7 Button start = (Button) findViewById(R.id.start_id); 8 Button remove = (Button) findViewById(R.id.remove_id); 9 start.setOnClickListener(new OnClickListener() { 10 @Override 11 public void onClick(View v) { 12 // TODO Auto-generated method stub 13 Intent intent = new Intent(MainActivity.this, FxService.class); 14 startService(intent); 15 finish(); 16 } 17 }); 18 19 remove.setOnClickListener(new OnClickListener() { 20 @Override 21 public void onClick(View v) { 22 Intent intent = new Intent(MainActivity.this, FxService.class); 23 stopService(intent); 24 } 25 }); 26 27 } 28 }
另一个FxService则是悬浮窗的全部实现:其中核心都是在createFloatView()函数中实现的,因为在onCreate中调用的是这个函数。在该函数中首先对悬浮窗的一些属性进行设置,然后写其触摸和点击事件,触摸事件中主要是移动悬浮窗位置;点击事件主要是获取上层活动activity的packageName[80-82],然后根据包名获得进程名[84-86],下面就是根据获得的信息来更新悬浮窗的显示了并toast.
1 private void createFloatView() { 2 wmParams = new WindowManager.LayoutParams(); 3 // 获取WindowManagerImpl.CompatModeWrapper 4 mWindowManager = (WindowManager) getApplication().getSystemService( 5 getApplication().WINDOW_SERVICE); 6 // 设置window type 7 wmParams.type = LayoutParams.TYPE_PHONE; 8 // 设置图片格式,效果为背景透明 9 wmParams.format = PixelFormat.RGBA_8888; 10 // 设置浮动窗口不可聚焦(实现操作除浮动窗口外的其他可见窗口的操作) 11 wmParams.flags = 12 // LayoutParams.FLAG_NOT_TOUCH_MODAL | 13 LayoutParams.FLAG_NOT_FOCUSABLE 14 // LayoutParams.FLAG_NOT_TOUCHABLE 15 ; 16 17 // 调整悬浮窗显示的停靠位置为左侧置顶 18 wmParams.gravity = Gravity.LEFT | Gravity.TOP; 19 20 // 以屏幕左上角为原点,设置x、y初始值 21 wmParams.x = 0; 22 wmParams.y = 0; 23 24 /* 25 * // 设置悬浮窗口长宽数据 wmParams.width = 200; wmParams.height = 80; 26 */ 27 28 // 设置悬浮窗口长宽数据 29 wmParams.width = WindowManager.LayoutParams.WRAP_CONTENT; 30 wmParams.height = WindowManager.LayoutParams.WRAP_CONTENT; 31 32 LayoutInflater inflater = LayoutInflater.from(getApplication()); 33 // 获取浮动窗口视图所在布局 34 mFloatLayout = (LinearLayout) inflater.inflate(R.layout.float_layout, 35 null); 36 // 添加mFloatLayout 37 mWindowManager.addView(mFloatLayout, wmParams); 38 39 Log.i(TAG, "mFloatLayout-->left" + mFloatLayout.getLeft()); 40 Log.i(TAG, "mFloatLayout-->right" + mFloatLayout.getRight()); 41 Log.i(TAG, "mFloatLayout-->top" + mFloatLayout.getTop()); 42 Log.i(TAG, "mFloatLayout-->bottom" + mFloatLayout.getBottom()); 43 44 // 浮动窗口按钮 45 mFloatView = (Button) mFloatLayout.findViewById(R.id.float_id); 46 mFloatLayout.measure(View.MeasureSpec.makeMeasureSpec(0, 47 View.MeasureSpec.UNSPECIFIED), View.MeasureSpec 48 .makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED)); 49 Log.i(TAG, "Width/2--->" + mFloatView.getMeasuredWidth() / 2); 50 Log.i(TAG, "Height/2--->" + mFloatView.getMeasuredHeight() / 2); 51 // 设置监听浮动窗口的触摸移动 52 mFloatView.setOnTouchListener(new OnTouchListener() { 53 54 @Override 55 public boolean onTouch(View v, MotionEvent event) { 56 // TODO Auto-generated method stub 57 // getRawX是触摸位置相对于屏幕的坐标,getX是相对于按钮的坐标 58 wmParams.x = (int) event.getRawX() 59 - mFloatView.getMeasuredWidth() / 2; 60 // Log.i(TAG, "Width/2--->" + mFloatView.getMeasuredWidth()/2); 61 Log.i(TAG, "RawX" + event.getRawX()); 62 Log.i(TAG, "X" + event.getX()); 63 // 25为状态栏的高度 64 wmParams.y = (int) event.getRawY() 65 - mFloatView.getMeasuredHeight() / 2 - 25; 66 // Log.i(TAG, "Width/2--->" + mFloatView.getMeasuredHeight()/2); 67 Log.i(TAG, "RawY" + event.getRawY()); 68 Log.i(TAG, "Y" + event.getY()); 69 // 刷新 70 mWindowManager.updateViewLayout(mFloatLayout, wmParams); 71 return false; 72 } 73 }); 74 75 mFloatView.setOnClickListener(new OnClickListener() { 76 @Override 77 public void onClick(View v) {//显示当前是哪个应用在顶层 78 // TODO Auto-generated method stub 79 pm = getPackageManager(); 80 am = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE); 81 String packageName = am.getRunningTasks(1).get(0).topActivity 82 .getPackageName(); 83 try { 84 String progressName = pm.getApplicationLabel( 85 pm.getApplicationInfo(packageName, 86 PackageManager.GET_META_DATA)).toString(); 87 mFloatView = (Button) mFloatLayout 88 .findViewById(R.id.float_id); 89 mFloatView.setText(progressName); 90 Toast.makeText(FxService.this, progressName, 91 Toast.LENGTH_SHORT).show(); 92 } catch (NameNotFoundException e) { 93 // TODO Auto-generated catch block 94 e.printStackTrace(); 95 } 96 } 97 }); 98 }
注意:如果想获得系统的TopActivity,还必须获得权限:
<uses-permission android:name="android.permission.GET_TASKS" />
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
本文链接:http://www.cnblogs.com/zjutlitao/p/4231525.html
更多精彩:http://www.cnblogs.com/zjutlitao/
github: https://github.com/beautifulzzzz/Android/tree/master/FloatingWindow
标签:
原文地址:http://www.cnblogs.com/zjutlitao/p/4231525.html