문제

VideoView를 사용하면 Android의 배율을 설정할 수 있나요?기본적으로 비디오 보기는 비디오의 인코딩된 해상도에 맞게 자체 크기를 조정합니다.Android에서 비디오를 더 작거나 더 큰 직사각형으로 렌더링하도록 강제할 수 있나요?

도움이 되었습니까?

해결책

기본적으로 비디오보기는 비디오의 인코딩 된 해상도에 맞게 크기를 조정합니다.

VideoView (아니면 그 SurfaceView 함께 사용합니다 MediaPlayer)는 당신이 당신의 레이아웃에 있다고 말하는 크기입니다. 그 공간 내에서, 비디오는 종횡비를 유지하면서 가능한 한 크게 재생됩니다.

안드로이드를 강제로 비디오를 더 작거나 큰 직장으로 렌더링 할 수 있습니까?

예 : 당신을 만드십시오 VideoView 원하는 크기가되고 Android는 크기에 맞게 확장됩니다. VideoView.

다른 팁

(매우 오래된 질문이라는 것을 알고 있지만 치수를 제어하는 ​​또 다른 방법이 있습니다. 여기에는 설명되어 있지 않습니다. 아마도 누군가가 도움이 될 것입니다.)

자신의 것을 선언하세요 내 비디오 보기 레이아웃에 클래스를 추가하고 직접 작성하세요. 측정() 방법.원본 보기의 크기로 확장된 비디오를 실행하는 방법은 다음과 같습니다.


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의 지정된 높이와 너비에 맞는 높이와 너비 (비디오 종횡비에 관계없이). 그러나 videoview를 framelayout에 배치하면 비디오가 일치 할 때까지 높이와 너비가 늘어납니다. 하나의 videoview의 지정된 높이 또는 너비 (즉, 종횡비를 깨뜨리지 않음). 이상하게도 알아요.하지만 그게 내가 찾은 것입니다!

설정 "centerCrop" 스케일 유형 VideoView 당신의 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);
    }
}

나는 또한 그것을 달성하려고 노력하고 있으며 지금까지 이것은 잘 작동했습니다. 아이디어는 비디오보기에 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();

에게 느낌 대답.

레이아웃 () 메소드가 없으면 "센터 크롭 " 스케일 유형이 더 좋지만 videoview는 framelayout에 있어야합니다.

@Override
public void layout(int l, int t, int r, int b) {
    super.layout(l + leftAdjustment, t + topAdjustment, r + leftAdjustment, b + topAdjustment);
}

내가 다른 아이디어를 가진 사람들은 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 클래스 에서이 메소드를 xml 및 클래스 파일에 모두 Androids 기본 videoview와 같이 사용하십시오.

도움이되기를 바랍니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top