这里介绍的是一个浮动窗口以及用该浮动窗口显示当前在顶层的应用信息~一个需要写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 @Override11 public void onClick(View v) {12 // TODO Auto-generated method stub13 Intent intent = new Intent(MainActivity.this, FxService.class);14 startService(intent);15 finish();16 }17 });18 19 remove.setOnClickListener(new OnClickListener() {20 @Override21 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_FOCUSABLE14 // LayoutParams.FLAG_NOT_TOUCHABLE15 ;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 // 添加mFloatLayout37 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.MeasureSpec48 .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 @Override55 public boolean onTouch(View v, MotionEvent event) {56 // TODO Auto-generated method stub57 // 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 @Override77 public void onClick(View v) { //显示当前是哪个应用在顶层78 // TODO Auto-generated method stub79 pm = getPackageManager();80 am = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);81 String packageName = am.getRunningTasks(1).get(0).topActivity82 .getPackageName();83 try {84 String progressName = pm.getApplicationLabel(85 pm.getApplicationInfo(packageName,86 PackageManager.GET_META_DATA)).toString();87 mFloatView = (Button) mFloatLayout88 .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 block94 e.printStackTrace();95 }96 }97 });98 }
注意:如果想获得系统的TopActivity,还必须获得权限:
<uses-permission android:name="android.permission.GET_TASKS" />
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
本文链接:
更多精彩:
github:
本文转自beautifulzzzz博客园博客,原文链接:http://www.cnblogs.com/zjutlitao/p/4231525.html,如需转载请自行联系原作者