package com.mcxtzhang.cstviewdemo.widget; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Path; import android.graphics.PathMeasure; import android.util.AttributeSet; import android.util.SparseArray; import com.mcxtzhang.cstviewdemo.widget.res.StoreHousePath; import java.util.ArrayList; /** * 介绍:一个StoreHouse风格动画的View * 作者:zhangxutong * 邮箱:zhangxutong@imcoming.com * 时间: 2016/11/2. */ public class StoreHouseAnimView extends PathAnimView { public StoreHouseAnimView(Context context) { this(context, null); } public StoreHouseAnimView(Context context, AttributeSet attrs) { this(context, attrs, 0); } public StoreHouseAnimView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); Path sPath = new Path(); ArrayList<float[]> path = StoreHousePath.getPath("ZhangXuTong"); for (int i = 0; i < path.size(); i++) { float[] floats = path.get(i); sPath.moveTo(floats[0], floats[1]); sPath.lineTo(floats[2], floats[3]); } setSourcePath(sPath); } private final static long MAX_LENGTH = 400; PathMeasure pathMeasure = new PathMeasure(); Path stonePath; private ArrayList<Float> mPathLengthArray; private SparseArray<Boolean> mPathNeedAddArray; private int partIndex;//残缺的index private float partLength;//残缺部分的长度 @Override protected void onDraw(Canvas canvas) { canvas.translate(20, 20); setBackgroundColor(Color.BLACK); mPaint.setColor(Color.GRAY); canvas.drawPath(mSourcePath, mPaint); mPaint.setColor(Color.WHITE); //仿StoneHouse效果 ,现在的做法很挫 stonePath = new Path(); mPathLengthArray = new ArrayList<>();//顺序存放path的length pathMeasure.setPath(mAnimPath, false); while (pathMeasure.getLength() != 0) { mPathLengthArray.add(pathMeasure.getLength()); pathMeasure.nextContour(); } mPathNeedAddArray = new SparseArray<>(); float totalLength = 0; partIndex = 0; partLength = 0; for (int i = mPathLengthArray.size() - 1; i >= 0; i--) { if (totalLength + mPathLengthArray.get(i) <= MAX_LENGTH) {//加上了也没满 mPathNeedAddArray.put(i, true); totalLength = totalLength + mPathLengthArray.get(i); } else if (totalLength < MAX_LENGTH) {//加上了满了,但是不加就没满 partIndex = i; partLength = MAX_LENGTH - totalLength; totalLength = totalLength + mPathLengthArray.get(i); } } pathMeasure.setPath(mAnimPath, false); int i = 0; while (pathMeasure.getLength() != 0) { if (mPathNeedAddArray.get(i, false)) { pathMeasure.getSegment(0, pathMeasure.getLength(), stonePath, true); } else if (i == partIndex) { pathMeasure.getSegment(pathMeasure.getLength() - partLength, pathMeasure.getLength(), stonePath, true); } pathMeasure.nextContour(); i++; } canvas.drawPath(stonePath, mPaint); } }