我尝试通过以编程方式旋转 vector 可绘制对象来可视化 Android 9 设备上的旋转对象,该 vector 可绘制对象是使用 New->Vector Asset 方法从 .svg 文件创建的。对象的旋转应该跟随一些外部属性的变化,而不是预定义的动画。
当 vector 图像作为 VectorDrawable 在 ImageView 上绘制时,生成的图像具有应有的平滑边缘,但是当使用 RotateDrawable 以编程方式旋转图像时,边缘会变得锯齿状,就好像图像被视为位图,并且不重新绘制为 vector 图形。
下图说明了这个问题:
根据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/