实现原理:

使用SurfaceView一直重绘实现该动画效果

先看效果图:


代码实现:

a,黑块渐渐消失,最后显示图片

package com.open.turnpage;import android.graphics.Bitmap;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;import android.graphics.PaintFlagsDrawFilter;import android.graphics.Rect;import android.view.SurfaceHolder;/** *  * @author yanglonghui * */public class BlackSquareZoomIn implements ITurnPage {private int duration=850;//动画持续时间private final int leafNum=5;private PaintFlagsDrawFilter pdf=new PaintFlagsDrawFilter(0, Paint.ANTI_ALIAS_FLAG|Paint.FILTER_BITMAP_FLAG);public BlackSquareZoomIn() {// TODO Auto-generated constructor stub}@Overridepublic void onCreate() {// TODO Auto-generated method stub}@Overridepublic void onTurnPageDraw(SurfaceHolder holder, Bitmap[] bitmap,int maxWidth, int maxHeight) {int dx=(maxWidth-bitmap[0].getWidth())/2;int dy=(maxHeight-bitmap[0].getHeight())/2;int perWidth=maxWidth/leafNum;int row=maxHeight/perWidth;int perHeight=maxHeight/row;Rect[][] array=new Rect[row][leafNum];for(int i=0;i<array.length;i++){for(int j=0;j<array[i].length;j++){array[i][j]=new Rect();array[i][j].set(j*perWidth, i*perHeight, (j+1)*perWidth, (i+1)*perHeight);if(j==array[i].length-1){array[i][j].set(maxWidth-perWidth, array[i][j].top, maxWidth, array[i][j].bottom);}if(i==array.length-1){array[i][j].set(array[i][j].left, maxHeight-perHeight, array[i][j].right, maxHeight);}}}long start=System.currentTimeMillis();long runMills=0;Paint mRectPaint=new Paint();mRectPaint.setColor(Color.BLACK);Rect drawRect=new Rect();Canvas canvas=null;boolean isRunning=true;while(isRunning){isRunning=((runMills=(System.currentTimeMillis()-start))<duration);if(!isRunning){runMills=duration;}try {canvas=holder.lockCanvas(null);canvas.setDrawFilter(pdf);canvas.drawColor(Color.BLACK);// 清除画布canvas.drawBitmap(bitmap[0], dx, dy, null);for(int i=0;i<array.length;i++){for(int j=0;j<array[i].length;j++){drawRect.set(array[i][j]);int _dx = (int)(((float)runMills/(float)duration)*drawRect.width()/2);int _dy = (int)(((float)runMills/(float)duration)*drawRect.height()/2);drawRect.inset(_dx, _dy);canvas.drawRect(drawRect, mRectPaint);}}} catch (Exception e) {e.printStackTrace();}finally{if(null!=canvas){holder.unlockCanvasAndPost(canvas);}else{break;}if(!isRunning){break;}}}}@Overridepublic void onDestory() {// TODO Auto-generated method stub}}

b,图片以方块渐渐显示

package com.open.turnpage;import android.graphics.Bitmap;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;import android.graphics.PaintFlagsDrawFilter;import android.graphics.Rect;import android.view.SurfaceHolder;/** *  * @author yanglonghui * */public class BlackSquareFadeAway implements ITurnPage {private int duration=850;//动画持续时间private final int leafNum=5;private PaintFlagsDrawFilter pdf=new PaintFlagsDrawFilter(0, Paint.ANTI_ALIAS_FLAG|Paint.FILTER_BITMAP_FLAG);public BlackSquareFadeAway() {// TODO Auto-generated constructor stub}@Overridepublic void onCreate() {// TODO Auto-generated method stub}@Overridepublic void onTurnPageDraw(SurfaceHolder holder, Bitmap[] bitmap,int maxWidth, int maxHeight) {int dx=(maxWidth-bitmap[0].getWidth())/2;int dy=(maxHeight-bitmap[0].getHeight())/2;int perWidth=maxWidth/leafNum;int row=maxHeight/perWidth;int perHeight=maxHeight/row;Rect[][] array=new Rect[row][leafNum];for(int i=0;i<array.length;i++){for(int j=0;j<array[i].length;j++){array[i][j]=new Rect();array[i][j].set(j*perWidth, i*perHeight, (j+1)*perWidth, (i+1)*perHeight);if(j==array[i].length-1){array[i][j].set(maxWidth-perWidth, array[i][j].top, maxWidth, array[i][j].bottom);}if(i==array.length-1){array[i][j].set(array[i][j].left, maxHeight-perHeight, array[i][j].right, maxHeight);}}}long start=System.currentTimeMillis();long runMills=0;Paint mRectPaint=new Paint();mRectPaint.setColor(Color.BLACK);Rect drawRect=new Rect();Canvas canvas=null;boolean isRunning=true;while(isRunning){isRunning=((runMills=(System.currentTimeMillis()-start))<duration);if(!isRunning){runMills=duration;}try {canvas=holder.lockCanvas(null);canvas.setDrawFilter(pdf);canvas.drawColor(Color.BLACK);// 清除画布if(!isRunning){canvas.drawBitmap(bitmap[0], dx, dy, null);}else{canvas.save();canvas.translate(dx, dy);for(int i=0;i<array.length;i++){for(int j=0;j<array[i].length;j++){drawRect.set(array[i][j]);int _dx = drawRect.width()/2-(int)(((float)runMills/(float)duration)*drawRect.width()/2);int _dy = drawRect.height()/2-(int)(((float)runMills/(float)duration)*drawRect.height()/2);drawRect.inset(_dx, _dy);canvas.drawBitmap(bitmap[0], drawRect, drawRect, null);}}canvas.restore();}} catch (Exception e) {e.printStackTrace();}finally{if(null!=canvas){holder.unlockCanvasAndPost(canvas);}else{break;}if(!isRunning){break;}}}}@Overridepublic void onDestory() {// TODO Auto-generated method stub}}

demo代码参见 csdn:http://download.csdn.net/detail/zz7zz7zz/6715605



更多相关文章

  1. Android(安卓)属性动画(二)
  2. Android_Canvas_Bitmap_关系
  3. Android动画之translate(位移动画)
  4. Android动画学习笔记-Android(安卓)Animation
  5. Android中的Animation使用
  6. BaseRecyclerViewAdapterHelper
  7. [Android5.1]开机动画显示工作流程分析
  8. Android(安卓)Frame动画demo
  9. Android:自绘动画实践——以Tencent OS录音机波形为例

随机推荐

  1. android4.0创建AVD后,打开虚拟机黑屏问题
  2. Android下Speex库除0错误(SIGFPE)排除
  3. and 使用以及添加一个自己的mime type在C
  4. 《H5 App开发》判断当前环境是Android还
  5. Android构建报错:Android resource linkin
  6. android linux 基础知识总结
  7. Android 获取设备信息
  8. android的单元测试摘要
  9. 虚拟键盘弹出时挡住EditText的解决方案
  10. Android01————快速入门