34.android的屏幕适配和虚拟按键适配,刘海屏适配

//------------------------------------------------------------------屏幕适配-----------------------------------------------------------------------------

//-------------------------------------------------------------------------------------第一步:

首先studio依赖compile 'com.zhy:autolayout:1.4.3'


配置:

默认使用的高度是设备的可用高度,也就是不包括状态栏和底部的操作栏的,如果你希望拿设备的物理高度进行百分比化:

可以在Application的onCreate方法中进行设置:

public class UseDeviceSizeApplication extends Application
{
    @Override
    public void onCreate()
    {
        super.onCreate();
        AutoLayoutConifg.getInstance().useDeviceSize();
    }
}


//-------------------------------------------------------------------------------------第二步:

在AndroidManifest.xml文件下添加设计尺寸

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.shipei.ui" >

    <application
        android:name="com.shipei.application.UseDeviceSizeApplication"
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme" >


        //设计稿尺寸
        <meta-data android:name="design_width" android:value="720">
        </meta-data>
        <meta-data android:name="design_height" android:value="1920">
        </meta-data>


        <activity android:name=".MainActivity" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />


                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>


</manifest>

//---------------------------------------------------------------------------------------------第三步:

让你的Activity继承自AutoLayoutActivity.

非常简单的两个步骤,你就可以开始愉快的编写布局了,详细可以参考sample。

其他用法

如果你不希望继承AutoLayoutActivity,可以在编写布局文件时,将

LinearLayout -> AutoLinearLayout
RelativeLayout -> AutoRelativeLayout
FrameLayout -> AutoFrameLayout
这样也可以完成适配

//---------------------------------------------------------------------------------------------------第四步:

将布局单位dp/dip改为px。

//-------------------------------------------------------虚拟按键适配---------------------------------------------------------------------

//------------------------------------------------第一步  一个工具类-------------------------------------------------------

public class AndroidBug54971Workaround {
    public static void assistActivity(View content) {
        new AndroidBug54971Workaround(content);
    }

    private View mChildOfContent;
    private int usableHeightPrevious;
    private ViewGroup.LayoutParams frameLayoutParams;

    private AndroidBug54971Workaround(View content) {
        mChildOfContent = content;
        mChildOfContent.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
            public void onGlobalLayout() {
                possiblyResizeChildOfContent();
            }
        });
        frameLayoutParams = mChildOfContent.getLayoutParams();
    }

    private void possiblyResizeChildOfContent() {
        int usableHeightNow = computeUsableHeight();
        if (usableHeightNow != usableHeightPrevious) {

            frameLayoutParams.height = usableHeightNow;
            mChildOfContent.requestLayout();
            usableHeightPrevious = usableHeightNow;
        }
    }

    private int computeUsableHeight() {
        Rect r = new Rect();
        mChildOfContent.getWindowVisibleDisplayFrame(r);
        return (r.bottom);
    }

    public static boolean checkDeviceHasNavigationBar(Context context) {
        boolean hasNavigationBar = false;
        Resources rs = context.getResources();
        int id = rs.getIdentifier("config_showNavigationBar", "bool", "android");
        if (id > 0) {
            hasNavigationBar = rs.getBoolean(id);
        }
        try {
            Class systemPropertiesClass = Class.forName("android.os.SystemProperties");
            Method m = systemPropertiesClass.getMethod("get", String.class);
            String navBarOverride = (String) m.invoke(systemPropertiesClass, "qemu.hw.mainkeys");
            if ("1".equals(navBarOverride)) {
                hasNavigationBar = false;
            } else if ("0".equals(navBarOverride)) {
                hasNavigationBar = true;
            }
        } catch (Exception e) {

        }
        return hasNavigationBar;

    }
}

//------------------------------------第二步 调用,调用时候注意,要调用xml里的父布局id才行。就是最外层的布局id。-----------------

AndroidBug54971Workaround.assistActivity(findViewById(R.id.mbuttonTabar));

//--------------------------------------------------------------刘海屏适配----------------------------------------------------------------------------

//-------------------------------------------第一步 导依赖------------------------------------

implementation 'com.yanzhenjie:sofia:1.0.5'

//------------------------------------------------第二步 调用------------------------------------------------------------------------

//-------------------------一般需要调用这三个属性就可以刘海屏适配了。-----------------------------------------------

//刘海屏幕适配
Sofia.with(this).
statusBarBackgroundAlpha(0)
        .invasionStatusBar()
        .invasionNavigationBar();

//-----------------------------------介绍一下刘海屏适配的属性----------------------------------------------------------------

Android沉浸式效果的实现,状态栏和导航栏均支持设置颜色、渐变色、图片、透明度、内容入侵和状态栏深色字体;
兼容竖屏、横屏,当屏幕旋转时会自动适配。


Sofia.with(Activity);


调用with方法后返回一个Bar接口,可以链式连续调用所有方法,方法列表如下:

// 状态栏深色字体。
Bar statusBarDarkFont();

// 状态栏浅色字体。
Bar statusBarLightFont();

// 状态栏背景色。
Bar statusBarBackground(int statusBarColor);

// 状态栏背景Drawable。
Bar statusBarBackground(Drawable drawable);

// 状态栏背景透明度。
Bar statusBarBackgroundAlpha(int alpha);

// 导航栏背景色。
Bar navigationBarBackground(int navigationBarColor);

// 导航栏背景Drawable。
Bar navigationBarBackground(Drawable drawable);

// 导航栏背景透明度。
Bar navigationBarBackgroundAlpha(int alpha);

// 内容入侵状态栏。
Bar invasionStatusBar();

// 内容入侵导航栏。
Bar invasionNavigationBar();

// 让某一个View考虑状态栏的高度,显示在适当的位置,接受ViewId。
Bar fitsStatusBarView(int viewId);

// 让某一个View考虑状态栏的高度,显示在适当的位置,接受View。
Bar fitsStatusBarView(View view);

// 让某一个View考虑导航栏的高度,显示在适当的位置,接受ViewId。
Bar fitsNavigationBarView(View view);

// 让某一个View考虑导航栏的高度,显示在适当的位置,接受View。
Bar fitsNavigationBarView(View view);

fitsStatusBarView()一般用在产品详情页,假设需求如图三所示。在内容入侵状态栏后,我们的布局整体上移到状态栏,那么Toolbar的一部分也会显示在状态栏下方(层级),这个时候就需要Toolbar考虑系统状态栏的高度显示在适当的位置了;fitsNavigationBarView()同理,只是显示在屏幕的最底部(竖屏)或者最右侧(横屏)。

注意:Sofia.with(Activity)调用后会返回一个Bar接口实例,开发者可以连续调用某几个方法。在页面滑动时如果需要再次改变SystemBar的颜色,那么开发者可以保存这个Bar实例为Activity的成员变量,也可以不保存,在重复改变时再次调用Sofia.with(Activity),此时还是会返回上次返回给开发者的Bar接口实例。

//----------------------------------------------------------------完-----------------------------------------------------------------------------

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值