2017-05-09 97 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