簡體   English   中英

基於分辨率/密度的資源的最佳質量圖像分配

[英]Best quality image allocation from resources based on resolution/density

我正在努力解決Android“多屏尺寸”領域的一項非常簡單的任務。

我想要實現的目標

與屏幕寬度匹配的布局,具有9個補丁背景,其大小調整(僅水平,因為總是有足夠的垂直空間)。 這是一個虛擬圖像: 水平可伸縮的九個補丁圖像,左右兩端有兩個區域

我的目標是,根據屏幕分辨率,使用一組不同的尺寸,例如,以盡可能高的分辨率顯示圖像。 320x45,480x67,600x87,720x101,無需任何縮小。 我希望有一個非程序化的解決方案。

具有上述圖像尺寸的示例將是:

  • 3.7“Nexus One(480 x 800) - 480x67圖像效果最佳。
  • 4.7“Galaxy Nexus(720 x 1280) - 720x101圖像。
  • 4.7“Nexus 4(768 x 1280) - 再次是720x101圖像,拉伸至完整的768像素寬度並變為768x101。

問題

整個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寬的圖像。

現在讓我們看看一些設備,看看它們是如何落入這些存儲桶的:

  • Nexus one - normal hdpi 實際px寬度:480px。 圖像非常適合。
  • Galaxy nexus - normal xhdpi 我們可以適應720px的圖像,因此我們使用的640px圖像並不是最佳的 - 但它非常接近。
  • Nexus 4就像Gnex一樣。
  • Nexus 10.1(1280X800) - 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM