Android - Лучший способ наложения кнопки воспроизведения на изображение/эскиз
У меня есть приложение для Android, которое может воспроизводить аудио/видео и показывать фотографии.
Для видео я хочу наложить кнопку воспроизведения поверх изображения предварительного просмотра, а также в виде списка.
Прямо сейчас, как я это делаю, с ImageView в xml, а затем drawable - это слойный список слоев, который я определяю программно, потому что одно из изображений является динамическим, кнопка воспроизведения, конечно, статична. Я хочу выровнять кнопку воспроизведения 10px снизу и центрировать по горизонтали.
My ImageView определяется следующим образом (в xml)
<ImageView
android:id="@+id/EvidencePreview"
android:layout_width="267dp"
android:layout_height="201dp"
android:scaleType="centerCrop"
android:layout_margin="3dp"
android:layout_gravity="center_horizontal|center_vertical"/>
ImageView является частью формы, в которой пользователь может редактировать заголовок и другую информацию.
Затем в моей деятельности теперь создаю список слоев следующим образом:
Resources resources = mContext.getResources();
Drawable playOverlayDrawable = resources.getDrawable(R.drawable.play_overlay_large);
Drawable[] layers = new Drawable[2];
layers[0] = Drawable.createFromPath(tb.filePath);
layers[1] = playOverlayDrawable;
LayerDrawable layerDrawable = new LayerDrawable(layers);
ViewGroup.LayoutParams lp = iv.getLayoutParams();
int imageHeight = lp.height;
int imageWidth = lp.width;
int overlayHeight = layers[1].getIntrinsicHeight();
int overlayWidth = layers[1].getIntrinsicWidth();
int lR = (imageWidth - overlayWidth) / 2;
int top = imageHeight - (overlayHeight + 10);
int bottom = 10;
layerDrawable.setLayerInset(1, lR, top, lR, bottom);
iv.setImageDrawable(layerDrawable);
Это работает только при горизонтальной ориентации изображения.
Имейте в виду, что изображение/миниатюра - MINI_KIND, что означает, что он должен быть 512 x 384, но я вижу, что на самом деле это не размер. На моем телефоне они либо 480x800, либо 800x480 в зависимости от ориентации камеры был в..
Поскольку моя ширина/высота макета предварительно определена, я просто хочу, чтобы слой кнопки воспроизведения полностью масштабировался и каждый раз выравнивал его.
Другой очевидный способ сделать это - использовать относительный макет (или, возможно, макет кадра?), но я надеялся избежать этого, поскольку я использую тот же код для отображения как изображений, так и видео (оба из которых иметь предварительный просмотр миниатюр изображения - но только видео должно иметь кнопку воспроизведения на них).
Любая идея, как выровнять слои со списком слоев или альтернативы, которые будут работать так же хорошо или лучше?
Ответы
Ответ 1
В итоге я использовал FrameLayout следующим образом:
<FrameLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="3dp"
android:layout_gravity="center_horizontal|center_vertical" >
<ImageView
android:id="@+id/MediaPreview"
android:layout_width="267dp"
android:layout_height="201dp"
android:scaleType="centerCrop"
android:src="@drawable/loading" />
<ImageView
android:id="@+id/VideoPreviewPlayButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingBottom="10dp"
android:layout_gravity="center_horizontal|bottom"
android:visibility="gone"
android:src="@drawable/play_overlay_large" />
</FrameLayout>
Затем я просто установил видимость на View.VISIBLE на кнопку предварительного просмотра для видео и оставил ее для фотографий.
Для моего просмотра списка я использовал метод списка слоев, показанный выше, потому что все миниатюры были одного и того же размера. Надеюсь, это поможет кому-то еще!
обратите внимание, что layout_gravity в ImageView с id VideoPreviewPlayButton помещает его в центр вниз по горизонтали, а 10dp paddingBottom немного перемещает его снизу.
Ответ 2
Рассмотрите возможность использования RelativeLayout в качестве контейнера для ваших просмотров. Это дает вам свободу размещать детские взгляды. Вы можете привязать свою кнопку к правой или верхней кромке вашего изображения.