Способ закрепления программных кнопок в новых телефонах

У меня есть приложение, которое я разрабатываю на 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);

Я знаю, что мое решение состоит в том, чтобы получить доступ или переопределить функцию или событие, инициируемое при закреплении панели программных кнопок, поскольку масштабирование работает очень хорошо в том случае, когда у меня инициализирована камера и используется вид текстуры.

0 ответов

Другие вопросы по тегам