Androidのdrawableとmipmap
Androidアプリ開発ではたくさんの端末解像度に対応するため、画像ファイルを下記のようなディレクトリに分けてアプリに組み込む。そうすると、OSは自動的に最適解像度の画像を拾ってアプリに渡してくれる。
- drawable-mdpi
- drawable-hdpi
- drawable-xhdpi
- 以下略
ただし、このディレクトリ数は嫌になるほど多いし、メンテも大変になる。その他にもmipmapが入ってきたりすると、画像を出力するのもそれを正しいディレクトリに配置するのも、もし不要になったら削除するのも一苦労だ。
そうなってくると、どうにかコイツらを自動的に管理したい。やろうと思えばShellでもなんでもできるが、Gradleのpluginにしてしまったほうが再利用しやすいので、Pluginとして公開した。
このプラグインでやれること
drawable/mipmapの画像メンテを1枚のみに絞れるので、リソースの出力や管理コストを減らせる。デザイナーから大量に*.pngを受け取って、配置に四苦八苦することもなくなるぞ!
いつもどおりgithubで公開している
- https://github.com/eaglesakura/plugin-android-mipmap
- やってることは単純なので、修正も多分簡単に出来るよ。
使用例
例として、デザイナーにxxhdpi用の画像を出力してもらったとしよう。
本来であれば、デザイナーに「じゃあそれをdrawable-xxhdpiに配置して、xhdpiとhdpiとmdpiとldpiディレクトリにも配置してね。解像度はガンバって計算してね。ヨロシク」と言ってぶん投げることになる。もしくは自分でそれをヤルことになる。
メンドウである。
プラグインを使った場合、 /app/images/drawable/xxhdpi
配下に件の画像を配置し、gradleの androidBuildMipmap
か aBM
コマンドを叩くだけで画像の生成と配置を行ってくれる。
- プラグインをbuild.gradleに追記する
buildscript {
repositories {
maven { url "http://eaglesakura.github.io/maven/" }
}
dependencies {
classpath "com.eaglesakura:plugin-android-mipmap:1.0.5"
}
}
- plugin追加して、mipmapブロックを追加して、指定項目を埋める
apply plugin: 'com.eaglesakura.android-mipmap'
// Mipmapの入力・出力ディレクトリを指定する
mipmap {
sources = file("images/");
output = file("src/main/generated/images");
toolsPath.identify = new File("C:\\dev-home\\tools\\imagemagick\\identify.exe");
toolsPath.convert = new File("C:\\dev-home\\tools\\imagemagick\\convert.exe");
}
- pluginをapplyすると、
androidGenMipmap
タスクが追加されるので、実行する - 元画像をこうやって配置する
- mipmapを生成したい場合は、
/app/images/drawable/xxxhdpi
配下にリソースを置いておけば良い。
- mipmapを生成したい場合は、
- あとはアプリ側のandroidブロックをこんな感じに追記すれば、勝手に生成されたdrawableがアプリ側に認識される
android {
sourceSets {
main {
res.srcDirs = [
"src/main/res", "src/main/generated/images"
];
}
}
}
既知の問題点
このプラグインはImageMagickというツールと連携して、画像の縮小を行うようになっている。ImageMagickのコマンドと連携するため、追加のインストールが必要という点や、インストールディレクトリがバラバラだった場合の統一がメンドウという問題点は残っている。
複数の人間がタスクを使う場合は、環境変数とかを上手く使おう。
やろうと思えばJavaで縮小処理を行えるが、画質を考慮すると既存ツールを利用したほうが良いのは確定的に明らかである。
今のところWindows環境でのみチェックしてるので、MacやUbuntuで正しく動くかは不明。
これは車輪の再発明なのか
ガンバって探したけど、これを実現してくれるいい感じのツールが見つからなかったので、もっと便利なものがあったらそっちを使いたい。
むしろ、みんな使ってるデファクトスタンダードなツールを俺が知らないだけでは?という気分になっている。