Android情侣短信软件Frame动画在悬浮窗口上的实现


最近做了一款情侣短信小软件,感兴趣的朋友可以下载安装玩玩,那接下来的事就是总结了,把几个重要的知识点总结发上,以供日后参考。有兴趣的朋友也可以看看,迫切希望各位朋友能多多指教!

Android情侣短信软件(1)--Frame动画在悬浮窗口上的实现

本文源码下载:

免费下载地址在 http://linux.bkjia.com/

用户名与密码都是www.bkjia.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. }  
  • 1
  • 2
  • 下一页

相关内容