Размещение видео внутри видеообзора
Итак, я расширил VideoView onMeasure, чтобы увеличить видео, чтобы оно соответствовало полноэкранному просмотру.
вот как:
public void setVideoAspect(int w,int h){
wVideo=w;
hVideo=h;
onMeasure(w, h);
}
@Override
protected void onMeasure (int widthMeasureSpec, int heightMeasureSpec)
{
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
if(wVideo!=0 && hVideo!=0)
setMeasuredDimension(wVideo,hVideo);
}
Я вызываю setVideoAspect() с показателями отображения (ширина, высота) экрана. Проблема заключается в том, что этот метод растягивает видео, чтобы он находился внутри экрана. Я хочу удержать соотношение сторон. (У меня 4: 3 видео и размер экрана 3: 2). Я использовал следующий код, чтобы дать измерения сохраненного отношения к виду:
int height = (int) (metrics.widthPixels*3/(float)4);
int width= metrics.widthPixels;
mVideoView.setVideoAspect(width,height);
Итак, это делает работу, но есть проблема: она дает мне 4: 3 видео с шириной экрана и правильно масштабирует высоту, но оно не центрирует видео. (Он просто обрезает нижнюю часть видео, а не верх и низ одинаково.) У меня есть относительный макет, содержащий VideoView, с гравитацией видеообзора, установленным в центр.
Ответы
Ответ 1
Попробуйте вместо этого использовать FrameLayout
. Я не уверен, почему, но если я использую Linear
или Relative
в моем коде, он не будет FrameLayout
, но FrameLayout
делает. Вот XML, который помещает мое видео на экран, сохраняя соотношение и центрируя его:
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="@drawable/bg">
<!-- Video player -->
<VideoView
android:id="@+id/surface_view"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_gravity="center"/>
</FrameLayout>
Ответ 2
Чтобы центрировать видео в RelativeLayout, я добавил как layout_gravity="center"
ad layout_centerInParent="true"
. Он работает на моем телефоне Android 4.3.
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<VideoView android:id="@+id/surface_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="center"
android:layout_centerInParent="true" />
</RelativeLayout>
Ответ 3
Cameron Ответ программным способом (в случае, если кому-то, как мне, нужен он) Этот код находится внутри onCreate активности в моем коде ('this' ниже относится к активности)
FrameLayout.LayoutParams lp = new FrameLayout.LayoutParams(
LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
FrameLayout fl = new FrameLayout(this);
fl.setLayoutParams(lp);
VideoView vv = new VideoView(this);
FrameLayout.LayoutParams lp2 = new FrameLayout.LayoutParams(lp);
lp2.gravity = Gravity.CENTER;
vv.setLayoutParams(lp2);
fl.addView(vv);
setContentView(fl);
Ответ 4
Это работает для любого видео, поддерживающего соотношение сторон видео. Он позиционирует видео внутри VideoView и выполняет Center Crop или Center Inside так же, как ImageView.
Я использую VideoView для охвата всего ConstraintLayout. Вы можете использовать любой другой макет, вероятно, с match_parent как ширину и высоту.
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent">
<VideoView
android:id="@+id/videoView"
android:layout_width="0dp"
android:layout_height="0dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</android.support.constraint.ConstraintLayout>
В onCreate:
Uri uri = //The uri of your video.
VideoView videoView = findViewById(R.id.videoView);
videoView.setVideoURI(uri);
videoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
//Get your video width and height
int videoWidth = mp.getVideoWidth();
int videoHeight = mp.getVideoHeight();
//Get VideoView current width and height
int videoViewWidth = videoView.getWidth();
int videoViewHeight = videoView.getHeight();
float xScale = (float) videoViewWidth / videoWidth;
float yScale = (float) videoViewHeight / videoHeight;
//For Center Crop use the Math.max to calculate the scale
//float scale = Math.max(xScale, yScale);
//For Center Inside use the Math.min scale.
//I prefer Center Inside so I am using Math.min
float scale = Math.min(xScale, yScale);
float scaledWidth = scale * videoWidth;
float scaledHeight = scale * videoHeight;
//Set the new size for the VideoView based on the dimensions of the video
ViewGroup.LayoutParams layoutParams = videoView.getLayoutParams();
layoutParams.width = (int)scaledWidth;
layoutParams.height = (int)scaledHeight;
videoView.setLayoutParams(layoutParams);
}
});
Надеюсь, это поможет кому-то!