gpt4 book ai didi

Android Nougat clipPath 在动画期间不起作用

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:01:28 24 4
gpt4 key购买 nike

我在 Canvas 上创建了一个圆形剪辑路径,并且有一列数字在 Canvas 上进行了动画处理,因此我看到数字在剪辑部分中进行动画处理并进行动画处理。这是裁剪代码:

mClipPath.addCircle((w / 2f), (h / 2f), radius, Path.Direction.CW); 
canvas.clipPath(mClipPath, Region.Op.INTERSECT);

如您所见,0 为动画输出,1 为动画输入(右侧数字)。 enter image description here

但在某些情况下,剪辑在动画期间不会正确发生(左侧的 3 和 4)。

enter image description here

这只发生在牛轧糖上。

最佳答案

我遇到了同样的问题。在滚动包含下面的 CircleCropDrawable 的 RecyclerView 时,我可以看到根据滚动位置在裁剪和未裁剪之间的 drawable flash。

但是,通过反复试验,我发现只有当路径与可绘制对象的边缘相交时才会发生这种情况。将半径减小 1dp 可以解决问题(小于 1dp 不起作用)

CircleCropDrawable.java

package com.someone.android.view;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.ColorFilter;
import android.graphics.Path;
import android.graphics.Rect;
import android.graphics.drawable.Drawable;
import android.support.annotation.NonNull;
import android.util.TypedValue;

public class CircleCropDrawable extends Drawable {

private final Context mContext;
private final Drawable mDrawable;

public CircleCropDrawable(Context context, Drawable drawable) {
mContext = context;
this.mDrawable = drawable;
}

@Override
public void draw(@NonNull Canvas canvas) {
final float width = getBounds().width();
final float height = getBounds().height();
final Path path = new Path();
// There seems to be a bug in N where the clip path doesn't work when animating
// without a 1dp reduction in radius, the drawable unclips when scrolling in a RecyclerView
float inset = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 2, mContext.getResources().getDisplayMetrics());
path.addCircle(width / 2, height / 2, Math.min(width / 2, height / 2) - inset, Path.Direction.CW);
canvas.clipPath(path);
mDrawable.draw(canvas);
}

@Override
protected void onBoundsChange(Rect bounds) {
mDrawable.setBounds(bounds);
}

@Override
public int getIntrinsicWidth() {
return mDrawable.getIntrinsicWidth();
}

@Override
public int getIntrinsicHeight() {
return mDrawable.getIntrinsicHeight();
}


@Override
public void setAlpha(int i) {
mDrawable.setAlpha(i);
}

@Override
public void setColorFilter(ColorFilter colorFilter) {
mDrawable.setColorFilter(colorFilter);
}

@Override
public int getOpacity() {
return mDrawable.getOpacity();
}
}

关于Android Nougat clipPath 在动画期间不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39798663/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com