在Android的VideoView中,有没有办法实现与ImageView.ScaleType.CENTER_CROP相同的效果?
也就是说,我希望我的VideoView能够播放视频,使其在不失真的情况下填满整个屏幕.如果视频宽高比不完全适合屏幕,则应裁剪而不是扭曲.
以下解决方案将填满屏幕,但不保持视频的宽高比:https: //stackoverflow.com/a/6927300/1068656
此解决方案保持视频的宽高比,但不会填满整个屏幕(视频会缩放,直到较长的一侧到达屏幕边缘,从而在侧面引入条形图):https: //stackoverflow.com/a/4855315/1068656
我正在使用纹理视图在我的服务器上播放视频,但是它会拉伸视频并且无法保持视频的宽高比.但是,我希望保持视频的长宽比,如在应用程序或Instagram应用程序中.
我有一个 RelativeLayout
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_gravity="center"
android:foregroundGravity="center"
android:gravity="center"
android:orientation="horizontal" >
<VideoView
android:id="@+id/videoViewPanel"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_gravity="center"
android:layout_centerInParent="true"/>
</RelativeLayout>
Run Code Online (Sandbox Code Playgroud)
我需要的是显示视频全屏裁剪.如果我可以与ImageView进行比较,我需要将其显示为crop_center.
如何让VideoView不自动调整视频大小以适应中心,但裁剪中心?
我玩视频从URL上Exoplayer,它伸展在调整视频/使用resize_mode,因为我已经在布局文件中使用此提到的我不能够保持视频的纵横比.
我想像CENTER_CROP我们TextureSurface在image2中提到的那样进行缩放类型,但我得到输出为image1
我试过以下例子
我的输出(图1)和预期输出(图2)
exoplayer布局代码
<com.google.android.exoplayer2.ui.SimpleExoPlayerView
android:id="@+id/player_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:resize_mode="fill" />
Run Code Online (Sandbox Code Playgroud)
使用这条线,app:resize_mode="fill"它可以在屏幕上显示视频但是垂直拉伸,那么我该如何解决这个问题.
我正在使用VideoView来显示视频流.因为我需要将MediaController附加到视图本身,我想防止视频视图导致的黑屏闪烁.我在Nexus 7上测试了下面的代码,就像一个魅力.但是现在我在我的SGS2上测试了它,并且由于某种原因从未调用过OnVideoSizeChanged.
@Override
public void onPrepared(MediaPlayer mp) {
// TODO Auto-generated method stub
Log.i("ONPREP", "called");
mp.setOnVideoSizeChangedListener(new OnVideoSizeChangedListener() {
@Override
public void onVideoSizeChanged(MediaPlayer mp, int width, int height) {
videoview.setMediaController(mc);
mc.setAnchorView(videoview);
videoview.setBackgroundColor(Color.TRANSPARENT);
Log.i("ONSIZECHANGE", "called");
}
});
}
Run Code Online (Sandbox Code Playgroud)
视频播放应该是这样,我通过删除OnVideoSizeChangedListener并将代码放在onPrepared方法中进行测试,但这会带回屏幕闪烁问题并使mediacontroller无法连接.此行为也由LogCat中的日志信息显示,ONPREP标记显示但从不显示ONSIZECHANGE.在我的N7上都显示,显然会导致背景颜色发生变化.
这是设置和启动视频的代码:
videoview.setOnPreparedListener(MainActivity.this);
mc = new MediaController(MainActivity.this);
mc.setMediaPlayer(videoview);
videoview.setVideoURI(videourI);
videoview.start();
Run Code Online (Sandbox Code Playgroud)
那么为什么要在一台设备上调用而不在另一台设备上呢?
编辑:在我的Note 2上测试它,与SGS2上的问题相同.