美文网首页
安卓全面屏与虚拟按键适配

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

作者: 小玉1991 | 来源:发表于2019-07-17 15:13 被阅读0次

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

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

    1、最终解决方案

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

     <meta-data
                android:name="android.max_aspect"
                android:value="2.1" />
    

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

    <style name="ActivityTheme" parent="Theme.AppCompat.Light.NoActionBar"></style>
    

    此时就可以实现虚拟按键的适配了。
    如果你还要有沉浸式等需求,可以在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


    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;
        }
    }
    

    相关文章

      网友评论

          本文标题:安卓全面屏与虚拟按键适配

          本文链接:https://www.haomeiwen.com/subject/yiwqlctx.html