安卓全面屏与虚拟按键适配

公司的项目,需要适配新手机的虚拟按键

走了一些弯路,也积累了一些经验教训,分享给大家。

1、最终解决方案

1、在AndroidManifest.xml 文件中,加入如下代码,这段代码为谷歌官方的解决全面屏的方案,详细的可以百度。或者 参考 Android APP适配全面屏手机的技术要点

 

2、使你的Activity使用如下的Theme


此时就可以实现虚拟按键的适配了。
如果你还要有沉浸式等需求,可以在baseActivity中

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
            //透明状态栏
            getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
//            //透明导航栏
//            getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);

        }

如下图 序号1


安卓全面屏与虚拟按键适配_第1张图片
image.png

2、较好的解决方案,此方案有瑕疵,但肯定是万能的。

就是用一个工具类,对屏幕对大小进行计算。使用方法如上图中对序号2.
工具类如下:


/**
 * Created by zhangyushui on 2019/3/18.
 */

public class AndroidBottomSoftBar {


    private View mViewObserved;//被监听的视图
    private int usableHeightPrevious;//视图变化前的可用高度
    private ViewGroup.LayoutParams frameLayoutParams;

    private AndroidBottomSoftBar(View viewObserving, final Activity activity) {
        mViewObserved = viewObserving;
        //给View添加全局的布局监听器
        mViewObserved.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
            public void onGlobalLayout() {
                resetLayoutByUsableHeight(activity);
            }
        });
        frameLayoutParams = mViewObserved.getLayoutParams();
    }


    /**
     * 关联要监听的视图
     */
    public static void assistActivity(View viewObserving, Activity activity) {
        new AndroidBottomSoftBar(viewObserving, activity);
    }

    private void resetLayoutByUsableHeight(Activity activity) {

        WindowManager wm = (WindowManager) activity.getSystemService(Context.WINDOW_SERVICE);
        int width = wm.getDefaultDisplay().getWidth();
        int height = wm.getDefaultDisplay().getHeight();

        // 计算视图可视高度

        int usableHeightNow = height;


        //比较布局变化前后的View的可用高度
        if (usableHeightNow != usableHeightPrevious) {
            //如果两次高度不一致
            //将当前的View的可用高度设置成View的实际高度
//            frameLayoutParams.height = usableHeightNow;
            mViewObserved.setPadding(0, 0, 0, getHasVirtualKey(activity));
            mViewObserved.requestLayout();//请求重新布局
            usableHeightPrevious = usableHeightNow;
        }
    }


    /**
     * dpi 通过反射,获取包含虚拟键的整体屏幕高度
     * height 获取屏幕尺寸,但是不包括虚拟功能高度
     *
     * @return
     */
    public static int getHasVirtualKey(Activity activity) {
        int dpi = 0;
        Display display = activity.getWindowManager().getDefaultDisplay();
        DisplayMetrics dm = new DisplayMetrics();
        @SuppressWarnings("rawtypes")
        Class c;
        try {
            c = Class.forName("android.view.Display");
            @SuppressWarnings("unchecked")
            Method method = c.getMethod("getRealMetrics", DisplayMetrics.class);
            method.invoke(display, dm);
            dpi = dm.heightPixels;
        } catch (Exception e) {
            e.printStackTrace();
        }

        int height = activity.getWindowManager().getDefaultDisplay().getHeight();
        int h=dpi - height;
        if (h>dpi*0.08){
            h= (int) (dpi*0.06);
        }

        return h;
    }
}

你可能感兴趣的:(安卓全面屏与虚拟按键适配)