29

使用 VideoView 是否可以为 Android 设置比例因子?默认情况下,视频视图会自行调整大小以适应视频的编码分辨率。我可以强制 Android 将视频渲染成更小或更大的矩形吗?

4

7 回答 7

58

(我知道这是一个非常老的问题,但是还有另一种控制尺寸的方法,这里没有描述,也许有人会觉得它有帮助。)

在布局中声明您自己的MyVideoView类并编写您自己的onMeasure()方法。以下是如何运行拉伸到原始视图尺寸的视频:


public class MyVideoView extends VideoView {
 @Override
 protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
  int width = getDefaultSize(0, widthMeasureSpec);
  int height = getDefaultSize(0, heightMeasureSpec);

  setMeasuredDimension(width, height);
 }
}
于 2011-01-07T12:45:48.950 回答
13

为您的和方法设置"centerCrop"比例类型可能如下所示:VideoViewonMeasure()layout()


public class CenterCropVideoView extends VideoView {
    private int leftAdjustment;
    private int topAdjustment;

 ...
    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);

        int videoWidth = getMeasuredWidth();
        int videoHeight = getMeasuredHeight();

        int viewWidth = getDefaultSize(0, widthMeasureSpec);
        int viewHeight = getDefaultSize(0, heightMeasureSpec);

        leftAdjustment = 0;
        topAdjustment = 0;
        if (videoWidth == viewWidth) {
            int newWidth = (int) ((float) videoWidth / videoHeight * viewHeight);
            setMeasuredDimension(newWidth, viewHeight);
            leftAdjustment = -(newWidth - viewWidth) / 2;
        } else {
            int newHeight = (int) ((float) videoHeight / videoWidth * viewWidth);
            setMeasuredDimension(viewWidth, newHeight);
            topAdjustment = -(newHeight - viewHeight) / 2;

        }
    }

    @Override
    public void layout(int l, int t, int r, int b) {
        super.layout(l + leftAdjustment, t + topAdjustment, r + leftAdjustment, b + topAdjustment);
    }
}
于 2015-01-17T21:58:12.400 回答
11

我发现当 VideoView 放置在 RelativeLayout 中时,视频会拉伸高度宽度以适应 VideoView 的指定高度和宽度(无论视频纵横比如何)。但是,当我将 VideoView 放在 FrameLayout 中时,视频会拉伸高度和宽度,直到它与VideoView 的指定高度或宽度之一匹配(即它不会破坏纵横比)。奇怪,我知道,但这就是我发现的!

于 2012-04-25T14:06:45.153 回答
9

默认情况下,视频视图会自行调整大小以适应视频的编码分辨率。

VideoView(或SurfaceViewfor use with MediaPlayer)将是您告诉它在布局中的大小。在该空间内,视频将在保持纵横比的同时尽可能大地播放。

我可以强制 Android 将视频渲染成更小或更大的矩形吗?

是的:让你VideoView成为你想要的大小,Android 将缩放以适应VideoView.

于 2010-01-14T23:25:33.943 回答
3

我也在努力实现这一目标,到目前为止,这一切正常。这个想法是为视频视图使用 setLayoutParams 并指定大小。它只是一个简单的片段,但它给出了想法。检查 LayoutParams 行。

VideoView mVideoView = new VideoView(this);

//intermediate code

mVideoView.setVideoPath("/sdcard/VIDEO0007.3gp");
MediaController mController = new MediaController(this);
mVideoView.setMediaController(mController);
mController.setOnTouchListener(new View.OnTouchListener() {

public boolean onTouch(View v, MotionEvent event) {
    int width = mVideoView.getMeasuredWidth();
    int height = mVideoView.getMeasuredHeight();
    //we add 10 pixels to the current size of the video view every time you touch     
    //the media controller.
    LayoutParams params = new LinearLayout.LayoutParams(width+10, height+10);
    mVideoView.setLayoutParams(params);

    return true;
}
});

mVideoView.requestFocus();
mVideoView.start();
于 2011-03-25T16:24:35.823 回答
3

FeelGoods的回答。

如果没有 layout() 方法,“ centerCrop”比例类型会更好,但 VideoView 必须在 FrameLayout 中。

@Override
public void layout(int l, int t, int r, int b) {
    super.layout(l + leftAdjustment, t + topAdjustment, r + leftAdjustment, b + topAdjustment);
}
于 2016-03-18T15:09:07.393 回答
0

伙计们,我有其他想法通过扩展 VideoView 创建自己的 VideoView 类,这样你就可以做任何你想做的事。正是你必须在你的 VideoView 中创建几个方法。

public void setDimensions(int w, int h) {
    this.mForceHeight = h;
    this.mForceWidth = w;

}

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    setMeasuredDimension(mForceWidth, mForceHeight);
}

为您的 VideoView 类创建自己的构造函数,并确保在您自己的 videoview 类中使用此方法,然后将其用作 android 的默认 videoview 到 xml 和类文件中。

希望能帮助到你。

于 2013-08-09T11:01:12.950 回答