前提条件我就不说了,相信能查找这个主题的都不是一般的Android开发者,我只讲核心的部分和该文章所能解决的问题。
之前搜索过很多文章,大都不理想,无法完美的解决自己的需求,然后自己根据资料整理了一下,可以说非常完美。
解决的问题:
1、帧特别多,如果同时decode做动画可能会出现OOM的情况
2、CPU、内存占用过高
3、可以多次做重复做动画
4、代码精简易懂效率高
废话不说,代码如下:
public class BoSurfaceView extends SurfaceView implements SurfaceHolder.Callback {
private static final String TAG = "draw";
private AssetManager assetManager;
private List<String> mPathList;
private DrawThread mDrawThread;
/**
* inBitmap如果图片不是太大的话不建议打开
*/
private boolean mSupportInBitmap = true;
private SparseArray<Bitmap> mBitmapCache;
private long mFrameInterval = 48L;
private int mTotalCount;
/**
* 传入inBitmap时的decode参数
*/
private BitmapFactory.Options mOptions;
// 由于属性动画最大会当大到1.4倍,为了View能正常显示,因此绘图时必须相应都缩小1.4倍
private static final float ANIM_ZOOM = 1.4f;
private SurfaceHolder mSurfaceHolder;
private Canvas mCanvas;
private Matrix mDrawMatrix;
private State mState;
private PaintFlagsDrawFilter mDrawPaint;
private Paint mPaint = new Paint();
private int mWidth;
private int mHeight;
public BoSurfaceView(Context context) {
this(context, null);
}
public BoSurfaceView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public BoSurfaceView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
assetManager = context.getAssets();
mWidth = context.getResources().getDimensionPixelSize(R.dimen.icon_width);
mHeight = context.getResources().getDimensionPixelSize(R.dimen.icon_height);
init();
}
private void init() {