こんにちは私はAndroidDrawableクラスの2つのメソッドに混乱しています
getIntrinsicHeight()
getIntrinsicWidth()
APIの定義によると http://developer.android.com/reference/android/graphics/drawable/Drawable.html#getIntrinsicHeight()
固有の高さ/幅という言葉はどういう意味ですか?つまり、実際の画像の幅ですか?
こんにちは私はAndroidDrawableクラスの2つのメソッドに混乱しています
getIntrinsicHeight()
getIntrinsicWidth()
APIの定義によると http://developer.android.com/reference/android/graphics/drawable/Drawable.html#getIntrinsicHeight()
固有の高さ/幅という言葉はどういう意味ですか?つまり、実際の画像の幅ですか?
固有の意味を知りたい場合、それはオブジェクトが所有する実際のプロパティに他なりません。私たちの場合getIntrinsicWidth/Height
は、単にそのドローアブルのデフォルトの幅/高さを提供することを意味します。
これにより、変更せずにリソースフォルダに配置したドローアブルの正確なサイズが返されます。
ここで、XMLレイアウトで指定した幅と高さによって異なる可能性のある値を返すか、返すgetWidth
かを知る必要があります。getHeight
ImageView
ImageView
XMLレイアウトのように幅と高さを100*100
指定し、背景として使用したドローアブルのサイズが200*200であるとします。
ここgetIntrinsicWidth
で200を返す必要がありますが、 getWidth
100を返す必要があります。
ここにstackoverflowに関する関連する質問。
画像がインターネットからダウンロードされた場合.getIntrinsicWidth()
、.getIntrinsicHeight()
実際に画像の「実際の」幅と高さをそれぞれ提供します。
これは、画像のみに依存し、他には何も依存しないため、組み込みと呼ばれます(携帯電話など)。
残念ながら、得られるものはすべての状況に固有のものではありません。残念ながら、画像以外のものに依存します。
ここで、間違った(つまり、非本質的な)結果が得られます。デフォルトのランチャーアイコンを使用しているとしましょう。
Log.i("", "ic_launcher intrinsic width " + getResources().getDrawable(R.drawable.ic_launcher).getIntrinsicWidth());
ランチャーアイコンの幅(ピクセル単位)が表示されます。しかし、どれですか?-それらのいくつかがあります。1つはdrawable-xhdpiフォルダーに、もう1つはdrawable-hdpiフォルダーにあります。たとえば、デバイスがxhdpiの場合、96が得られます。これは、実際にはのバージョンのピクセル幅です。 drawable-xhdpiフォルダーにあるランチャーアイコン。ここで、drawable-xhdpiフォルダー内のアイコンを削除し、再度実行します(xhdpiデバイス(実際のデバイスまたはエミュレートされたデバイス)を引き続き使用します)。使用される画像は、xhdpiバージョンに「最も近い」ため、drawable-hdpiフォルダーからのものになります。そのアイコンのピクセル幅は72です。ただし、上記のコードでは96が表示されます。
使用する画像だけに依存するわけではないので、これは明らかに「本質的」ではありません(適切な意味で)。
したがって、私と同じように怠惰であり、したがって各リソースアイコン/画像の4つのバージョンを生成していない場合(代わりに1つまたは2つだけを使用し、それらを手動でスケーリングする場合)、前述のandroidalの誤称に注意する必要があります。
Androidでは、ドローアブルは色、ビットマップ、形状など、さまざまな種類があります。
これらのドローアブルの一部には、画像の寸法であるBitmapDrawableなどの固有の高さがあります。
ColorDrawable(単色だけを描画するために使用される)などの描画可能オブジェクトには、固有の高さはありません。この場合、getIntrinsicHeight/Widthの値は-1を返します。
ドローアブルに固有の高さ/幅がない場合でも、すべてのドローアブルは、それ自体をレンダリングする前に(つまり、mydrawable.draw(canvas)を呼び出す前に)境界を設定する必要があります。
ビューの背景としてドローアブルを使用している場合、ビューは内部的に境界を設定します。ただし、独自のonDrawでドローアブルを使用している場合は、setBoundsを使用して境界を明示的に設定する必要があります。