標籤:
這裡介紹的是一個浮動視窗以及用該浮動視窗顯示當前在頂層的應用資訊~一個需要寫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" />
本文連結:http://www.cnblogs.com/zjutlitao/p/4231525.html
更多精彩:http://www.cnblogs.com/zjutlitao/
github: https://github.com/beautifulzzzz/Android/tree/master/FloatingWindow
[安卓] 10、懸浮窗與擷取其他任務資訊