我用绘图线的动画创建了视图类。它通过postDelayed动作进行动画处理,每个onDraw都会创建一条比上一条更长的线。 但是我需要在第一个之后对多条具有不同坐标的线进行动画处理,因此我需要以某种方式保存完成的线。 如何保存画布? 我无法将每一行保存到每个位图,因为我需要太多。
public class DrawingView extends View {
private Paint mLinePaint;
private PointF mStartPoint;
private PointF mEndPoint;
private PointF mCurrentEndPoint;
private int i;
private PointF pointsF[];
private float mDrawPercent = 0f;
private float mPercentForFrame;
private static final long FRAME_DURATION = 17;
public DrawingView(Context context) {
super(context);
init();
}
public DrawingView(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
public DrawingView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init();
}
private void init() {
mLinePaint = new Paint();
mLinePaint.setStyle(Paint.Style.STROKE);
mLinePaint.setColor(0xFF00FF00);
mLinePaint.setAntiAlias(true);
mLinePaint.setStrokeWidth(5);
mStartPoint = new PointF();
mEndPoint = new PointF();
mCurrentEndPoint = new PointF();
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
mCurrentEndPoint = calculateCurrentEndPoint(mStartPoint, mEndPoint, mDrawPercent);
//canvas.drawLine(mStartPoint.x, mStartPoint.y, mCurrentEndPoint.x, mCurrentEndPoint.y, mLinePaint);
for (int i = 0; i < pointsF.length; i++){
canvas.drawLine(mStartPoint.x, mStartPoint.y, mCurrentEndPoint.x, mCurrentEndPoint.y, mLinePaint)
}
}
public void animateShape(long duration, final PointF[] points) {
mPercentForFrame = 1f / ((float) duration / (float) FRAME_DURATION);
mDrawPercent = 0f;
i = 1;
mStartPoint = points[0];
mEndPoint = points[1];
postDelayed(new Runnable() {
@Override
public void run() {
mDrawPercent += mPercentForFrame;
if (mDrawPercent < 1) {
invalidate();
postDelayed(this, FRAME_DURATION);
} else {
if ((i + 1) < points.length) {
i++;
mDrawPercent = 0f;
mStartPoint = points[i-1];
mEndPoint = points[i];
invalidate();
postDelayed(this, FRAME_DURATION);
} else {
mDrawPercent = 1;
invalidate();
}
}
}
}, FRAME_DURATION);
}
private PointF calculateCurrentEndPoint(PointF startPoint, PointF endPoint, float drawPercent) {
float triangleWidth = endPoint.x - startPoint.x;
float triangleHeight = endPoint.y - startPoint.y;
float currentWidth = triangleWidth * drawPercent;
float currentHeight = triangleHeight * drawPercent;
PointF resultPoint = new PointF();
//Ну и тут уже получаем текущие координаты конца линии.
resultPoint.x = startPoint.x + currentWidth;
resultPoint.y = startPoint.y + currentHeight;
return resultPoint;
}
}