Android で SVG

以下ブログを参考にさせてもらって調査してみた。

僕が SVG を使ってやりたいことは以下。

  • 同じリソースで異なる色で使いたい
  • 解像度毎にリソースを用意しなくてよいようにしたい

色は、色だけに色々な方法で変えられるようだ。上記ブログでは SVG の String を直接 replace しているが、svg-android ライブラリには以下のメソッドが用意されていて、こちらの方がより安全だと思われる。SAX で処理するようなので、置換のオーバーヘッドもないはず。

getSVGFromString(java.lang.String svgData, int searchColor, int replaceColor)

解像度のほうは調べた限り、svg-android ではどうにもならないっぽい。svg-android を使用している svgwallpaper のソースコードを見ると、Canvas#scale() でアプリ側で対応するようになっている。でもこれって、SVG からラスターを生成した後に拡大・縮小していることになるので、SVG の意味がないな、と思ったけど、実際に動いているライブウォールペーパーを見ると、ぼやっとしておらず非常に鮮明なので、何か秘訣がありそうだ。

SVG を読み込むのがかなり遅いので*1、僕が使いたい用途では使えないかとは思うんだけど、もう少し調べてみようかな。

*1:画像から SVG を生成しているので、パスがとても多くて、簡単な画像でも 20KB ぐらいになり、それをエミュレータで読み込むと 5 秒ぐらいかかってしまう