Files
AndroidRtmpApp/libWSLive/src/main/java/me/lake/librestreaming/ws/AspectTextureView.java
2022-03-11 08:43:32 +08:00

92 lines
3.2 KiB
Java

package me.lake.librestreaming.ws;
import android.content.Context;
import android.util.AttributeSet;
import android.view.TextureView;
import android.view.View;
public class AspectTextureView extends TextureView {
public static final int MODE_FITXY = 0;
public static final int MODE_INSIDE = 1;
public static final int MODE_OUTSIDE = 2;
private double targetAspect = -1;
private int aspectMode = MODE_OUTSIDE;
public AspectTextureView(Context context) {
super(context);
}
public AspectTextureView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public AspectTextureView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
/**
* @param mode {@link #MODE_FITXY},{@link #MODE_INSIDE},{@link #MODE_OUTSIDE}
* @param aspectRatio width/height
*/
public void setAspectRatio(int mode, double aspectRatio) {
if (mode != MODE_INSIDE && mode != MODE_OUTSIDE && mode != MODE_FITXY) {
throw new IllegalArgumentException("illegal mode");
}
if (aspectRatio < 0) {
throw new IllegalArgumentException("illegal aspect ratio");
}
if (targetAspect != aspectRatio || aspectMode != mode) {
targetAspect = aspectRatio;
aspectMode = mode;
requestLayout();
}
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
if (targetAspect > 0) {
int initialWidth = MeasureSpec.getSize(widthMeasureSpec);
int initialHeight = MeasureSpec.getSize(heightMeasureSpec);
double viewAspectRatio = (double) initialWidth / initialHeight;
double aspectDiff = targetAspect / viewAspectRatio - 1;
if (Math.abs(aspectDiff) > 0.01 && aspectMode != MODE_FITXY) {
if (aspectMode == MODE_INSIDE) {
if (aspectDiff > 0) {
initialHeight = (int) (initialWidth / targetAspect);
} else {
initialWidth = (int) (initialHeight * targetAspect);
}
} else if (aspectMode == MODE_OUTSIDE) {
if (aspectDiff > 0) {
initialWidth = (int) (initialHeight * targetAspect);
} else {
initialHeight = (int) (initialWidth / targetAspect);
}
}
widthMeasureSpec = MeasureSpec.makeMeasureSpec(initialWidth, MeasureSpec.EXACTLY);
heightMeasureSpec = MeasureSpec.makeMeasureSpec(initialHeight, MeasureSpec.EXACTLY);
}
}
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
@Override
public void layout(int l, int t, int r, int b) {
View p = (View) getParent();
if (p != null) {
int pw = p.getMeasuredWidth();
int ph = p.getMeasuredHeight();
int w = getMeasuredWidth();
int h = getMeasuredHeight();
t = (ph - h) / 2;
l = (pw - w) / 2;
r += l;
b += t;
}
super.layout(l, t, r, b);
}
}