2012-12-07 55 views
48

嗨,我從Android的繪製對象類的兩種方法混淆android getIntrinsicHeight和getIntrinsicWidth是什麼意思?

getIntrinsicHeight() 
getIntrinsicWidth() 

API定義說 http://developer.android.com/reference/android/graphics/drawable/Drawable.html#getIntrinsicHeight()

這個詞是什麼內在的高度/寬度是什麼意思? 我的意思是它是實際圖像的寬度?

+2

正確的答案在這裏http://stackoverflow.com/questions/6536418/android-why-are-the-width-height-of-the-drawable-in-imageview-wrong – mathheadinclouds

回答

102

如果你想知道固有的的含義,它只是一個對象擁有的實際屬性。在我們的例子中,getIntrinsicWidth/Height僅僅意味着爲您提供該drawable的默認寬度/高度。

這會返回您在資源文件夾中放置的drawable的確切大小,而不進行任何修改。

現在,你必須知道,getWidthgetHeight將返回可能根據寬度和高度,你指定你的XML佈局你的ImageView變化的值。

假設您在XML佈局中提供了ImageView的寬度和高度爲100*100,並且您用作背景的可繪製尺寸爲200 * 200。

現在getIntrinsicWidth必須返回200,而getWidth必須返回100

+0

謝謝我看到。但目前我從url下載圖像(並加載它的圖像視圖)內在的高度和寬度是不一樣的原始圖像,如果我在瀏覽器中訪問它,它比報告的更大,但在上面你的烏龜例如,你說他們應該是相同的 – user1697965

+0

好吧,也許你正在下載時縮放圖像。我不知道這對於下載的圖像有多大的作用,但至少它適用於我繪製的圖像。 –

+6

錯誤。正確的答案在這裏http://stackoverflow.com/questions/6536418/android-why-are-the-width-height-of-the-drawable-in-imageview-wrong – mathheadinclouds

4

在機器人的可繪製可以是許多類型,如顏色,位圖的,形狀等

其中一些可繪的具有固有的高度,使得作爲圖像的維度的BitmapDrawable。

諸如ColorDrawable之類的可繪圖(用於繪製純色)不具有固有高度。在這種情況下,getIntrinsicHeight/Width的值返回-1。

即使被拉伸沒有內在的高度/寬度,每繪製需要有自己的邊界設置前,如果你使用(你叫mydrawable.draw(畫布)之前即)

他們可以使自身作爲視圖的背景可以繪製,視圖在內部爲您設置界限。但是,如果您在自己的onDraw中使用drawable,那麼您需要通過setBounds顯式設置邊界。

8

相關問題here on stackoverflow

如果您的圖像是從互聯網下載的,.getIntrinsicWidth().getIntrinsicHeight()確實會給出圖像的「真實」寬度和高度。

它被稱爲內在的,因爲它只取決於圖像和其他任何東西(比如你的手機)。

唉,你得到的東西在所有情況下都不是內在的 - 不幸的是,它取決於圖像以外的東西。

這裏是你得到一個錯誤的(即非內在的)結果。假設您使用的是默認啓動器圖標,那麼

Log.i("", "ic_launcher intrinsic width " + getResources().getDrawable(R.drawable.ic_launcher).getIntrinsicWidth()); 

會告訴您啓動器圖標的寬度(以像素爲單位)。但是哪一個呢? - 你有幾個,一個在drawable-xhdpi文件夾中,一個在drawable-hdpi文件夾中,等等。好吧,如果你的設備是xhdpi,它會給你96,這的確是像素寬度的版本啓動器圖標駐留在drawable-xhdpi文件夾中。現在,刪除drawable-xhdpi文件夾中的圖標,然後再次運行(仍使用xhdpi設備(真實或模擬))。將使用的圖像將來自drawable-hdpi文件夾,因爲這與xhdpi版本「最接近」。該圖標的像素寬度爲72.但上面的代碼仍然會給你96!

這顯然不是「內在的」(在正確的意義上來說),因爲它不僅僅取決於使用的圖像。因此,如果你像我一樣懶惰,並且因此不會生成每個資源圖標/圖像的4個版本(但是僅使用1或2,並且用手來縮放它們),則必須提防提及的androidal名不副實。