我正在使用DraggablePanel库(https://github.com/pedrovgs/DraggablePanel)来促进类似YouTube的视频播放器。如果您不熟悉此功能,它基本上允许用户将当前正在播放的视频缩小为停靠在屏幕角落的小缩略图。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负责调用changeVideoSize上它时,它接收来自一个通知的片段DraggablePanel库关于比例变化。在这一点上,我根据提供的比例值计算出一对新的宽度和高度。 (规模从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
我还上传了该示例项目GitHub上,这样就可以看到完整的代码: https://github.com/npike/so_scalevideoview