模拟器、设备、Android Studio 通知布局差异

Emulator, Device, Android Studio Layout Differences in Notification

我正在尝试为通知布局片段...Android Studio 设计器中的模拟器和布局很好。

(模拟器示例)

(设计器示例)

但是当应用程序 运行 在目标设备上时,布局未正确对齐。

(设备布局)

设备为s7 edge,分辨率1440*2560,屏幕尺寸5.5寸,最小宽度360dp。

我根据这些规范创建了一个模拟器,并运行在上面安装应用程序。

布局在res文件夹layout-sw360dp-xxxhdpi

还有其他布局文件夹:

layout-sw320dp-hdpi

layout-sw360dp-xhdpi

layout-sw360dp-xxhdpi

layout-sw411dp-xxxhdpi

我试过缩放 imageviews、fitxy、fitstart 等...

我仔细检查了每个图像视图、布局和背景的密度像素大小。

布局XML:

<RelativeLayout 
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/media_notification_large_parent"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:padding="0dp">

<ImageView
android:id="@+id/note_far_left"
android:layout_width="6.5dp"
android:layout_height="112dp"
android:layout_alignParentLeft="true"
android:src="@mipmap/note_far_left" />

<ImageView
android:id="@+id/note_picture_top"
android:layout_width="133.5dp"
android:layout_height="13.5dp"
android:layout_alignParentTop="true"
android:layout_toRightOf="@id/note_far_left"
android:src="@mipmap/note_picture_top" />

<ImageView
android:id="@+id/note_picture"
android:layout_width="85dp"
android:layout_height="85dp"
android:layout_below="@id/note_picture_top"
android:layout_toRightOf="@id/note_far_left"
android:background="@drawable/silver_note"
android:src="@drawable/silver_note" />

<ImageView
android:id="@+id/note_picture_bottom"
android:layout_width="85dp"
android:layout_height="13.5dp"
android:layout_below="@id/note_picture"
android:layout_toRightOf="@id/note_far_left"
android:src="@mipmap/note_picture_bottom" />

<ImageView
android:id="@+id/note_title_text_top"
android:layout_width="172.75dp"
android:layout_height="6.5dp"
android:layout_alignParentTop="true"
android:layout_toRightOf="@id/note_picture_top"
android:src="@mipmap/note_title_text_top" />

<ImageView
android:id="@+id/note_picture_right_top"
android:layout_width="48.5dp"
android:layout_height="32.25dp"
android:layout_below="@id/note_picture_top"
android:layout_toRightOf="@id/note_picture"
android:src="@mipmap/note_picture_right_top" />

<ImageView
android:id="@+id/note_picture_right_bottom"
android:layout_width="14.25dp"
android:layout_height="66.25dp"
android:layout_below="@id/note_picture_right_top"
android:layout_toRightOf="@id/note_picture"
android:src="@mipmap/note_picture_right_bottom" />

<ImageView
android:id="@+id/note_title_text_bottom"
android:layout_width="172.75dp"
android:layout_height="13.5dp"
android:layout_below="@+id/note_title"
android:layout_toRightOf="@id/note_picture_right_top"
android:src="@mipmap/note_title_text_bottom" />

<TextView
android:id="@+id/note_shb1"
android:layout_width="68.5dp"
android:layout_height="13.25dp"
android:layout_below="@id/note_title_text_bottom"
android:layout_margin="0dp"
android:layout_toRightOf="@id/note_picture_right_bottom"
android:background="@mipmap/note_shb1"
android:fontFamily="@font/digital_7_mono"
android:gravity="center"
android:text="Shuffle"
android:textColor="@color/colorAccent"
android:textSize="9.25sp" />

<TextView
android:id="@+id/note_shb2"
android:layout_width="68.5dp"
android:layout_height="13.25dp"
android:layout_below="@id/note_title_text_bottom"
android:layout_margin="0dp"
android:layout_toRightOf="@id/note_shb1"
android:background="@mipmap/note_shb2"
android:fontFamily="@font/digital_7_mono"
android:gravity="center"
android:text="Hands Free"
android:textColor="@color/colorAccent"
android:textSize="9.25sp" />

<TextView
android:id="@+id/note_shb3"
android:layout_width="70dp"
android:layout_height="13.25dp"
android:layout_below="@id/note_title_text_bottom"
android:layout_margin="0dp"
android:layout_toRightOf="@id/note_shb2"
android:background="@mipmap/note_shb3"
android:fontFamily="@font/digital_7_mono"
android:gravity="center"
android:text="Bluetooth"
android:textColor="@color/colorAccent"
android:textSize="9.25sp" />

<ImageView
android:id="@+id/note_button_top"
android:layout_width="207dp"
android:layout_height="18dp"
android:layout_below="@id/note_shb1"
android:layout_toRightOf="@id/note_picture_right_bottom"
android:clickable="true"
android:scaleType="centerInside"
android:src="@mipmap/note_button_top" />

<ImageView
android:id="@+id/note_shuffle"
android:layout_width="34.25dp"
android:layout_height="35dp"
android:layout_below="@id/note_button_top"
android:layout_toRightOf="@id/note_picture_right_bottom"
android:clickable="true"
android:src="@drawable/note_shuffle_selector" />

<ImageView
android:id="@+id/note_back"
android:layout_width="34.25dp"
android:layout_height="35dp"
android:layout_below="@id/note_button_top"
android:layout_toRightOf="@id/note_shuffle"
android:clickable="true"
android:src="@drawable/note_back_selector" />

<ImageView
android:id="@+id/note_stop"
android:layout_width="34.25dp"
android:layout_height="35dp"
android:layout_below="@id/note_button_top"
android:layout_toRightOf="@id/note_back"
android:clickable="true"
android:src="@drawable/note_stop_selector" />

<ImageView
android:id="@+id/note_play"
android:layout_width="34.25dp"
android:layout_height="35dp"
android:layout_below="@id/note_button_top"
android:layout_toRightOf="@id/note_stop"
android:clickable="true"
android:src="@drawable/note_play_selector" />

<ImageView
android:id="@+id/note_next"
android:layout_width="34.25dp"
android:layout_height="35dp"
android:layout_below="@id/note_button_top"
android:layout_toRightOf="@id/note_play"
android:clickable="true"
android:src="@drawable/note_next_selector" />

<ImageView
android:id="@+id/note_hands"
android:layout_width="35.75dp"
android:layout_height="35dp"
android:layout_below="@id/note_button_top"
android:layout_toRightOf="@id/note_next"
android:clickable="true"
android:src="@drawable/note_hands_selector" />

<TextView
android:id="@+id/note_title"
android:layout_width="137dp"
android:layout_height="25.75dp"
android:layout_below="@id/note_title_text_top"
android:layout_margin="0dp"
android:layout_toRightOf="@id/note_picture_right_top"
android:background="@mipmap/note_title_text"
android:ellipsize="end"
android:fontFamily="@font/digital_7_mono"
android:gravity="center"
android:paddingStart="1dp"
android:paddingEnd="1dp"
android:singleLine="true"
android:text="@string/emergency_broadcast"
android:textColor="@color/colorAccent"
android:textSize="16sp" />

<ImageView
android:id="@+id/note_power"
android:layout_width="35.75dp"
android:layout_height="25.75dp"
android:layout_alignTop="@+id/note_title"
android:layout_toRightOf="@id/note_title"
android:clickable="true"
android:src="@drawable/note_power_selector" />

(编辑:为通知生成器添加代码) 构建通知的代码:

if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M){
        builder.setStyle(new NotificationCompat.DecoratedCustomViewStyle());
    }else{
        builder.setStyle(new NotificationCompat.BigPictureStyle());
    }

            builder
            .setSmallIcon(R.drawable.icon)
            .setContentTitle(description.getTitle())
            .setSubText(metadataCompat.getText(MediaMetadataCompat.METADATA_KEY_DISPLAY_SUBTITLE))
            .setVisibility(NotificationCompat.VISIBILITY_PUBLIC)
            .setContentIntent(pContentIntent);



    return builder;

我没主意了,我错过了什么?

确保您已将切片图像放置在相同的 dpi 中。

1- 最好使用父布局的 xml 可绘制背景并在左上角添加左侧矩形。

2- 使用 android:scaleType="FIT_XY" 来实现。

https://developer.android.com/reference/android/widget/ImageView.ScaleType

确保@id/note_title_text_bottom 的宽度等于所有布局文件中note_title 和note_power 的总和(适用于所有屏幕尺寸)。否则,其中一个密度的 @mipmap/note_title_text_bottom" 有问题。 无论如何,最好使用相对大小和缩放你的可绘制对象,而不是使用具有绝对值的多个布局,这真的很难维护和缩放。