歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Android懸浮窗--獲取內存

Android懸浮窗--獲取內存

日期:2017/3/1 10:51:07   编辑:Linux編程

首先,得先說明,這個例子並不是我寫的,是從Android的一個帖子上面看到的,下載了他的源代碼,然後分析一下,供學習共享。(另外,對於其代碼有所修改,以便於更好的說明問題,另:同時把源代碼上傳,下載地址:

免費下載地址在 http://linux.linuxidc.com/

用戶名與密碼都是www.linuxidc.com

具體下載目錄在 /pub/Android源碼集錦/2011年/12月/Android懸浮窗--獲取內存/

一開始,我們先看一下運行效果:

其中,

這一塊就是懸浮窗,可以隨意拖動,動態顯示當前內存使用量。

下面看一下代碼是如何實現的:

懸浮窗的實現是用了一個service,為什麼要用service呢?了解service特點的大體就會明白。下面看一下:

  1. public class FloatService extends Service {
  2. WindowManager wm = null;
  3. WindowManager.LayoutParams wmParams = null;
  4. View view;
  5. private float mTouchStartX;
  6. private float mTouchStartY;
  7. private float x;
  8. private float y;
  9. int state;
  10. TextView tx1;
  11. TextView tx;
  12. ImageView iv;
  13. private float StartX;
  14. private float StartY;
  15. int delaytime=1000;
  16. @Override
  17. public void onCreate() {
  18. Log.d("FloatService", "onCreate");
  19. super.onCreate();
  20. view = LayoutInflater.from(this).inflate(R.layout.floating, null);
  21. tx = (TextView) view.findViewById(R.id.memunused);
  22. tx1 = (TextView) view.findViewById(R.id.memtotal);
  23. tx.setText("" + memInfo.getmem_UNUSED(this) + "KB");
  24. tx1.setText("" + memInfo.getmem_TOLAL() + "KB");
  25. iv = (ImageView) view.findViewById(R.id.img2);
  26. iv.setVisibility(View.GONE);
  27. createView();
  28. handler.postDelayed(task, delaytime);
  29. }
  30. private void createView() {
  31. // 獲取WindowManager
  32. wm = (WindowManager) getApplicationContext().getSystemService("window");
  33. // 設置LayoutParams(全局變量)相關參數
  34. wmParams = new WindowManager.LayoutParams();
  35. wmParams.type = 2002;
  36. wmParams.flags |= 8;
  37. wmParams.gravity = Gravity.LEFT | Gravity.TOP; // 調整懸浮窗口至左上角
  38. // 以屏幕左上角為原點,設置x、y初始值
  39. wmParams.x = 0;
  40. wmParams.y = 0;
  41. // 設置懸浮窗口長寬數據
  42. wmParams.width = WindowManager.LayoutParams.WRAP_CONTENT;
  43. wmParams.height = WindowManager.LayoutParams.WRAP_CONTENT;
  44. wmParams.format = 1;
  45. wm.addView(view, wmParams);
  46. view.setOnTouchListener(new OnTouchListener() {
  47. public boolean onTouch(View v, MotionEvent event) {
  48. // 獲取相對屏幕的坐標,即以屏幕左上角為原��
  49. x = event.getRawX();
  50. y = event.getRawY() - 25; // 25是系統狀態欄的高度
  51. Log.i("currP", "currX" + x + "====currY" + y);// 調試信息
  52. switch (event.getAction()) {
  53. case MotionEvent.ACTION_DOWN:
  54. state = MotionEvent.ACTION_DOWN;
  55. StartX = x;
  56. StartY = y;
  57. // 獲取相對View的坐標,即以此View左上角為原點
  58. mTouchStartX = event.getX();
  59. mTouchStartY = event.getY();
  60. Log.i("startP", "startX" + mTouchStartX + "====startY"
  61. + mTouchStartY);// 調試信息
  62. break;
  63. case MotionEvent.ACTION_MOVE:
  64. state = MotionEvent.ACTION_MOVE;
  65. updateViewPosition();
  66. break;
  67. case MotionEvent.ACTION_UP:
  68. state = MotionEvent.ACTION_UP;
  69. updateViewPosition();
  70. showImg();
  71. mTouchStartX = mTouchStartY = 0;
  72. break;
  73. }
  74. return true;
  75. }
  76. });
  77. iv.setOnClickListener(new OnClickListener() {
  78. @Override
  79. public void onClick(View v) {
  80. // TODO Auto-generated method stub
  81. Intent serviceStop = new Intent();
  82. serviceStop.setClass(FloatService.this, FloatService.class);
  83. stopService(serviceStop);
  84. }
  85. });
  86. }
  87. public void showImg() {
  88. if (Math.abs(x - StartX) < 1.5 && Math.abs(y - StartY) < 1.5
  89. && !iv.isShown()) {
  90. iv.setVisibility(View.VISIBLE);
  91. } else if (iv.isShown()) {
  92. iv.setVisibility(View.GONE);
  93. }
  94. }
  95. private Handler handler = new Handler();
  96. private Runnable task = new Runnable() {
  97. public void run() {
  98. // TODO Auto-generated method stub
  99. dataRefresh();
  100. handler.postDelayed(this, delaytime);
  101. wm.updateViewLayout(view, wmParams);
  102. }
  103. };
  104. public void dataRefresh() {
  105. tx.setText("" + memInfo.getmem_UNUSED(this) + "KB");
  106. tx1.setText("" + memInfo.getmem_TOLAL() + "KB");
  107. }
  108. private void updateViewPosition() {
  109. // 更新浮動窗口位置參數
  110. wmParams.x = (int) (x - mTouchStartX);
  111. wmParams.y = (int) (y - mTouchStartY);
  112. wm.updateViewLayout(view, wmParams);
  113. }
  114. @Override
  115. public void onStart(Intent intent, int startId) {
  116. Log.d("FloatService", "onStart");
  117. setForeground(true);
  118. super.onStart(intent, startId);
  119. }
  120. @Override
  121. public void onDestroy() {
  122. handler.removeCallbacks(task);
  123. Log.d("FloatService", "onDestroy");
  124. wm.removeView(view);
  125. super.onDestroy();
  126. }
  127. @Override
  128. public IBinder onBind(Intent intent) {
  129. return null;
  130. }
  131. }
Copyright © Linux教程網 All Rights Reserved