本文共 6482 字,大约阅读时间需要 21 分钟。
这次界面改版中有几个界面的动画实在酷炫,只有让UI出一组png用帧动画的形式展示了。心想着,这不简单:
完事~~
尼玛啊~~~~~~~~~将近6000张图片,我用脚趾头想都知道用animation-list肯定直接要爆炸了。
怎么办,么办,办?当时心情是崩溃的。
-----------------------------------------------------------------分割线-------------------------------------------------------------
聪明的大脑稍微这么一转 surfaceView
代码注释很详细不废话直接贴~~
package com.meizu.speaker.view;import android.content.Context;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.PixelFormat;import android.graphics.PorterDuff;import android.util.AttributeSet;import android.util.Log;import android.view.SurfaceHolder;import android.view.SurfaceView;import com.meizu.speaker.R;/** * Created by zhangxiaotong on 2016/11/1. */public class recycleSurfaceView extends SurfaceView implements SurfaceHolder.Callback,Runnable{ private String TAG = this.getClass().getSimpleName(); private final SurfaceHolder mHolder; private Thread mThread; private long mFrameSpaceTime = 80; // 每帧图片的间隔时间 private boolean mIsDraw = true; // 画图开关 private int mCurrentIndext = 0; // 当前正在播放的png public int mBitmapResourceIds[] = { R.mipmap.menu_00002, R.mipmap.menu_00004, R.mipmap.menu_00006, R.mipmap.menu_00008, R.mipmap.menu_00010, R.mipmap.menu_00012, R.mipmap.menu_00014, R.mipmap.menu_00016, R.mipmap.menu_00018, R.mipmap.menu_00020, R.mipmap.menu_00022, R.mipmap.menu_00024, R.mipmap.menu_00026, R.mipmap.menu_00028, R.mipmap.menu_00030, R.mipmap.menu_00032, R.mipmap.menu_00034, R.mipmap.menu_00036, R.mipmap.menu_00038, R.mipmap.menu_00040, R.mipmap.menu_00042, R.mipmap.menu_00044, R.mipmap.menu_00046, R.mipmap.menu_00048, R.mipmap.menu_00050, R.mipmap.menu_00052, R.mipmap.menu_00054, R.mipmap.menu_00056, R.mipmap.menu_00058, R.mipmap.menu_00060, R.mipmap.menu_00062, R.mipmap.menu_00064, R.mipmap.menu_00066, R.mipmap.menu_00068, R.mipmap.menu_00070, R.mipmap.menu_00072, R.mipmap.menu_00074, R.mipmap.menu_00076, R.mipmap.menu_00078, R.mipmap.menu_00080, R.mipmap.menu_00082, R.mipmap.menu_00084, R.mipmap.menu_00086, R.mipmap.menu_00088, R.mipmap.menu_00090, R.mipmap.menu_00092, R.mipmap.menu_00094, R.mipmap.menu_00096, R.mipmap.menu_00098, R.mipmap.menu_00100, R.mipmap.menu_00102, R.mipmap.menu_00104, R.mipmap.menu_00106, R.mipmap.menu_00108, R.mipmap.menu_00110, R.mipmap.menu_00112, R.mipmap.menu_00114, R.mipmap.menu_00116, R.mipmap.menu_00118, R.mipmap.menu_00120, R.mipmap.menu_00122, R.mipmap.menu_00124, R.mipmap.menu_00126, R.mipmap.menu_00128, R.mipmap.menu_00130, R.mipmap.menu_00132, R.mipmap.menu_00134, R.mipmap.menu_00136, R.mipmap.menu_00138, R.mipmap.menu_00140, R.mipmap.menu_00142, R.mipmap.menu_00144, R.mipmap.menu_00146, R.mipmap.menu_00148, R.mipmap.menu_00150, R.mipmap.menu_00152, R.mipmap.menu_00154, R.mipmap.menu_00156, R.mipmap.menu_00158, R.mipmap.menu_00160, R.mipmap.menu_00162, R.mipmap.menu_00164, R.mipmap.menu_00166, R.mipmap.menu_00168, R.mipmap.menu_00170, R.mipmap.menu_00172, R.mipmap.menu_00174, R.mipmap.menu_00176, R.mipmap.menu_00178, R.mipmap.menu_00180, R.mipmap.menu_00182, R.mipmap.menu_00184, R.mipmap.menu_00186, R.mipmap.menu_00188, R.mipmap.menu_00190, R.mipmap.menu_00000 }; private Bitmap mBitmap; public recycleSurfaceView(Context context) {this(context,null);} public recycleSurfaceView(Context context, AttributeSet attrs) {this(context,attrs,0);} public recycleSurfaceView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); mHolder = this.getHolder(); // 获得surfaceholder mHolder.addCallback(this); // 添加回调,这样三个方法才会执行 setZOrderOnTop(true); mHolder.setFormat(PixelFormat.TRANSLUCENT);// 设置背景透明 } /** 首先继承SurfaceView,并实现SurfaceHolder.Callback接口,实现它的三个方法: surfaceCreated(SurfaceHolder holder):surface创建的时候调用,一般在该方法中启动绘图的线程。 surfaceChanged(SurfaceHolder holder, int format, int width,int height):surface尺寸发生改变的时候调用,如横竖屏切换。 surfaceDestroyed(SurfaceHolder holder) :surface被销毁的时候调用,如退出游戏画面,一般在该方法中停止绘图线程。 还需要获得SurfaceHolder,并添加回调函数,这样这三个方法才会执行。 */ @Override public void surfaceCreated(SurfaceHolder holder) { Log.d(TAG, "surfaceCreated: "); if(mBitmapResourceIds == null){ Log.e(TAG, "surfaceCreated: 图片资源为空"); return; } mThread = new Thread(this); mThread.start(); mIsDraw = true; } public void setmBitmapResourceIds(int[] mBitmapResourceIds) { this.mBitmapResourceIds = mBitmapResourceIds; } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { } @Override public void surfaceDestroyed(SurfaceHolder holder) { mIsDraw = false; try { Thread.sleep(mFrameSpaceTime); Log.d(TAG, "surfaceDestroyed: Thread " + mThread.getState()); } catch (InterruptedException e) { e.printStackTrace(); } } @Override public void run() { synchronized (mHolder) { // 这里加锁为了以后控制这个绘制线程的wait与notify while (mIsDraw) { try { drawView(); Thread.sleep(mFrameSpaceTime); } catch (InterruptedException e) { e.printStackTrace(); } } } } private void drawView() { Log.i(TAG, "drawView: "); Canvas mCanvas = mHolder.lockCanvas(); // 锁定画布 try { mCanvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR); // 清除屏幕 mCanvas.drawColor(Color.BLACK); mBitmap = BitmapFactory.decodeResource(getResources(), mBitmapResourceIds[mCurrentIndext]); mCanvas.drawBitmap(mBitmap, 0, 0, null); if (mCurrentIndext == mBitmapResourceIds.length - 1) { mCurrentIndext = 0; } } catch (Exception e) { e.printStackTrace(); } finally { mCurrentIndext++; if (mCanvas != null) { mHolder.unlockCanvasAndPost(mCanvas); // 提交画布 } recycle(mBitmap); // 这里回收资源非常重要! } } private void recycle(Bitmap mBitmap) { if(mBitmap != null) mBitmap.recycle(); }}布局文件:预览~~