2

создать пользовательский (большой) уведомление со следующей планировкой:ScaleType не cropCenter работает на пользовательском макете Notification - Android 4.x

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
       android:layout_width="match_parent" 
       android:layout_height="match_parent" 
       android:orientation="vertical"> 

    <ImageView 
     android:id="@+id/image" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:scaleType="centerCrop"/> 

</LinearLayout> 

и создать уведомление, как это:

private void showNotificationWithImage(Bitmap image) { 

    RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.notification); 
    remoteViews.setImageViewBitmap(R.id.image, image); 

    Notification notification = new NotificationCompat.Builder(context) 
      .setSmallIcon(R.drawable.n_icon) 
      .setCustomBigContentView(remoteViews) 
      .setContentIntent(PendingIntent.getActivity(context, 0, new Intent(context, MainActivity.class), 0)) 
      .build(); 

    notificationManager.notify(0, notification); 
} 

Отображаемое изображение: this one.

На Android 5.0 вверх, изображения правильно масштабированная (centerCrop, ось у точно подходит) в пределах ImageView:

Image scaled correctly

На Android 4.1.x (SDK лвл 16), однако изображение не масштабируется правильно:

Image NOT scaled correctly

Разрешение в обоих примерах идентично.

  • Обратите внимание, что эта проблема возникает только на ImageView в настраиваемой уведомления (большой контент), не Activities т.д.

  • Использование fitCenter и т.д. это не вариант, потому что изображение должно охватывать всю ширину (ИЛИ высота)

  • Я попытался установить высоту изображения в wrap_content, ту же проблему. Кажется, что он работает при установке высоты ImageView, поэтому он грубо соответствует формату изображения, но это не вариант, так как я хочу отображать изображения с различными пропорциями.

Кто-нибудь знает, как это исправить?

PS: Вы можете проверить мой тестовый проект here.

EDIT: Настройка высоты изображения к wrap_content и добавление adjustViewBounds="true" как предложено rom4ek результаты в следующем, как только уведомление хитов это максимум heigth: Link to Image

+0

Если вы хотите сохранить соотношение сторон изображения, вы должны использовать ScaleType centerInside. или вы хотите поместить изображение, а затем FIT_XY. –

+0

@Cetan centerCrop DOES поддерживает аспектный рацион (https://developer.android.com/reference/android/widget/ImageView.ScaleType.html) и должен соответствовать изображению, чтобы точно совпадала одна ось. – FWeigl

+0

Да, но это Crop формирует все боковое изображение и показывает изображение из центра. –

ответ

0

Просто установите ваши ImageView «с Высота до wrap_content и добавить android:adjustViewBounds="true" линии к нему, а также, и это будет работать:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      android:orientation="vertical"> 

    <ImageView 
     android:id="@+id/image" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:adjustViewBounds="true" 
     android:scaleType="centerCrop"/> 

</LinearLayout> 

Как это выглядит на Android 4.1.1, API 16:

enter image description here

+0

Но это было начальное требование @Ascorbin? Я думаю, что он пытался добиться такого же поведения, как на Lollipop. – azizbekian

+0

Во-первых, это поведение зависит не только от версии ОС, но и от размера экрана. Во-вторых, это точно такое же поведение, как и у Lollipop. – rom4ek

+0

@ rom4ek. К сожалению, это работает только тогда, когда вид уведомления достаточно велик, чтобы удерживать изображение. Как только уведомление достигнет максимальной высоты, изображение отображается неправильно. Я добавил TextView над ImageView, чтобы продемонстрировать это: http://de.tinypic.com/r/orlesy/9 – FWeigl

0

Из документа Android API,

setCustomBigContentView

NotificationCompat.Builder setCustomBigContentView (RemoteViews contentView) Поставка пользовательских RemoteViews использовать вместо шаблона платформы в расширенной форма. Это переопределит расширенный макет, который в противном случае был бы сконструирован этим объектом Builder. No-op для версий до JELLY_BEAN.

Пожалуйста, проверьте его ниже ссылке:

https://developer.android.com/reference/android/support/v4/app/NotificationCompat.Builder.html#setCustomBigContentView(android.widget.RemoteViews)

Обновлено:

Это не решение. Но это простое предложение для достижения этого.

private void showNotificationWithImage(Bitmap image) { 
    RemoteViews remoteViews = new RemoteViews(context.getPackageName(), `R.layout.notification);` 
remoteViews.setImageViewBitmap(R.id.image, image); 

Notification notification; 
RemoteViews bigView = new RemoteViews(context.getPackageName(), 
     R.layout.notification); 

bigView.setImageViewResource(R.id.image, R.mipmap.ic_launcher); 

NotificationCompat.Builder mNotifyBuilder = new NotificationCompat.Builder(context); 
notification = mNotifyBuilder.setContentTitle("Title") 
     .setContentText("Slide down to expand") 
     .setSmallIcon(R.drawable.n_icon) 
     .setLargeIcon(image) 
     .setCustomBigContentView(remoteViews) 
     .build(); 
// now show notification.. 
NotificationManager mNotifyManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); 
mNotifyManager.notify(1, notification); 
} 

Пожалуйста, проверьте этот метод. когда вы удаляете уведомление, изображение будет отображаться полностью. Он протестирован в Android_4.2.2.

+0

Jelly Bean - это Android 4.1.x (https://source.android.com/source/build- numbers.html), мой снимок экрана был сделан на этом. Это не должно быть проблемой. Отредактированный вопрос для ясности. – FWeigl

+0

Масштабирование вопроса для меня одинаково с этим кодом :( – FWeigl