Android模拟器Nexus 5x加载错误的可绘制大小?

时间:2017-05-09 10:07:28

标签: java android drawable nexus-5x

我没有Nexus 5x设备,但我正在使用仿真器。

编辑:来自Nexus 5x用户确认。它不是一个模拟器错误。

问题:

在Nexus 5x应用程序中加载不正确的大小drawable。在Nexus 5上很好。

Right - Nexus 5 , Left - Nexus 5X

我的图片原始尺寸为1440x2560。将其调整为 drawable-xxhdpi - 1080x1920

日志也给我带来了一些有趣的东西:

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资产。

如何将其关闭?我希望我的项目只能从我的预制图像中获取图像,我不希望它按比例放大/缩小。

2 个答案:

答案 0 :(得分:1)

在加载drawable时,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模式缩放图像,使其通过切割边缘来填充整个屏幕。

答案 1 :(得分:0)

  

更新:问题的原因可能是screen sizedensity两者,不仅仅是关于密度。

尝试此解决方案:

创建一个新的可绘制文件夹,如下所示

drawable-large-xxxhdpi

您的设备有large屏幕。这可以解决您的问题。

检查this问题,您可以看到自己的设备sizedensity

您需要更改Emulator分辨率。

首先,关闭您的模拟器并从AVD Manager打开Android Studio 找到您的Nexus 5X设备并检查其分辨率。如果不正确,请单击编辑按钮,如下所示。

enter image description here

其次,打开窗口,点击Change按钮。

enter image description here

第三步,点击New Hardware Profile

enter image description here

最后,根据需要更改分辨率,然后点击Finish按钮。

enter image description here