考虑要顺序设置路径列表的动画。
我有一个可以存储路径列表的自定义视图,并且我重写了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()
但是,这样做的结果是每个路径都按顺序进行了动画处理,但是每绘制一条路径,当对下一条路径进行动画处理时,它就会消失。
我想要的是将每个已设置动画的路径保留在屏幕上。你会怎么做?
答案 0 :(得分:0)
您可以使用一对Bitmap
和Canvas
将先前绘制的路径缓存在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上的代码实验室