最近做了一款情侣短信小软件,感兴趣的朋友可以下载安装玩玩,那接下来的事就是总结了,把几个重要的知识点总结发上,以供日后参考。有兴趣的朋友也可以看看,迫切希望各位朋友能多多指教!
Android情侣短信软件(1)--Frame动画在悬浮窗口上的实现
本文源码下载:
具体下载目录在 /2012年资料/1月/1日/Android情侣短信软件Frame动画在悬浮窗口上的实现源码/
效果图如下:
(注:图中阿狸是动画的)
(1)悬浮窗口实现起来很简单,就是在WindowManager中添加View就即可,
WindowManager最常用的方法有3个:
<1> public abstract void addView(View view, ViewGroup.LayoutParams params) 添加View <2> public abstract void removeView(View view) 移除View <3> public abstract void updateViewLayout(View view, ViewGroup.LayoutParams params) 更改View在屏幕中的位置
然后通过WindowManager.LayoutParams可以设置悬浮窗口的属性,比如大小,在屏幕中的位置等等。
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
(2)Frame动画一点要说明,要让它start,要有一个事件去驱动它,比如说点击一个按钮!
这里我们为了让它自动播放,我们把frameAnimation.start();放入OnPreDrawListener(){}这个监听器中去触发它,触发流程图及原理如下:
然后将Frame动画看成一个View添加到WindowManager即可!
各个类结构结构如下:
闲话少说,贴代码:
Myfloatview.Java
<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; import java.util.Timer; import java.util.TimerTask; import android.content.Context; import android.content.Intent; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.graphics.Paint; import android.graphics.drawable.AnimationDrawable; import android.graphics.drawable.Drawable; import android.os.Handler; import android.os.Message; import android.util.AttributeSet; import android.view.KeyEvent; import android.view.MotionEvent; import android.view.View; import android.view.WindowManager; import android.view.ViewTreeObserver.OnPreDrawListener; import android.widget.Button; public class myfloatview extends View{ private float mTouchStartX; private float mTouchStartY; private float x; private float y; static AnimationDrawable frameAnimation = null; Context mContext = null; /* 定义一个Drawable对象 */ Drawable mBitAnimation = null; WindowManager wm=(WindowManager)getContext().getApplicationContext().getSystemService("window"); WindowManager.LayoutParams wmParams = new WindowManager.LayoutParams(); static OnPreDrawListener opdl; public myfloatview(Context context) { super(context); mContext = context; /* 实例化AnimationDrawable对象 */ frameAnimation = new AnimationDrawable(); /* 装载资源 */ //这里用一个循环了装载所有名字类似的资源 //如“a1.......15.png”的图片 //这个方法用处非常大 for (int i = 0; i <4; i++) { int id = getResources().getIdentifier("a"+ i, "drawable", mContext.getPackageName()); mBitAnimation = getResources().getDrawable(id); /* 为动画添加一帧 */ //参数mBitAnimation是该帧的图片 //参数100是该帧显示的时间,按毫秒计算 frameAnimation.addFrame(mBitAnimation, 100); } frameAnimation.setOneShot( false ); /* 设置播放模式是否循环false表示循环而true表示不循环 */ this.setBackgroundDrawable(frameAnimation); opdl=new OnPreDrawListener(){ @Override public boolean onPreDraw() { frameAnimation.start(); return true; } }; this.getViewTreeObserver().addOnPreDrawListener(opdl); } public void onDraw(Canvas canvas) { super.onDraw(canvas); } public boolean onTouchEvent(MotionEvent event) { //获取相对屏幕的坐标,即以屏幕左上角为原点 x = event.getRawX(); y = event.getRawY()-25; //25是系统状态栏的高度 switch (event.getAction()) { case MotionEvent.ACTION_DOWN: //获取相对View的坐标,即以此View左上角为原点 mTouchStartX = event.getX(); mTouchStartY = event.getY(); break; case MotionEvent.ACTION_MOVE: updateViewPosition(); break; case MotionEvent.ACTION_UP: updateViewPosition(); mTouchStartX=mTouchStartY=0; Intent i=new Intent(mContext,MyFloatWindowActivity.class); //当手指抬起时,返回主界面 i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); mContext.startActivity(i); break; } return true; } private void updateViewPosition(){ //更新浮动窗口位置参数 wmParams.x=(int)( x-mTouchStartX-136); wmParams.y=(int) (y-mTouchStartY-136); wmParams.width=136; wmParams.height= 136; wmParams.type=2002; //type是关键,这里的2002表示系统级窗口,你也可以试试2003。 wmParams.format=1; wmParams.flags=40; wm.updateViewLayout(this, wmParams); } }