web-dev-qa-db-ja.com

Androidは動画のスケーリングをサポートしていますか?

VideoViewを使用すると、Androidの倍率を設定できますか?デフォルトでは、ビデオビューは、エンコードされたビデオの解像度に合わせてサイズが変更されます。 Androidを強制して、ビデオを小さいまたは大きい長方形にレンダリングできますか?

27
haseman

デフォルトでは、ビデオビューは、エンコードされたビデオの解像度に合わせてサイズが変更されます。

VideoView(またはSurfaceViewで使用する場合はMediaPlayer)は、レイアウトに含めるように指定したサイズになります。 そのスペース内、ビデオはアスペクト比を維持しながら可能な限り大きく再生されます。

Androidを強制して、ビデオを小さいまたは大きい長方形にレンダリングできますか?

はい:VideoViewを必要なサイズにします。AndroidはVideoViewのサイズに合わせてスケーリングします。

9
CommonsWare

(私はそれが非常に古い質問であることを知っていますが、ここでは説明されていない、ディメンションを制御する別の方法があります。誰かがそれを参考にすると思います。)

レイアウトで独自の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);
 }
}
57

VideoViewがRelativeLayout内に配置されると、ビデオがboth高さと幅をVideoViewの指定された高さに合うように拡大することがわかりましたと幅(ビデオのアスペクト比に関係なく)。ただし、VideoViewをFrameLayoutに配置すると、ビデオは高さと幅がそれと一致するまで拡大されますone of VideoViewの指定高さまたは幅(つまり、アスペクト比を壊しません)。奇妙なことですが、それが私が見つけたものです。

10
Adil Hussain

VideoViewの_"centerCrop"_スケールタイプを設定するには、onMeasure()および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);
    }
}
_
10
FeelGood

私もそれを達成しようとしています、そして今のところこれは大丈夫です。アイデアは、ビデオビューに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();
3
silver_mx

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);
}
2
Joao Ferreira

みんな私は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);
}

ur VideoViewクラスの独自のコンストラクターを作成し、ur独自のvideoviewクラスのこのメソッドを確認してから、xmlとクラスファイルの両方にandroids default videoviewのように使用します。

それが役に立てば幸い。

0
Murali