Android:不删除先前绘制的顺序绘制

时间:2019-12-06 17:37:10

标签: android kotlin android-animation

考虑要顺序设置路径列表的动画。

我有一个可以存储路径列表的自定义视图,并且我重写了onDraw方法,以便可以选择要设置动画的路径。我使用名为currentPath的索引来做到这一点。

var pathList = mutableListOf<Path>()
var currentPath = 0

public override fun onDraw(canvas: Canvas) {
        if (!this.pathList.isEmpty()){
            canvas.drawPath(this.pathList[this.currentPath], brushOutput)
        }

    }

我可以使用属性动画为路径设置动画。 为此,我有一个OnePath类,该类封装了所有内容以设置一条路径的动画

class OnePath(val brush: Paint, val length: Float, val view: PaintView, val currentPath: Int): Path() {

    val animator = ObjectAnimator.ofFloat(this, "phase", 1.0f, 0.0f)

    fun setPhase(phase: Float) {
        view.currentPath = currentPath  // set the index of the path to draw in the view
        brush.pathEffect = createPathEffect(length, phase, 1.0f) // animate model output
        view.invalidate() /* will call onDraw */        
    }

    private fun createPathEffect(pathLength: Float, phase: Float, offset: Float): PathEffect {
        return DashPathEffect(
            floatArrayOf(pathLength, pathLength),
            Math.max(phase * pathLength, offset)
        )
    }
}

然后依次对路径列表进行动画处理,我将AnimatorSet与以下内容一起使用

val animatorSet = AnimatorSet()
val listAnimator = mutableListOf<Animator>()

for (i in 0..len-1){
    val path_i = OnePath(paint, lengthList[i], binding.paintView, i)
    listAnimator.add(path_i.animator)
}
animatorSet.playSequentially(listAnimator)
animatorSet.setDuration(2000).start()

但是,这样做的结果是每个路径都按顺序进行了动画处理,但是每绘制一条路径,当对下一条路径进行动画处理时,它就会消失。

我想要的是将每个已设置动画的路径保留在屏幕上。你会怎么做?

1 个答案:

答案 0 :(得分:0)

您可以使用一对BitmapCanvas将先前绘制的路径缓存在PaintView中:

private Canvas extraCanvas;
private Bitmap extraBitmap;

@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
    super.onSizeChanged(w, h, oldw, oldh);
    if(extraBitmap != null && !extraBitmap.isRecycled()){
        extraBitmap.recycle();
    }
    extraBitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
    extraCanvas = new Canvas(extraBitmap);
}

@Override
protected void onDraw(Canvas canvas) {
    if (!this.pathList.isEmpty()){
        extraCanvas.drawPath(pathList.get(currentPath), brushOutput);
    }

    // Draw the bitmap that has all the saved paths:
    canvas.drawBitmap(extraBitmap, 0f, 0f, null);
}

另请参见Drawing on Canvas Objects上的代码实验室