Как сделать так, чтобы изображение соответствовало пользовательскому 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 ответ:
Единственное решение-создать свой собственный 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, и если я получите какой-нибудь ответ, я обновлю это.