Created
November 12, 2015 11:31
-
-
Save Folyd/82630b57188c8170f73b to your computer and use it in GitHub Desktop.
A enhance SurfaceView which support scale content size according to aspect ratio.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
public class VideoSurfaceView extends SurfaceView implements MediaPlayer.OnVideoSizeChangedListener { | |
private int mVideoWidth; | |
private int mVideoHeight; | |
public VideoSurfaceView(Context context) { | |
super(context); | |
} | |
public VideoSurfaceView(Context context, AttributeSet attrs) { | |
super(context, attrs); | |
} | |
public VideoSurfaceView(Context context, AttributeSet attrs, int defStyleAttr) { | |
super(context, attrs, defStyleAttr); | |
} | |
/** | |
* Set video size. | |
* | |
* @see MediaPlayer#getVideoWidth() | |
* @see MediaPlayer#getVideoHeight() | |
*/ | |
public void setVideoSize(int videoWidth, int videoHeight) { | |
mVideoWidth = videoWidth; | |
mVideoHeight = videoHeight; | |
} | |
@Override | |
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { | |
//Log.i("@@@@", "onMeasure(" + MeasureSpec.toString(widthMeasureSpec) + ", " | |
// + MeasureSpec.toString(heightMeasureSpec) + ")"); | |
int width = getDefaultSize(mVideoWidth, widthMeasureSpec); | |
int height = getDefaultSize(mVideoHeight, heightMeasureSpec); | |
if (mVideoWidth > 0 && mVideoHeight > 0) { | |
int widthSpecMode = MeasureSpec.getMode(widthMeasureSpec); | |
int widthSpecSize = MeasureSpec.getSize(widthMeasureSpec); | |
int heightSpecMode = MeasureSpec.getMode(heightMeasureSpec); | |
int heightSpecSize = MeasureSpec.getSize(heightMeasureSpec); | |
if (widthSpecMode == MeasureSpec.EXACTLY && heightSpecMode == MeasureSpec.EXACTLY) { | |
// the size is fixed | |
width = widthSpecSize; | |
height = heightSpecSize; | |
// for compatibility, we adjust size based on aspect ratio | |
if (mVideoWidth * height < width * mVideoHeight) { | |
//Log.i("@@@", "image too wide, correcting"); | |
width = height * mVideoWidth / mVideoHeight; | |
} else if (mVideoWidth * height > width * mVideoHeight) { | |
//Log.i("@@@", "image too tall, correcting"); | |
height = width * mVideoHeight / mVideoWidth; | |
} | |
} else if (widthSpecMode == MeasureSpec.EXACTLY) { | |
// only the width is fixed, adjust the height to match aspect ratio if possible | |
width = widthSpecSize; | |
height = width * mVideoHeight / mVideoWidth; | |
if (heightSpecMode == MeasureSpec.AT_MOST && height > heightSpecSize) { | |
// couldn't match aspect ratio within the constraints | |
height = heightSpecSize; | |
} | |
} else if (heightSpecMode == MeasureSpec.EXACTLY) { | |
// only the height is fixed, adjust the width to match aspect ratio if possible | |
height = heightSpecSize; | |
width = height * mVideoWidth / mVideoHeight; | |
if (widthSpecMode == MeasureSpec.AT_MOST && width > widthSpecSize) { | |
// couldn't match aspect ratio within the constraints | |
width = widthSpecSize; | |
} | |
} else { | |
// neither the width nor the height are fixed, try to use actual video size | |
width = mVideoWidth; | |
height = mVideoHeight; | |
if (heightSpecMode == MeasureSpec.AT_MOST && height > heightSpecSize) { | |
// too tall, decrease both width and height | |
height = heightSpecSize; | |
width = height * mVideoWidth / mVideoHeight; | |
} | |
if (widthSpecMode == MeasureSpec.AT_MOST && width > widthSpecSize) { | |
// too wide, decrease both width and height | |
width = widthSpecSize; | |
height = width * mVideoHeight / mVideoWidth; | |
} | |
} | |
} else { | |
// no size yet, just adopt the given spec sizes | |
} | |
setMeasuredDimension(width, height); | |
} | |
@Override | |
public void onVideoSizeChanged(MediaPlayer mp, int width, int height) { | |
mVideoWidth = mp.getVideoWidth(); | |
mVideoHeight = mp.getVideoHeight(); | |
if (mVideoWidth != 0 && mVideoHeight != 0) { | |
getHolder().setFixedSize(mVideoWidth, mVideoHeight); | |
requestLayout(); | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment