[英]Best quality image allocation from resources based on resolution/density
我正在努力解決Android“多屏尺寸”領域的一項非常簡單的任務。
我想要實現的目標
與屏幕寬度匹配的布局,具有9個補丁背景,其大小調整(僅水平,因為總是有足夠的垂直空間)。 這是一個虛擬圖像:
我的目標是,根據屏幕分辨率,使用一組不同的尺寸,例如,以盡可能高的分辨率顯示圖像。 320x45,480x67,600x87,720x101,無需任何縮小。 我希望有一個非程序化的解決方案。
具有上述圖像尺寸的示例將是:
問題
整個Android資源分配圍繞dp
s(與密度無關的像素),實際上我想根據實際可用像素顯示圖像。
如果我將480x67圖像分配給res / drawable-mdpi,將600x87分配給res / drawable-hdpi,則圖像將在5.4x800的480x顯示器上正確顯示 ,即mdpi顯示。但是,4“480x800顯示器符合hdpi和系統將指定600x87圖像,這將不適合屏幕 。
我嘗試了在線指南中描述的smallestWidth
參數,但這會產生奇怪的結果。 例如,一個3.7“480 x 800顯示器(hdpi)使用我的drawable-sw320dp圖像,盡管有一個drawable-sw480dp資源也可用。
提前致謝!
我相信通過組合密度和屏幕大小資源限定符,您可以實現接近最佳行為。
讓我們假設這種資源文件夾結構:
drawable-normal-hdpi
- normal
大小規定最小寬度為320dp。 hdpi
指示1.5X dp到像素乘數。 因此, normal hdpi
存儲桶的最小px寬度為480px。 我們在這里放了480px寬的圖像。 drawable-normal-xhdpi
- 再次大小指示320dp但這次使用2倍乘數。 所以我們使用640px寬的圖像。 drawable-xlarge-mdpi
- 大小意味着至少720dp。 mdpi
乘數是1X,所以我們使用720px寬的圖像。 現在讓我們看看一些設備,看看它們是如何落入這些存儲桶的:
normal hdpi
。 實際px寬度:480px。 圖像非常適合。 normal xhdpi
。 我們可以適應720px的圖像,因此我們使用的640px圖像並不是最佳的 - 但它非常接近。 xlarge mdpi
。 我們可以適合800px,我們的圖像是720px。 再次不理想但足夠接近。 最糟糕的情況:使用的圖像質量可提高5-10%。 最佳表殼:完美貼合。
這種方法的主要缺點是你需要提供大量的資源和文件夾來考慮大小和密度的所有排列(如果你需要將它與更多的限定符組合用於區域設置,方向等,則更糟糕)。 但是,就我的Android理解而言,我不認為你可以在沒有編碼的情況下取得比這更好的東西。
關於smallestWidth
的評論:你的奇怪行為的例子實際上是預期的行為。 hdpi乘數為1.5 - 因此480px寬的hdpi顯示器正好是320dp寬。 這使得drawable-sw320dp成為正確的選擇,如文檔所述。 我不確定你是否可以將smallestWidth
限定符與dpi限定符組合使用。 如果可能的話,您可能會獲得比僅僅大小修飾符更准確的結果。 但這意味着圖像質量提高5%會產生更多的排列。 可能不值得。
實際上,你的方法不是它應該如何。 我將為您推薦兩種方法,一種是簡單但以編程方式進行,另一種是使用自定義視圖。
方法1 - 以編程方式
DisplayMetrics displaymetrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(displaymetrics);
int screenWidth = displaymetrics.widthPixels;
// this will determine "scale ratio" so using which image height and width won't matter
int imageOriginalHeight = 101; // your original image height
int imageOriginalWidth = 720; // your original image width
int imageScaleHeight = (screenWidth*imageOriginalHeight) / imageOriginalWidth;
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(screenWidth, imageScaleHeight);
imageView.setLayoutParams(params);
imageView.setImageResource(R.drawable.file);
方法2 - 自定義視圖
您可以使用由Maurycy Wojtowicz編寫的名為ScaleImageView的自定義視圖。
類定義如下:
此視圖將通過確定是設置高度還是寬度(精確大小或match_parent)自動確定寬度或高度,並根據圖像維度縮放其他維度此視圖還包含一個ImageChangeListener,一旦更改,就會調用changed(boolean isEmpty)已經對ImageView做了
以下是您將如何實現它。
創建一個名為ScaleImageView.java的類,並復制上面鏈接的內容。
在你的xml文件中,創建一個ScaleImageView
,就像ImageView
一樣(下面我寫的例子是填充屏幕寬度,根據它來縮放高度,所以右邊/左邊沒有空格)
<com.project.customview.ScaleImageView
android:id="@+id/scaleImageView"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:adjustViewBounds="true"
android:scaleType="fitCenter"
android:src="@drawable/file" />
如果需要在Activity中以編程方式聲明和設置,它也與使用ImageView相同:
imageView = (ScaleImageView)findViewById(R.id.scaleImageView);
imageView.setImageResource(R.drawable.file);
在android中你有選項hdpi,mdpi,xdpi等。
為此,您必須根據設備分辨率創建不同的圖像,並在確認設備分辨率和密度類別后將圖像放在那里。
為了更多的參考,為什么它會發生你可以看到這里
在這里我解釋一些圖表可能對您有所幫助。
低密度小屏幕QVGA 240x320(120dpi):
drawable-small-ldpi(240x320)
drawable-small-land-ldpi(320x240)
低密度普通屏幕WVGA400 240x400(x432)(120dpi):
drawable-ldpi(240 x 400)drawable-land-ldpi(400 x 240)
中密度普通屏幕HVGA 320x480(160dpi):
drawable-mdpi(320 x 480)drawable-land-mdpi(480 x 320)
中密度大屏幕HVGA 320x480(160dpi):
drawable-large-mdpi(320 x 480)drawable-large-land-mdpi(480 x 320)
Galaxy Tab(240 dpi):
drawable-large(600 x 1024)drawable-large-land(1024 x 600)
高密度普通屏幕WVGA800 480x800(x854)(240 dpi):
drawable-hdpi(480 x 800)drawable-land-hdpi(800 x 480)
Xoom(中密度大,但1280x800 res)(160 dpi):
drawable-xlarge(800 x 1280)drawable-xlarge-land(1280 x 800)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.