java - SVG 上的 Android RotateDrawable 会产生锯齿状边缘

标签 java android svg android-vectordrawable

我尝试通过以编程方式旋转 vector 可绘制对象来可视化 Android 9 设备上的旋转对象,该 vector 可绘制对象是使用 New->Vector Asset 方法从 .svg 文件创建的。对象的旋转应该跟随一些外部属性的变化,而不是预定义的动画。

当 vector 图像作为 VectorDrawable 在 ImageView 上绘制时,生成的图像具有应有的平滑边缘,但是当使用 RotateDrawable 以编程方式旋转图像时,边缘会变得锯齿状,就好像图像被视为位图,并且不重新绘制为 vector 图形。

下图说明了这个问题:

Below is the pure Drawable, top is the rotated version with jagged edges

根据VectorDrawable根据文档,首次加载时会为每个 vector 资源创建位图缓存,但是是否有可能在图像旋转时强制重新渲染?

下面是一些用于创建效果的示例代码。

可绘制类:

    public class MyDrawable extends Drawable implements Drawable.Callback, Runnable {

    @Override
    public void draw(Canvas canvas)
    {
        VectorDrawable vectorDrawable = (VectorDrawable)mainActivity.getResources().getDrawable(R.drawable.test_drawable, mainActivity.getTheme());
        vectorDrawable.setBounds(canvas.getClipBounds());
        vectorDrawable.draw(canvas);    // This looks OK

        RotateDrawable rotator = new RotateDrawable();
        rotator.setBounds(canvas.getClipBounds());
        rotator.setLevel(1000);
        rotator.setDrawable(vectorDrawable.mutate());
        rotator.draw(canvas);       // Jagged edges
    }
}

在 Fragment 中的 ImageView 中使用:

    @Override
    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
        final ImageView testView = (ImageView)getView().findViewById(R.id.test_view);
        testView.setImageDrawable(new MyDrawable());
    }

最佳答案

目前 Android 中似乎没有内置支持来实现我想要实现的目标,但我找到了至少一个可行的解决方案,即使用第三方 AndroidSVG库并修改.svg最上面的组<g>元素直接包含转换:

@Override
public void draw(Canvas canvas)
{
    try {

        String svgString = // Your .svg file as plaintext
        svgString = svgString.replaceFirst("<g>", "<g transform=\"rotate(" + angle + ", " + pivotX + " , " + pivotY + ")\">");
        SVG svg = SVG.getFromString(svgString);
        svg.renderToCanvas(canvas);

        // ...
    }
    catch (SVGParseException svgpe){}

}

关于java - SVG 上的 Android RotateDrawable 会产生锯齿状边缘,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58008447/

相关文章:

java - 如何以编程方式访问类的 javadoc?

java - 为什么 Java 中不是默认启用所有密码套件?

android - 后退时关闭 Activity 和对话框

javascript - 使用 pathAnimator javascript 时出现 SVG 错误

原始数组类型上的 Java Arrays.asList 产生意外的列表类型

java - 有没有像JAD那样针对JDK5类的命令反编译工具支持Windows/Linux/AIX?

javascript - 使用Javascript D3库,如何替换矩形选择中的数据?

javascript - 在 d3 中为每个数据元素添加多个矩形

android - 设置 Android Lollipop 5.0 工具栏样式的正确方法

java - 如何在firebase数据库中进行多个查询?