drawable を vector で定義する

Lolipop から dpi ごとの png ファイルを用意することなく、ひとつの vector ファイルの定義だけでまかなえるようになっていました。

元ネタは Inkscape などを使って自分で作るか、下記 Google サイトなどから svg 形式のファイルを入手します。

https://design.google.com/icons/

svg 形式のファイルから drawable に配置できる xml 形式のファイルへの変換は、下記のサイトで行えます。
変に変換されることがありますので、その場合は適宜修正します。

http://a-student.github.io/SvgToVectorDrawableConverter.Web/
http://inloop.github.io/svg2android/

ただ、この vector で定義した drawable ですが、直接 Bitmap としてリソースから取り出せなかったので、次のようにして取り出す必要がありました。


    Bitmap decodeBitmap(int id) {
        Drawable d = ContextCompat.getDrawable(getActivity(), id);
        return drawableToBitmap(d);
    }

    Bitmap drawableToBitmap (Drawable drawable) {
        /*
          http://stackoverflow.com/questions/3035692/how-to-convert-a-drawable-to-a-bitmap          
         */
        if (drawable instanceof BitmapDrawable) {
            return ((BitmapDrawable)drawable).getBitmap();
        }

        int width = drawable.getIntrinsicWidth();
        width = width > 0 ? width : 1;
        int height = drawable.getIntrinsicHeight();
        height = height > 0 ? height : 1;
        
        Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
        Canvas canvas = new Canvas(bitmap); 
        drawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight());
        drawable.draw(canvas);

        return bitmap;
    }

コメントを残す

メールアドレスが公開されることはありません。