Способ закрепления программных кнопок в новых телефонах
У меня есть приложение, которое я разрабатываю на Android с использованием Java и Android Studio, связанных с текстурами и камерами.
Проблема в том, что в новейших телефонах, таких как Samsung S8, S8+, Note8 и т. Д., Они имеют полностью заполненные экраны с возможностью софт-кнопок либо зависать, либо прикрепляться внизу.
Я использую текстуру с автоподгонкой с помощью следующего кода
import android.app.Activity;
import android.content.Context;
import android.graphics.Matrix;
import android.util.AttributeSet;
import android.view.TextureView;
public class AutoFitTextureView extends TextureView {
private int mRatioWidth = 0;
private int mRatioHeight = 0;
private Matrix mMatrix;
//private float mScaleFactor = 1.f;
public AutoFitTextureView(Context context) {
this(context, null);
init(context);
}
public AutoFitTextureView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
init(context);
}
public AutoFitTextureView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init(context);
}
private void init(Context context) {
mMatrix = new Matrix();
}
public boolean centerParentHor(int width){
//float scaledImageCenterX = (getWidth() * mScaleFactor) / 2;
//float scaledImageCenterY = (getHeight() * mScaleFactor) / 2;
mMatrix.reset();
//mMatrix.postScale(mScaleFactor, mScaleFactor);
float centerCam = (width -
((Activity)getContext()).getWindow().getDecorView().getWidth())/2;
// mMatrix.setTranslate(-centerCam, 0);
// setTransform(mMatrix);
setTranslationY(centerCam);
setAlpha(1);
return true;
}
public boolean centerParentVer(int height){
//float scaledImageCenterX = (getWidth() * mScaleFactor) / 2;
//float scaledImageCenterY = (getHeight() * mScaleFactor) / 2;
mMatrix.reset();
//mMatrix.postScale(mScaleFactor, mScaleFactor);
float centerCam = (height -
((Activity)getContext()).getWindow().getDecorView().getHeight())/2;
// mMatrix.setTranslate(0,-centerCam);
// setTransform(mMatrix);
setTranslationX(centerCam);
setAlpha(1);
return true;
}
public void setAspectRatio(int width, int height) {
if (width < 0 || height < 0) {
throw new IllegalArgumentException("Size cannot be negative.");
}
mRatioWidth = width;
mRatioHeight = height;
requestLayout();
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
int width = MeasureSpec.getSize(widthMeasureSpec);
int height = MeasureSpec.getSize(heightMeasureSpec);
int left = (widthMeasureSpec - width)/2;
if (0 == mRatioWidth || 0 == mRatioHeight) {
setMeasuredDimension(width, height);
} else {
if (width < height * mRatioWidth / mRatioHeight) {
setMeasuredDimension(height * mRatioWidth / mRatioHeight, height);
centerParentHor(width);
} else {
setMeasuredDimension(width, width * mRatioHeight / mRatioWidth);
centerParentVer(height);
}
}
}
}
Я хочу знать вызов функции или метод, запускаемый при закреплении панели программных кнопок, и можно ли ее переопределить?
Я попытался масштабировать вид текстуры с новым соотношением сторон с помощью слушателя вида текстуры, но он не работает, так как мой вид текстуры находится во фрагменте, а основной элемент управления выполняется в обработчике.
Масштабный код
int viewWidth = mStoryHolderVideo.getWidth();
int viewHeight = mStoryHolderVideo.getHeight();
double aspectRatio = (double) height / width;
int newWidth, newHeight;
if (viewHeight > (int) (viewWidth * aspectRatio)) {
// limited by narrow width; restrict height
newWidth = viewWidth;
newHeight = (int) (viewWidth * aspectRatio);
} else {
// limited by short height; restrict width
newWidth = (int) (viewHeight / aspectRatio);
newHeight = viewHeight;
}
int xoff = (viewWidth - newWidth) / 2;
int yoff = (viewHeight - newHeight) / 2;
Matrix txform = new Matrix();
mStoryHolderVideo.getTransform(txform);
txform.setScale((float) newWidth / viewWidth, (float) newHeight / viewHeight);
//txform.postRotate(10); // just for fun
txform.postTranslate(xoff, yoff);
mStoryHolderVideo.setTransform(txform);
Я знаю, что мое решение состоит в том, чтобы получить доступ или переопределить функцию или событие, инициируемое при закреплении панели программных кнопок, поскольку масштабирование работает очень хорошо в том случае, когда у меня инициализирована камера и используется вид текстуры.