Как сделать так, чтобы изображение соответствовало пользовательскому 256dp Big Picture Notification в Android?


Я пытаюсь поместить (в центре и внутри) 2 вида изображений, полученных из веб-сервисов, в уведомление в стиле Big Picture. Один вид имеет размер 97px*150px, а другой 300px*100px.

Поскольку я проверил, что изображение должно соответствовать 256dp tall max height, чтобы поместиться в визуальной области Jelly Bean's Big Picture notification, поэтому я ожидал, что я могу вызвать матричные шкалы, доступные на ImageView (fitXT, centerInside и т. д.), Но я удивлен, что нет поведения метода масштабирования, доступного для настройки и настройки. растровое изображение всегда обрезается по центру, что, кстати, является худшим поведением матрицы по умолчанию, которое я бы выбрал по умолчанию, потому что изображения всегда обрезаются каким-то образом. Центр внутреннего поведения для дефолта было бы лучше, я думаю.

Итак, это оставляет мне место для этих возможностей:

  • предварительное масштабирование изображений с использованием какого-то типа пикселей методом dp. Этот метод также должен учитывать соотношение сторон. После этого использовать эту новую картину в отношении уведомления застройщика, который (я надеюсь) будут уважать iomages, потому что никакого поведения за пределами границ не произойдет.
  • создайте свой собственный RemoteView, чтобы использовать ImageView и получить доступ к поведению масштабной матрицы.
  • отправьте запрос на новую функцию в Google:)
  • отправьте запрос на ошибку в Google:)

Какой вариант вы считаете или знаете как лучший? Есть ли какой-то другой вариант, который я мог бы упустить?

EDIT: я протестировал несколько методов для матричного масштабирования изображений с успехом, но центр-обрезка всегда есть по умолчанию, чтобы сломать и вырезать мои изображения, что делает его невозможным для использования.

Я попробую теперь метод RemoteView.

Я также подал вопрос 58318 для этого, пытаясь облегчить жизнь будущим разработчикам, пытающимся выполнить эту задачу: https://code.google.com/p/android/issues/detail?id=58318

1   3  

1 ответ:

Единственное решение-создать свой собственный RemoteView следующим образом:

Во-первых, пользовательский макет:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
            android:id="@+id/status_bar_latest_event_content"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="@android:drawable/list_selector_background">

<ImageView
        android:id="@+id/big_icon"
        android:layout_width="34dp"
        android:layout_height="34dp"
        android:layout_marginTop="15dp"
        android:layout_marginLeft="15dp"
        android:scaleType="fitCenter"
        />

<TextView
        android:id="@+id/title"
        android:text="sometitlestringfromresources"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:singleLine="true"
        android:ellipsize="marquee"
        android:fadingEdge="horizontal"
        android:textAppearance="?android:attr/textAppearanceLarge"
        android:layout_alignBottom="@+id/big_icon"
        android:layout_toRightOf="@+id/big_icon"
        android:layout_marginLeft="15dp"/>


<ImageView
        android:id="@+id/big_picture"
        android:layout_width="match_parent"
        android:layout_height="192dp"
        android:layout_marginTop="64dp"
        android:scaleType="fitCenter" //This scale will show your picture without crop
        />

И реализация RemoteView:

  if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
            RemoteViews views;
            views = new RemoteViews(getPackageName(), R.layout.custom_notification);
            views.setImageViewBitmap(R.id.big_picture, bitmap);
            views.setImageViewBitmap(R.id.big_icon, BitmapFactory.decodeResource(getResources(), R.drawable.your_24x24dp_brand_icon));
            views.setTextViewText(R.id.title, message);
            myNotification.bigContentView = views;
        }

        NotificationManager notificationManager = (NotificationManager)
                context.getSystemService(Context.NOTIFICATION_SERVICE);

                notificationManager.notify(randomInt, myNotification);

Где myNotification-это ваш конструктор уведомлений, а randomInt - моя собственная реализация, чтобы уведомления не перекрывались (проверьте, не нужно ли вам заменить уведомления или создать несколько).

  Random randomGenerator = new Random();
  int randomInt = randomGenerator.nextInt(100);

И это все. Может быть, немного грязновато, но это работает. Я оставлю ошибку открытой для Google, и если я получите какой-нибудь ответ, я обновлю это.