Posted at

Android9.0でImageViewにdrawableをsetImageResourceしてgetし直すとdensityの値が変わることがある

タイトルどおりです。

あまりにもレアケースすぎて自分以外に誰もハマる人はいない気がしますがせっかく気がついたのでメモしておきます。

正確には、「適切なdpiのdrawableを用意していない場合に、Android9.0でImageViewにdrawableをsetImageResourceしてgetし直すと、densityの値が変わることがある」という現象です。

検証コードは以下になります。

        val bitmap1 = BitmapFactory.decodeResource(resources, R.drawable.image2)

Log.d("test1:", "density:" + bitmap1.density)

imageView.setImageResource(R.drawable.image2)
val bitmap2 = (imageView.drawable as BitmapDrawable).bitmap
Log.d("test2:", "density:" + bitmap2.density)


test1:: density:420

test2:: density:320


これは例えばdrawableフォルダにしか画像を入れていない場合や、xxdpiの端末でxdpiの画像しか入れていない場合などに発生するようです。

更にこの現象は検証した限りではAndroid9.0でしか発生せず、それ未満のバージョンでは再現しませんでした。

仕様なのかバグなのかもよくわかりません。

なお、densityの値が変わることで何が困るかというと、この取得したBitmapをBitmap.Bitmap.createScaledBitmap()でリサイズした際に、想定した通りのサイズになってくれないという事が起こります。

対処策としては、すべてのdpiの画像をちゃんと用意するか、変わる前のdensityの値を取得して書き換えてあげるなどがあるでしょう。