保存画布状态

时间:2019-10-09 13:29:21

标签: java android

我用绘图线的动画创建了视图类。它通过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;
}

}

0 个答案:

没有答案