2017-05-09 1 views
2

Ich habe kein Nexus 5x Gerät, aber ich benutze Emulator.Android-Emulator Nexus 5x lädt falsche Zeichengröße?

Bearbeiten: Von einem Nexus 5x-Benutzer bestätigt. Es ist kein Emulator-Fehler.

Problem:

Auf Nexus 5x App lädt falsche Größe Drawables. Während auf Nexus 5 ist in Ordnung.

Ich habe ein Bild Originalgröße 1440x2560. Resized es ziehbar-xxhdpi - 1080x1920

Log gibt mir auch etwas Interessantes:

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 

Mein Code.

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> 

Bearbeiten:

Resource Tree wie angefordert.

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 

Edit:

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

Es hat eine Dichte von quantisierten 560 dpi, die zwischen dem xxhdpi und xxxhdpi Primärdichte Eimern in fällt. Für das Nexus 6 wird die Plattform xxxhdpi-Assets herunterskalieren, aber wenn diese nicht verfügbar sind, werden die xxhdpi-Assets vergrößert.

Wie schalte ich es aus? Ich möchte, dass mein Projekt NUR Bilder von meinen vorgefertigten Bildern aufnimmt, ich möchte nicht, dass es etwas vergrößert/verkleinert.

+0

versuchen Sie scaleType 'fitCenter' oder zeigen Sie Ihre Res Ordner Baum – egoldx

+0

Sieht aus wie Ihre ImageView Höhe nicht Match_parent. Versuchen Sie es mit match_parent zu setzen. Und ich sehe Einschränkungen in Ihrem FrameLayout, das heißt, dass Sie FrameLayout in ConstraintLayout verwenden, warum? Versuchen Sie eine von ihnen zu verwenden – Skullper

+0

@PavliukR Ich nahm es aus FrameLayout, es füllte den Bildschirm wie auf Nexus 5x, aber das Protokoll sagt immer noch, dass geladene Bacground Bild Breite = 945 Höhe = 1680 ist, wo es wie Nexus 5 laden sollte Breite = 1080 Höhe = 1920. Ich denke, es hat nur das Bild gestreckt. – paakjis

Antwort

0

Ich denke, das passiert wegen der Größe des Bildschirms. Sie können die "horizontale Hilfslinie" verwenden, so dass Sie sicher sein können, dass Ihr ImageWiew den bestimmten Prozentsatz des Bildschirms abdeckt. Im Design-Fenster können Sie die "horizontale Hilfslinie" auswählen und nach dem Platzieren auf Ihrem Layout erscheint ein kleiner Pfeil. Dann klicke dreimal darauf. Kleiner Pfeil zeigt "%" an.Hoffe, dass es für Sie

+0

Danke für die Antwort. Aber es hat nicht geholfen. Es lädt immer noch falsches Bild. Es dehnt es gerade jetzt aus. – paakjis

0

UPDATE funktioniert: Grund des Problems ist wahrscheinlich über screen size und density beide, nicht nur über die Dichte. Versuchen

dieser Lösung:

erstellen Sie einen neuen ziehbar Ordner wie unter

drawable-large-xxxhdpi 

Ihr Gerät verfügt über large Bildschirm. Dies kann Ihr Problem beheben.

Überprüfen Sie this Frage, können Sie Ihr Gerät size und density sehen.


Sie müssen Emulator Auflösung ändern.

Schließen Sie zuerst Ihren Emulator und öffnen Sie AVD Manager von Android Studio Finden Sie Ihr Nexus 5X Gerät und überprüfen Sie seine Auflösung. Wenn dies nicht der Fall ist, klicken Sie auf Bearbeiten, wie unten gezeigt.

enter image description here

Zweitens öffnete das Fenster, klicken Sie auf Change Taste.

enter image description here

Drittens klicken New Hardware Profile

enter image description here

Endlich Auflösung ändern, wie Sie Finish Taste sein möchten und klicken Sie auf.

enter image description here

+0

Danke für Ihre Antwort. Es ist korrekt eingestellt. Mein Freund hat ein Nexus 5x, ich habe ihm diese App geschickt. Er hat einen Screenshot geschickt und das Problem ist immer noch da. Das Problem hier ist etwas mit Ressourcen zu tun. Warum lädt es kleiner als 1080 x 1920 Bild. – paakjis

+0

@paakjis Aktualisiert meine Antwort, kann dieses Update Ihr Problem lösen, oder Sie näher an der Lösung. –

+0

Nichts hat sich geändert. Ich habe den Link, den Sie gepostet haben, ausprobiert und auf meiner App steht "Normaler Bildschirm". Also ich denke es ist normal und es wird nicht viel darauf laden. – paakjis

1

Wenn Drawables Laden skaliert Android die Bilder der Rasterdichte anzupassen.

Bildschirmdichten stimmen nicht immer mit den vordefinierten Dichten wie hdpi (1,5x), xhdpi (2x) usw. überein. Normalerweise liefern Sie keine Bilder für alle vordefinierten Dichten. In Ihrem Beispiel haben Sie tvdpi nicht bereitgestellt (1.33) zum Beispiel. Aus diesem Grund passt das System in diesen Fällen eines der bereitgestellten Bilder so an, dass es der Bildschirmdichte bestmöglich entspricht.

Die Nexus 5x und Google Pixel Telefone haben einen Dichtefaktor von 2,6. Bei diesen Telefonen versucht das System, die xxhdpi (3x) Bilder zu verkleinern oder die xhdpi (2x) Bilder zu vergrößern, falls diese nicht verfügbar sind.

Wenn Sie die Skalierung vollständig deaktivieren möchten, können Sie Bilder in den Drawable-Nodpi-Ordner stellen und sie werden immer die gleiche Anzahl von Pixeln auf jedem Bildschirm anzeigen. Das ist jedoch wahrscheinlich nicht das, was Sie wollen, da das Bild auf Bildschirmen mit höherer Dichte zu klein und auf Bildschirmen mit niedriger Dichte zu groß erscheint.

Was dich stört scheint der Raum um das Bild zu sein. Es ist normal, dass ein Bild einen kleineren Teil des Bildschirms einnimmt, wenn der gesamte Bildschirm größer ist. Ein Nexus 5x bietet mehr Platz auf dem Bildschirm als ein Nexus 5. Ein Tablet bietet mehr Platz auf dem Bildschirm als ein Telefon.Und es gibt unendlich viele mögliche Bildschirmgrößen, so dass Sie kein Bild erstellen können, das perfekt mit jedem übereinstimmt.

Sie können jedoch ein Bild in der Mitte des Bildschirms oberhalb eines Hintergrunds zentrieren, oder Sie können das Bild mithilfe des CENTER_CROP-Modus von ImageView skalieren, damit es den gesamten Bildschirm ausfüllt, indem Sie einige Kanten ausschneiden.

+0

Ja. Das ist das Problem. Es fühlt sich immer noch so falsch an, dass der Bildschirm 1080x1920 ist, aber es nimmt xhdpi (720x1280) Bild und skaliert es automatisch auf 945 x 1680, und dann muss ich es mehr mit CENTER_CROP skalieren, damit es auf den Bildschirm passt. – paakjis

+0

Wenn Sie das Bild im Drawable-Nodpi-Ordner ablegen und CENTER_CROP verwenden, wird es in seiner Originalgröße geladen und einmal auf den Bildschirm skaliert. – BladeCoder

+0

Dies würde nur für einen Hintergrund arbeiten. Aber wenn es ImageButtons gibt. Es verkleinert das Bild immer noch. Und dann muss ich es wieder vergrößern. Ich denke, dass es eine Möglichkeit geben sollte, es zu reduzieren, benutze einfach eins der sechs Bilderpakete, die ich vorbereitet habe (keine dazwischen) – paakjis

Verwandte Themen