我正在使用DraggablePanel库(https://github.com/pedrovgs/DraggablePanel)来实现类似于YouTube的视频播放器。如果您不熟悉此功能,它基本上允许用户将当前播放的视频缩小为一个小缩略图,并停靠在屏幕的角落。
不幸的是(我不确定这是否是上述库的问题),我注意到如果我在VideoView的父视图上应用X和Y比例,则VideoView本身不会调整其内容以匹配新的比例。
请参见以下截屏,其中VideoView处于其自然比例,然后其父视图缩小到约0.6:0.6。您应该注意到,在缩放的截图中,VideoView已裁剪其内容而不是调整大小以适应。
不幸的是(我不确定这是否是上述库的问题),我注意到如果我在VideoView的父视图上应用X和Y比例,则VideoView本身不会调整其内容以匹配新的比例。
请参见以下截屏,其中VideoView处于其自然比例,然后其父视图缩小到约0.6:0.6。您应该注意到,在缩放的截图中,VideoView已裁剪其内容而不是调整大小以适应。
我尝试在VideoView中强制设置宽度和高度,以适应其父级比例的变化。互联网上有一些关于覆盖VideoView尺寸的示例 - 但这是我的简单版本:
public class ScalableVideoView extends VideoView {
private int mVideoWidth;
private int mVideoHeight;
public ScalableVideoView(Context context) {
super(context);
}
public ScalableVideoView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public ScalableVideoView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
mVideoWidth = 0;
mVideoHeight = 0;
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
if (mVideoWidth > 0 && mVideoHeight > 0) {
// If a custom dimension is specified, force it as the measured dimension
setMeasuredDimension(mVideoWidth, mVideoHeight);
} else {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
}
public void changeVideoSize(int width, int height) {
mVideoWidth = width;
mVideoHeight = height;
getHolder().setFixedSize(width, height);
requestLayout();
invalidate();
}
}
包含VideoView的片段在收到DraggablePanel库发出的关于缩放变化的通知时,负责调用其上的changeVideoSize方法。此时,我根据提供的比例值计算新的宽度和高度。(比例范围为0f至1f)
public void setVideoViewScale(float scaleX, float scaleY) {
if (mMaxVideoWidth == 0) {
mMaxVideoWidth = mVideoView.getWidth();
}
if (mMaxVideoHeight == 0) {
mMaxVideoHeight = mVideoView.getHeight();
}
if (mMaxVideoWidth > 0) {
mVideoView.changeVideoSize((int) (scaleX * mMaxVideoWidth),
(int) (scaleY * mMaxVideoHeight));
}
}
不幸的是,这会导致一些非常有趣的结果。似乎VideoView的视频部分正在适当地缩放,但是VideoView的边界似乎缩放得太快(导致视频既缩小又裁剪)。
以下是两个视频,以进一步演示:
- https://github.com/npike/so_scalevideoview/blob/master/demo_videos/so_videoview_noscale.mp4
- https://github.com/npike/so_scalevideoview/blob/master/demo_videos/so_videoview_scale.mp4