在
PhoneWindowManager中添加如下方法
private static final int END_ANIMATION = 101;
private static final int PREPARE_ANIMATION = 102;
private static final int PLAY_ANIMATION = 103;
private AnimateCharContainer container = null;
private AnimationEndCallBack mEndCallBack = new AnimationEndCallBack() {
@Override
public void onAnimationEnd() {
// TODO Auto-generated method stub
myHandler.sendEmptyMessage(END_ANIMATION);
}
};
private void PrepareGestureAnimation(){
if(container == null){
container = new AnimateCharContainer(mContext);
container.setEndCallBack(mEndCallBack);
}
container.setKeyCode(mKeycode);
if(container != null){
WindowManager wm = (WindowManager)mContext.getSystemService(Context.WINDOW_SERVICE);
try{
wm.removeView(container);
}catch (Exception e){
}
WindowManager.LayoutParams lp = new WindowManager.LayoutParams(
WindowManager.LayoutParams.MATCH_PARENT,
WindowManager.LayoutParams.MATCH_PARENT);
lp.type = WindowManager.LayoutParams.TYPE_SECURE_SYSTEM_OVERLAY;
lp.flags = WindowManager.LayoutParams.FLAG_FULLSCREEN
| WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE
| WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
| WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN;
lp.format = PixelFormat.OPAQUE;
lp.setTitle("SmartWake");
lp.inputFeatures |= WindowManager.LayoutParams.INPUT_FEATURE_NO_INPUT_CHANNEL;
wm.addView(container, lp);
container.setVisibility(View.VISIBLE);
return;
}
}
AnimateCharContainer类
package android.widget;
import com.android.internal.R;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Color;
import android.util.AttributeSet;
import android.util.Log;
import android.view.KeyEvent;
import android.view.View;
import android.widget.LinearLayout;
import android.view.Gravity;
import android.os.Handler;
import android.os.Message;
public class AnimateCharContainer extends LinearLayout {
private static String TAG = "AnimateCharContainer";
private static final int MSG_DISMISS_VIEW = 0x01;
private static final long ANIMATION_DURATION = 600L;
private int IMAGE_WIDTH_NORMAL = 300; //C,W,E,O
private int IMAGE_WIDTH_NARROW = 50; //UP
private int mKeyCode;
private AnimateCharView charView;
private ImageView cameraImage;
private int mCameraImageId;
private int mImageC;
private int mImageE;
private int mImageO;
private int mImageUP;
private int mImageW;
private int mImageReverseO;
private int mImageM;
private int mImageU;
private int mImageV;
private int mImageS;
private AnimationEndCallBack mEndCallBack = null;
public static abstract interface AnimationEndCallBack {
public abstract void onAnimationEnd();
}
private Handler mHandler = new Handler(){
@Override
public void handleMessage(Message msg){
switch(msg.what){
case MSG_DISMISS_VIEW:
dismiss();
break;
default:
break ;
}
super.handleMessage(msg);
}
};
public AnimateCharContainer(Context context) {
this(context, null, 0);
// TODO Auto-generated constructor stub
}
public AnimateCharContainer(Context context, AttributeSet attrs) {
this(context, attrs, 0);
// TODO Auto-generated constructor stub
}
public AnimateCharContainer(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
// TODO Auto-generated constructor stub
mKeyCode = -1;
charView = new AnimateCharView(context);
mImageC = R.drawable.smart_wake_c;
mImageE = R.drawable.smart_wake_e;
mImageO = R.drawable.smart_wake_o;
mImageUP = R.drawable.smart_wake_up;
mImageW = R.drawable.smart_wake_w;
mImageM = R.drawable.smart_wake_m;
setBackgroundColor(Color.BLACK);
setGravity(Gravity.CENTER);
}
public void setEndCallBack( AnimationEndCallBack callback){
mEndCallBack = callback;
charView.setEndCallBack(callback);
}
public void setKeyCode(int keycode){
mKeyCode = keycode;
}
public int getKeyCode(){
return mKeyCode;
}
public void startAnimation(){
//clear
removeAllViews();
LinearLayout.LayoutParams lp;
switch(mKeyCode){
case KeyEvent.KEYCODE_C:
Bitmap bitmapC = BitmapFactory.decodeResource(getResources(), mImageC);
charView.setBitmapSource(bitmapC);
charView.setBitmapSize(IMAGE_WIDTH_NORMAL, IMAGE_WIDTH_NORMAL);
lp = new LinearLayout.LayoutParams(IMAGE_WIDTH_NORMAL, IMAGE_WIDTH_NORMAL);
addView(charView, lp);
break;
case KeyEvent.KEYCODE_E:
Bitmap bitmapE = BitmapFactory.decodeResource(getResources(), mImageE);
charView.setBitmapSource(bitmapE);
charView.setBitmapSize(IMAGE_WIDTH_NORMAL, IMAGE_WIDTH_NORMAL);
lp = new LinearLayout.LayoutParams(IMAGE_WIDTH_NORMAL, IMAGE_WIDTH_NORMAL);
addView(charView, lp);
break;
case KeyEvent.KEYCODE_O:
Bitmap bitmapO = BitmapFactory.decodeResource(getResources(), mImageO);
charView.setBitmapSource(bitmapO);
charView.setBitmapSize(IMAGE_WIDTH_NORMAL, IMAGE_WIDTH_NORMAL);
lp = new LinearLayout.LayoutParams(IMAGE_WIDTH_NORMAL, IMAGE_WIDTH_NORMAL);
addView(charView, lp);
break;
case KeyEvent.KEYCODE_W:
Bitmap bitmapW = BitmapFactory.decodeResource(getResources(), mImageW);
charView.setBitmapSource(bitmapW);
charView.setBitmapSize(IMAGE_WIDTH_NORMAL, IMAGE_WIDTH_NORMAL);
lp = new LinearLayout.LayoutParams(IMAGE_WIDTH_NORMAL, IMAGE_WIDTH_NORMAL);
addView(charView, lp);
break;
case KeyEvent.KEYCODE_M:
Bitmap bitmapM = BitmapFactory.decodeResource(getResources(), mImageM);
charView.setBitmapSource(bitmapM);
charView.setBitmapSize(IMAGE_WIDTH_NORMAL, IMAGE_WIDTH_NORMAL);
lp = new LinearLayout.LayoutParams(IMAGE_WIDTH_NORMAL, IMAGE_WIDTH_NORMAL);
addView(charView, lp);
break;
case KeyEvent.KEYCODE_F10:
//slide up
Bitmap bitmapUp = BitmapFactory.decodeResource(getResources(), mImageUP);
charView.setBitmapSource(bitmapUp);
charView.setBitmapSize(IMAGE_WIDTH_NARROW, IMAGE_WIDTH_NORMAL);
lp = new LinearLayout.LayoutParams(IMAGE_WIDTH_NARROW, IMAGE_WIDTH_NORMAL);
addView(charView, lp);
break;
default:
Log.e(TAG, "need to set keycode first");
return;
}
charView.setDration(ANIMATION_DURATION);
charView.setVisibility(View.VISIBLE);
charView.startAnimation();
}
private void dismiss(){
if(mEndCallBack != null){
mEndCallBack.onAnimationEnd();
}
}
}
AnimateCharView类
package android.widget;
import com.android.internal.R;
import android.animation.Animator;
import android.animation.Animator.AnimatorListener;
import android.animation.ValueAnimator;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.PaintFlagsDrawFilter;
import android.graphics.Rect;
import android.util.AttributeSet;
import android.view.View;
import android.view.animation.LinearInterpolator;
import android.widget.AnimateCharContainer.AnimationEndCallBack;
public class AnimateCharView extends View
implements ValueAnimator.AnimatorUpdateListener, AnimatorListener{
private static final int VIEW_SIZE = 250;
private ValueAnimator mAnimator;
private Paint mPaint;
private Rect mSrc;
private Rect mDst;
private Rect mTempRect;
private int mWidth;
private int mHeight;
private Bitmap mBitmap;
private PaintFlagsDrawFilter mPaintFlags;
private AnimationEndCallBack callback = null;
public AnimateCharView(Context context) {
this(context, null, 0);
// TODO Auto-generated constructor stub
}
public AnimateCharView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
// TODO Auto-generated constructor stub
}
public AnimateCharView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
// TODO Auto-generated constructor stub
mAnimator = ValueAnimator.ofFloat(new float[]{0.0f, 1.0f});
mAnimator.addListener(this);
mAnimator.addUpdateListener(this);
mAnimator.setInterpolator(new LinearInterpolator());
mPaint = new Paint();
mPaint.setAntiAlias(true);
mPaintFlags = new PaintFlagsDrawFilter(0,
Paint.ANTI_ALIAS_FLAG | Paint.FILTER_BITMAP_FLAG);
mSrc = new Rect(0, 0, 0, 0);
mDst = new Rect(0, 0, VIEW_SIZE, VIEW_SIZE);
mTempRect = new Rect();
mBitmap = null;
mWidth = 0;
mHeight = 0;
}
@Override
protected void onDraw(Canvas canvas) {
// TODO Auto-generated method stub
super.onDraw(canvas);
drawChar(canvas);
}
private void drawChar(Canvas canvas){
canvas.save();
canvas.setDrawFilter(mPaintFlags);
if((mBitmap != null) && !(mBitmap.isRecycled())){
int index = (int)(20.0f * mAnimator.getAnimatedFraction());
if(index >= 20)
index = 20;
mSrc = getClipRect(index, mTempRect);
canvas.drawBitmap(mBitmap, mSrc, mDst, mPaint);
}
canvas.restore();
}
private Rect getClipRect(int index, Rect tempRect){
int i = index % 4;
int j = index / 4;
tempRect.left = (i*mWidth);
tempRect.top = (j*mHeight);
tempRect.right = tempRect.left + mWidth;
tempRect.bottom = tempRect.top + mHeight;
return tempRect;
}
@Override
public void onAnimationUpdate(ValueAnimator animation) {
// TODO Auto-generated method stub
invalidate();
}
@Override
public void onAnimationCancel(Animator animation) {
// TODO Auto-generated method stub
}
@Override
public void onAnimationEnd(Animator animation) {
// TODO Auto-generated method stub
recycle();
if(callback != null){
callback.onAnimationEnd();
}
}
private void recycle() {
// TODO Auto-generated method stub
if ((mBitmap == null) || mBitmap.isRecycled())
return ;
mBitmap.recycle();
mBitmap = null;
}
@Override
public void onAnimationRepeat(Animator animation) {
// TODO Auto-generated method stub
}
@Override
public void onAnimationStart(Animator animation) {
// TODO Auto-generated method stub
}
public void setBitmapSource(Bitmap bitmap){
mBitmap = bitmap;
}
public void setBitmapSize(int width, int height){
mWidth = width;
mHeight = height;
mDst.right = mDst.left + width;
mDst.bottom = mDst.top + height;
}
public void setDration(long duration){
mAnimator.setDuration(duration);
}
public void startAnimation(){
mAnimator.start();
}
public void endAnimation(){
mAnimator.end();
}
public void setEndCallBack( AnimationEndCallBack callback){
this.callback = callback;
}
}
这些只是实现的关键代码,其他省略