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

导读:本篇文章讲解 34.android的屏幕适配和虚拟按键适配,刘海屏适配,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

//——————————————————————屏幕适配—————————————————————————–

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

首先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接口实例。

 

//—————————————————————-完—————————————————————————–

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/118360.html

(0)
seven_的头像seven_bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!