歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Android情侶短信軟件Frame動畫在懸浮窗口上的實現

Android情侶短信軟件Frame動畫在懸浮窗口上的實現

日期:2017/3/1 10:41:35   编辑:Linux編程

最近做了一款情侶短信小軟件,感興趣的朋友可以下載安裝玩玩,那接下來的事就是總結了,把幾個重要的知識點總結發上,以供日後參考。有興趣的朋友也可以看看,迫切希望各位朋友能多多指教!

Android情侶短信軟件(1)--Frame動畫在懸浮窗口上的實現

本文源碼下載:

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

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

具體下載目錄在 /2012年資料/1月/1日/Android情侶短信軟件Frame動畫在懸浮窗口上的實現源碼/

效果圖如下:

(注:圖中阿狸是動畫的)

(1)懸浮窗口實現起來很簡單,就是在WindowManager中添加View就即可,

WindowManager最常用的方法有3個:

  1. <1> public abstract void addView(View view, ViewGroup.LayoutParams params) 添加View
  2. <2> public abstract void removeView(View view) 移除View
  3. <3> public abstract void updateViewLayout(View view, ViewGroup.LayoutParams params) 更改View在屏幕中的位置

然後通過WindowManager.LayoutParams可以設置懸浮窗口的屬性,比如大小,在屏幕中的位置等等。

  1. <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />

(2)Frame動畫一點要說明,要讓它start,要有一個事件去驅動它,比如說點擊一個按鈕!

這裡我們為了讓它自動播放,我們把frameAnimation.start();放入OnPreDrawListener(){}這個監聽器中去觸發它,觸發流程圖及原理如下:

然後將Frame動畫看成一個View添加到WindowManager即可!

各個類結構結構如下:

閒話少說,貼代碼:

Myfloatview.Java

  1. <pre class="java" name="code"><pre class="html" name="code"><pre class="plain" name="code"><p> </p><p> </p><p> </p><p> </p><p> </p><p> </p><p> </p><p> </p><p><strong></strong> </p><p> </p><pre class="plain" name="code">package com.myFloatWindow;
  2. import java.util.Timer;
  3. import java.util.TimerTask;
  4. import android.content.Context;
  5. import android.content.Intent;
  6. import android.graphics.Bitmap;
  7. import android.graphics.BitmapFactory;
  8. import android.graphics.Canvas;
  9. import android.graphics.Paint;
  10. import android.graphics.drawable.AnimationDrawable;
  11. import android.graphics.drawable.Drawable;
  12. import android.os.Handler;
  13. import android.os.Message;
  14. import android.util.AttributeSet;
  15. import android.view.KeyEvent;
  16. import android.view.MotionEvent;
  17. import android.view.View;
  18. import android.view.WindowManager;
  19. import android.view.ViewTreeObserver.OnPreDrawListener;
  20. import android.widget.Button;
  21. public class myfloatview extends View{
  22. private float mTouchStartX;
  23. private float mTouchStartY;
  24. private float x;
  25. private float y;
  26. static AnimationDrawable frameAnimation = null;
  27. Context mContext = null;
  28. /* 定義一個Drawable對象 */
  29. Drawable mBitAnimation = null;
  30. WindowManager wm=(WindowManager)getContext().getApplicationContext().getSystemService("window");
  31. WindowManager.LayoutParams wmParams = new WindowManager.LayoutParams();
  32. static OnPreDrawListener opdl;
  33. public myfloatview(Context context)
  34. {
  35. super(context);
  36. mContext = context;
  37. /* 實例化AnimationDrawable對象 */
  38. frameAnimation = new AnimationDrawable();
  39. /* 裝載資源 */
  40. //這裡用一個循環了裝載所有名字類似的資源
  41. //如“a1.......15.png”的圖片
  42. //這個方法用處非常大
  43. for (int i = 0; i <4; i++)
  44. {
  45. int id = getResources().getIdentifier("a"+ i, "drawable", mContext.getPackageName());
  46. mBitAnimation = getResources().getDrawable(id);
  47. /* 為動畫添加一幀 */
  48. //參數mBitAnimation是該幀的圖片
  49. //參數100是該幀顯示的時間,按毫秒計算
  50. frameAnimation.addFrame(mBitAnimation, 100);
  51. }
  52. frameAnimation.setOneShot( false ); /* 設置播放模式是否循環false表示循環而true表示不循環 */
  53. this.setBackgroundDrawable(frameAnimation);
  54. opdl=new OnPreDrawListener(){
  55. @Override
  56. public boolean onPreDraw() {
  57. frameAnimation.start();
  58. return true;
  59. }
  60. };
  61. this.getViewTreeObserver().addOnPreDrawListener(opdl);
  62. }
  63. public void onDraw(Canvas canvas)
  64. {
  65. super.onDraw(canvas);
  66. }
  67. public boolean onTouchEvent(MotionEvent event) {
  68. //獲取相對屏幕的坐標,即以屏幕左上角為原點
  69. x = event.getRawX();
  70. y = event.getRawY()-25; //25是系統狀態欄的高度
  71. switch (event.getAction()) {
  72. case MotionEvent.ACTION_DOWN:
  73. //獲取相對View的坐標,即以此View左上角為原點
  74. mTouchStartX = event.getX();
  75. mTouchStartY = event.getY();
  76. break;
  77. case MotionEvent.ACTION_MOVE:
  78. updateViewPosition();
  79. break;
  80. case MotionEvent.ACTION_UP:
  81. updateViewPosition();
  82. mTouchStartX=mTouchStartY=0;
  83. Intent i=new Intent(mContext,MyFloatWindowActivity.class); //當手指抬起時,返回主界面
  84. i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
  85. mContext.startActivity(i);
  86. break;
  87. }
  88. return true;
  89. }
  90. private void updateViewPosition(){
  91. //更新浮動窗口位置參數
  92. wmParams.x=(int)( x-mTouchStartX-136);
  93. wmParams.y=(int) (y-mTouchStartY-136);
  94. wmParams.width=136;
  95. wmParams.height= 136;
  96. wmParams.type=2002; //type是關鍵,這裡的2002表示系統級窗口,你也可以試試2003。
  97. wmParams.format=1;
  98. wmParams.flags=40;
  99. wm.updateViewLayout(this, wmParams);
  100. }
  101. }
Copyright © Linux教程網 All Rights Reserved