package com.limelight.ui; import android.annotation.TargetApi; import android.content.Context; import android.util.AttributeSet; import android.view.SurfaceView; public class StreamView extends SurfaceView { private double desiredAspectRatio; public void setDesiredAspectRatio(double aspectRatio) { this.desiredAspectRatio = aspectRatio; } public StreamView(Context context) { super(context); } public StreamView(Context context, AttributeSet attrs) { super(context, attrs); } public StreamView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } @TargetApi(21) public StreamView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { super(context, attrs, defStyleAttr, defStyleRes); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { // If no fixed aspect ratio has been provided, simply use the default onMeasure() behavior if (desiredAspectRatio == 0) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); return; } // Based on code from: https://www.buzzingandroid.com/2012/11/easy-measuring-of-custom-views-with-specific-aspect-ratio/ int widthSize = MeasureSpec.getSize(widthMeasureSpec); int heightSize = MeasureSpec.getSize(heightMeasureSpec); int measuredHeight, measuredWidth; if (widthSize > heightSize * desiredAspectRatio) { measuredHeight = heightSize; measuredWidth = (int)(measuredHeight * desiredAspectRatio); } else { measuredWidth = widthSize; measuredHeight = (int)(measuredWidth / desiredAspectRatio); } setMeasuredDimension(measuredWidth, measuredHeight); } }