歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

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

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

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