Android:顺序绘图不删除之前绘制的

标签 android kotlin android-animation

假设您想按顺序为路径列表设置动画。

我有一个可以存储路径列表的自定义 View ,我覆盖了 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()

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

我想要的是在屏幕上保留每条动画路径。你会怎么做?

最佳答案

您可以使用一对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 上的代码实验室

关于Android:顺序绘图不删除之前绘制的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59217894/

相关文章:

android - 预训练的 keras 模型在 android 中返回相同的结果

android - Kotlin object/singleton 的方法是否同步?

kotlin - 使用Kotlin从字符串中的字符获取unicode值

android - 使用相同的动画隐藏和显示多个 View

Android ObjectAnimator 动画 translationY 在所有屏幕尺寸上的比例相同

java - Android用动画连续移动背景

android - AnimationDrawable 不播放

android - 如何更新我的骨架布局代码,使其不会阻止我的viewpager?

android - 如何打开扬声器在安卓 Jellybean 上打电话

android - 使用 FusedLocationProvider Api 时定位服务的自定义警报消息