2

我没有 Nexus 5x 设备,但我使用的是模拟器。

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

问题:

在 Nexus 5x 应用程序加载不正确大小的可绘制对象。虽然在 Nexus 5 上很好。

右 - Nexus 5,左 - 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>

编辑:

按要求提供资源树。

在此处输入图像描述

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

我该如何关闭它?我希望我的项目只从我的预制图像中获取图像,我不希望它放大/缩小某些东西。

4

2 回答 2

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 模式缩放图像,通过切割一些边缘使其充满整个屏幕。

于 2017-05-11T10:17:08.027 回答
0

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

试试这个解决方案:

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

drawable-large-xxxhdpi

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

检查问题,您可以看到您的设备sizedensity.


您需要更改Emulator分辨率。

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

在此处输入图像描述

二、窗口打开,点击Change按钮。

在此处输入图像描述

三、点击New Hardware Profile

在此处输入图像描述

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

在此处输入图像描述

于 2017-05-09T14:08:28.893 回答