質問

VideoViewを使用すると、それは、Androidのためのスケール係数を設定することが可能でしょうか?デフォルトでビデオビューは、ビデオのエンコードされた解像度に合わせて自身のサイズを変更します。私は小さいまたは大きい矩形にビデオをレンダリングするには、Androidを強制することはできますか?

役に立ちましたか?

解決

  

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

VideoView(またはSurfaceViewで使用するMediaPlayer)は、あなたのレイアウトにすることを教えサイズになります。 のその空間内での縦横比を維持しながら、映像はできるだけ大きくして再生されます。

  

私はビデオをレンダリングするには、Androidを強制することができます   小さいまたは大きい矩形に?

はい:あなたのVideoViewが希望サイズで作る、とAndroidはVideoViewのサイズに合わせて調整されます。

他のヒント

(私はそれが非常に古い質問ですけど、多分誰かがそれが役に立つでしょう、ここでは説明されていない寸法を制御する別の方法があります。)

あなたのレイアウトに独自のの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);
 }
}

私はVideoViewはRelativeLayoutの内側に配置されている場合、ビデオストレッチは関係なく、ビデオのアスペクトの(VideoViewの指定された高さと幅に合わせての の両方の高さと幅をすることを見つけます比率)。私はでframeLayoutでVideoViewを置いたときに、それはののVideoViewの指定された高さまたは幅(すなわち、それは、アスペクト比を破壊しないのの のいずれかに一致するまでしかし、ビデオは高さと幅を伸ばします)。奇妙な、私は知っているが、それは私が見つけたものです!

"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);
    }
}

私もそれを達成しようとしていますし、これまでのところ、これはOK取り組んできました。アイデアは、ビデオ・ビューの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();

への FeelGoods の答えます。

レイアウトなし()メソッド "の 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);
}

Guysは私がuはuがほしいと思う何ができるように、VideoViewを拡張することで、独自のVideoViewクラスを作成し、他のアイデアを持っていました、。正確にuがあなたの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クラスに対して独自のコンストラクタを作成して、XMLとクラスファイルの両方にアンドロイドのようなデフォルトvideoviewとしてそれを使用するウル自身videoviewクラスでこのメソッドを確認してください。

それがお役に立てば幸いです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top