2013-03-29 164 views
3

我知道標題使它聽起來像是重複的,但我認爲我有一個非常特殊的情況,我無法從所有搜索中解決。根據圖像尺寸調整ImageViews的尺寸

首先,我有基於特定顯示器(是,顯示器,不是手持設備的屏幕)的特定尺寸的圖像。這些圖像都基於這些具體的設置:

  • 1600x900的20" 顯示器在96ppi

現在,所有的圖像都必須以毫米爲單位的大小(它們是方形的圖像順便說一句,所以高度=寬度)。使用這些特定的設置作爲決定性因素,1mm = 3.78px。因此,我的圖像使用此尺寸進行設置。例如,對於圖像顯示爲65毫米,我將圖像尺寸調整爲246像素。設置和測量屏幕上的圖像確實出來正確

所以現在在我的Android應用程序,我加載將這些圖像放入要顯示的ImageViews中。這是我卡住的地方。該設備是MDPI設備。如果我將圖像加載到MDPI drawables文件夾中,則圖像在監視器上顯示得太大。使用我上面的例子,我將Drawable轉換爲Bitmap並將圖像的高度轉儲到我的日誌中。這是正確的,並顯示246px,但由於某種原因,它的測量值超過85mm而不是65mm。

如果我將所有圖像加載到HDPI中(是的,我知道它是一個mdpi設備,所以它將根據Android操作系統進行調整),圖像高度(使用我的示例)轉儲爲164px並顯示大約50毫米。這更容易解釋,但我仍然對如何讓這些圖像像在Photoshop中一樣出現感到困惑。

所以我的問題是,以編程方式將ImageView設爲圖像的確切大小的最佳方法是什麼?對於我的例子,我需要找出爲什麼我的246像素的方形圖像(96ppi)沒有像65mm那樣顯示。

由於這些ImageView s的程序生成,我曾嘗試以下兩兩件事:

  1. 設置ImageView高度和寬度(使用LayoutParams)到圖像的高度(246px)。我是這麼想的,WRAP_CONTENT不是應該這樣做。
  2. 使用ImageView.ScaleType.CENTER嘗試確保ImageView的尺寸與圖像完全一致。

這些東西都不影響輸出。

更新:

我已經驗證了我的設備是MDPI設備。這意味着由於1:1的關係,沒有DPI到PX的轉換(反之亦然)。某處,大小正在增加,我無法確定在哪裏。正如我在以下答案的評論中指出的那樣,當我拉出Drawable並將其轉換爲Bitmap時,它將拉出我製作的EXACT像素高度。我開始計算它應該是什麼尺寸差異的百分比(65毫米和85毫米),它的結果是23.529%。我縮放我的位圖減去這個值,但它毀了我的圖像的質量。

我開始放棄。

我利用該設備是一種MK802III瑞芯器件(Amazon Link

回答

1

我討厭回答我自己的問題,但我只是想向大家介紹我所做的。如果有人提出了一個更好的解決方案,我就會全神貫注。由於我處於緊急期限之前,我不得不強制執行此操作。

我創建的傾倒,我可以測量盒的虛擬應用程序。使用這些,我確定1毫米是3個密度像素。讓我重複一遍,1毫米= 3DP

使用此值,我將所有圖像(使用PHP腳本)調整爲此約束。我的所有圖像都正常顯示。 195dp = 65mm,並且看起來如此。

就像我說的,爲什麼我必須這樣做,你得到upvote和答案的任何解釋。

2

的Android修改所有圖像爲用下面的公式顯示:

px = dp * (dpi/160) 

其中「DPI」是dots-屏幕密度每英寸的設備顯示器。

此外,Android在決定要顯示哪個圖像時會查找drawable文件夾的層次結構。我們都知道,一個華電國際設備將使用將圖像從drawale-hdpi文件夾而一個MDPI裝置將從drawable-mdpi目錄顯示相同的命名的圖像。

然而,當MDPI設備無法找到在drawable-mdpi目錄中的圖像,它最終會從drawable-hdpi文件夾選擇,但它會向下規模MDPI屏幕上顯示的圖像。

這解釋了爲什麼當您將圖片保存在drawable-hdpi文件夾中時,圖片顯得較小。

但是,它不能解釋爲什麼圖像在正確放置在drawable-mdpi文件夾中時顯得太大。

它恰巧:

65毫米〜=85毫米*(120/160)

50毫米〜=85毫米*(二百四十零分之一百二十○)

這是標定如果您的設備是LDPI(120dpi)而不是MDPI(160dpi),則我會期待您的圖像。

+0

所以,如果MDPI是160dpi,應該怎麼了我的圖像,當涉及到PPI?我同意,我現在很困惑。當使用'getDisplayMetrics()。density'時,它會拉動'1.0',我將其視爲MDPI。真奇怪的是,當我從位圖轉儲圖像高度時,它拉出了我爲其創建圖像的精確px維。我想知道它是否將其轉化爲DPI? – burmat

+0

也困惑不解。你的設備顯然是MDPI,並不像我所期望的那樣。請注意,由於密度縮放,「Bitmap.getWidth()」不一定會報告將被繪製到屏幕的寬度。 –

+0

這就是我撞牆的地方。 '位圖。getHeight()/ getWidth()'等於我生成圖像的像素的精確數量,但是當我將它放在屏幕上時,它不會像這樣顯示。當你將它轉換爲DPI時,由於它是MDPI設備,它具有1:1的關係,所以246像素可以轉換爲246dpi。不管我做什麼,儘管在Photoshop中查看圖像時圖像比65mm大得多。 Android設備正在改變它,我只是無法找到位置。我甚至將246硬編碼爲'LayoutParams',沒有任何改變。 – burmat