2017-05-09 98 views
2

我沒有Nexus 5x設備,但我正在使用模擬器。Android模擬器Nexus 5x加載錯誤的可繪製大小?

編輯:從Nexus 5x用戶確認。它不是一個模擬器錯誤。

問題:

在Nexus 5x應用程序加載不正確的大小繪圖。雖然在Nexus 5上沒問題。

我有一個形象的原始尺寸1440x2560。它調整爲繪製-xxhdpi - 1080×1920

登錄返回我一些有趣的東西太多:

Nexus 5: 
Display Width= 1080 Display Height= 1776 
Background Width= 1080 Background Height= 1920 

Nexus 5x: 
Display Width= 1080 Display Height= 1794 
Background Width= 945 Background Height= 1680 

我的代碼。

的AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.myapp.backgroundisfdupyo">  
    <application 
     android:allowBackup="true" 
     android:icon="@mipmap/ic_launcher" 
     android:label="@string/app_name" 
     android:roundIcon="@mipmap/ic_launcher_round" 
     android:supportsRtl="true" 

     android:theme="@android:style/Theme.NoTitleBar.Fullscreen"> 

     <activity android:name=".MainActivity"> 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" />  
       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 
    </application> 

</manifest> 

MainActivity.java

public class MainActivity extends Activity { 

private static final String TAG = "Main"; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    logScreenSize(); 
} 

private void logScreenSize() { 
    DisplayMetrics displayMetrics = new DisplayMetrics(); 
    getWindowManager().getDefaultDisplay().getMetrics(displayMetrics); 

    int displayW = displayMetrics.widthPixels; 
    int displayH = displayMetrics.heightPixels; 

    Log.e(TAG,"displayW= " + displayW + " displayH= "+ displayH); 

    Drawable bckg = getResources().getDrawable(R.drawable.background); 
    Log.e(TAG,"Background Width= " + bckg.getMinimumWidth() + " Background Height= "+ bckg.getMinimumHeight()); 
} 

@Override 
protected void onStart() { 
    super.onStart(); 
    toggleHideyBar(); 
} 

public void toggleHideyBar() { 
    int newUiOptions = 0; 

    // Navigation bar hiding: Backwards compatible to ICS. 
    if (Build.VERSION.SDK_INT >= 14) { 
     newUiOptions ^= View.SYSTEM_UI_FLAG_HIDE_NAVIGATION; 
    } 

    // Status bar hiding: Backwards compatible to Jellybean 
    if (Build.VERSION.SDK_INT >= 16) { 
     newUiOptions ^= View.SYSTEM_UI_FLAG_FULLSCREEN; 
    } 

    if (Build.VERSION.SDK_INT >= 18) { 
     newUiOptions ^= View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY; 
    } 

    getWindow().getDecorView().setSystemUiVisibility(newUiOptions); 
    //END_INCLUDE (set_ui_flags) 
} 

activity_main.xml中

... 
<FrameLayout 
    android:id="@+id/backgroundFrame" 
    android:layout_width="wrap_content" 
    android:layout_height="0dp" 
    app:layout_constraintTop_toTopOf="parent" 
    app:layout_constraintBottom_toBottomOf="parent" 
    app:layout_constraintLeft_toLeftOf="parent" 
    app:layout_constraintRight_toRightOf="parent"> 

<ImageView 
    android:id="@+id/backgroundImage" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:scaleType="centerCrop" 
    android:src="@drawable/background" /> 

</FrameLayout> 

編輯:

請求的資源樹。

enter image description here

\drawable-xxxhdpi\background.jpg - 1440 x 2560  
\drawable-xxhdpi\background.jpg - 1080 x 1920  
\drawable-xhdpi\background.jpg - 720 x 1280  
\drawable-hdpi\background.jpg  - 540 x 960  
\drawable-mdpi\background.jpg  - 360 x 640  
\drawable-ldpi\background.jpg  - 270 x 480 

編輯:

https://android-developers.googleblog.com/...

它具有560 dpi的,其 xxhdpi和xxxhdpi初級密度水桶之間落入的量化密度。對於Nexus 6, 平臺將縮小xxxhdpi資產,但如果這些資源不是 可用,那麼它將擴大xxhdpi資產。

如何關閉它?我希望我的項目只能從我的預製圖像中拍攝圖像,我不希望它放大/縮小某些東西。

+0

嘗試scaleType'fitCenter'或顯示res文件夾樹 – egoldx

+0

看起來像您的ImageView高度不匹配match_parent。嘗試使用match_parent進行設置。我在你的FrameLayout中看到一個約束,這意味着你在ConstraintLayout中使用FrameLayout,爲什麼?嘗試使用其中的一個 – Skullper

+0

@PavliukR我把它從FrameLayout中取出,它確實像Nexus 5x一樣填滿了屏幕,但日誌仍然表示加載的背景圖像是Width = 945 Height = 1680,它應該像Nexus 5一樣加載寬度= 1080高度= 1920。我認爲它只是拉伸了形象。 – paakjis

回答

0

我認爲這是因爲屏幕的大小。你可以使用「水平指南」,這樣你就可以確定你的ImageWiew將覆蓋一定比例的屏幕。 在設計窗口中,您可以選擇「水平指南」,並將小箭頭放置在佈局上之後出現。然後點擊它3次。小箭頭將顯示「%」。希望它適合你

+0

謝謝你的回答。但它沒有幫助。它仍然加載錯誤的大小圖像。它現在只是延伸它。 – paakjis

0

更新:問題的原因可能是約screen sizedensity都不僅約密度。

嘗試這種解決方案:

創建一個新的文件夾,繪製如下圖所示

drawable-large-xxxhdpi 

您的設備具有large屏幕。這可以解決您的問題。

檢查this問題,你可以看到你的設備sizedensity


您需要更改Emulator決議。

首先,關閉您的模擬器並從Android Studio打開AVD Manager 找到您的Nexus 5X設備並檢查其分辨率。如果不正確,請點擊編輯按鈕,如下所示。

enter image description here

其次,窗口打開,單擊Change按鈕。

enter image description here

三,單擊New Hardware Profile

enter image description here

最後,因爲你想成爲然後單擊Finish按鈕改變分辨率。

enter image description here

+0

感謝您的回答。它被設置正確。我的朋友有Nexus 5x,我給他發了這個應用程序。他發回了截圖,問題仍然存在。 這裏的問題與資源有關。它爲什麼加載比1080 x 1920更小的圖像。 – paakjis

+0

@paakjis更新了我的答案,可能是此更新解決了您的問題,或使您更接近解決方案。 –

+0

沒有任何變化。我嘗試了你發佈的鏈接,並在我的應用上顯示「正常屏幕」。所以我想它是正常的,它不會在它上面加載很大。 – paakjis

1

當加載圖形內容的Android縮放圖像以匹配屏幕密度。

屏幕密度並不總是與預定義的密度相匹配,如hdpi(1.5x),xhdpi(2x)等。通常,您不提供所有預定義密度的圖像:在您的示例中,您沒有提供tvdpi (1.33)。這就是爲什麼在這些情況下,系統會調整其中一個提供的圖像以儘可能匹配屏幕密度。

Nexus 5x和Google Pixel手機的密度因子爲2.6。在這些手機上,系統會嘗試縮小xxhdpi(3x)圖像,如果不可用,則會放大xhdpi(2x)圖像。

如果要完全禁用縮放,可以將圖像放在drawable-nodpi文件夾中,並且它們將始終在每個屏幕上顯示相同數量的像素。但是,這可能不是你想要的,因爲圖像在較高密度屏幕上顯得太小而在較低密度屏幕上太大。

什麼困擾你似乎是圖像周圍的空間。當整個屏幕空間更大時,圖像佔據屏幕的較小部分是很正常的。 Nexus 5x比Nexus 5提供更多的屏幕空間。平板電腦提供的屏幕空間比手機更多。並且有無數的可能的屏幕尺寸,因此您無法創建完美匹配其中每一個的圖像。

但是,您可以將圖像置於某個背景頂部的屏幕中央,也可以使用ImageView的CENTER_CROP模式縮放圖像,使其通過切割一些邊緣來填滿整個屏幕。

+0

是的。那就是問題所在。它仍然感覺錯誤,屏幕是1080x1920,但它需要xhdpi(720x1280)圖像和自動擴展到945 x 1680,然後我需要擴大與CENTER_CROP更多,因此它適合屏幕。 – paakjis

+0

如果您將圖像放在drawable-nodpi文件夾中並使用CENTER_CROP,它將以原始大小加載並放大或縮小一次以適應屏幕。 – BladeCoder

+0

這隻適用於背景。但如果有ImageButtons。它仍然只是縮小圖像。然後我需要再次擴展它。我認爲應該有辦法告訴它停止縮小它,只是使用我準備的六個圖像包之一(無中間) – paakjis