美文网首页Android杂识Android实用技术Android知识
Android简单易懂的屏幕适配AutoUtils(低侵入)

Android简单易懂的屏幕适配AutoUtils(低侵入)

作者: Jlanglang | 来源:发表于2017-07-24 23:07 被阅读435次

    转载请标明出处:http://www.jianshu.com/p/ea53896979f2
    本文出自:Jlanglang

    前言

    个人用hongyang的Autolayout用了有挺长一段时间了,git上这个项目也停止更新了,只能自己想办法了.

    个人觉得autolayout有这几个缺点:

    1.必须使用px;
    2.会产生大量的AutoLayoutParams类;
    3.很多控件需要继承扩展,才能有效果.
    4.适配的宽高参考值需要通过xml配置
    5.必须使用AutoActivity,Auto布局容器

    Autolayout传送门
    基于该例子修改:
    AutoLayout——Android屏幕自动适配

    屏幕]适配的几种方式

    1.百分比布局(这个挺好的,就是有小bug,不知道官方修复没)
    2.dimens适配,比较保险,常见的适配方式(但是会造成apk增大,依然不能适配所有)
    3.动态计算,也就是autolayout这种.
    -------------------------------------分割线----------------------------------------------

    进入正题:

    Paste_Image.png

    你没看错,相对与Autolayout而言,AutoUtils现在两个类.
    原理其实挺简单的,计算比率,然后计算px.修改layoutparams的值

    -------------------------------------分割线----------------------------------------------

    AutoOptions:

    这个类,类型于Imageloader的DisplayImageOptions,
    作用是配置,

       AutoOptions builder = new AutoOptions.Builder()
                    .init(this)//需要一个context
                    .setAutoType(AutoOptions.AutoType.DP_2)//设置Type,布局写的px还是dp.根据该type进行计算
                    .setHasStatusBar(true)//是否将StatusBar计算进去
                    .setDesign(720, 1280)//根据什么样的分辨率写的布局.(就是ui切的图是什么尺寸的)
                    .build();
     //设置AutoOptions
     AutoUtils.setAutoOptions(builder);
    

    AutoUtils

      //对,就是这么简单.将Acitivity传进去
      AutoUtils.auto(this);
    

    其他的一些方法

    //直接传Acitivity,会计算padding和margin值
     public static void auto(Activity act) ;
    //会计算padding和margin值
     public static void auto(View view);
    //不会计算padding和margin值
     public static void autoSize(View view);
    //文字大小
    public static void autoTextSize(View view);
    //传入Width,得到Auto后的width值
     public static int getDisplayWidthValue(int designWidthValue)
    //传入Height,得到Auto后的Height值
    public static int getDisplayHeightValue(int designHeightValue)
    
    

    具体使用(建议):

    public class BaseApplication extends Application {
         @Override
        public void onCreate() {
            super.onCreate();
             AutoOptions builder = new AutoOptions.Builder()
                    .init(this)
                    .setAutoType(AutoOptions.AutoType.DP_2)
                    .setHasStatusBar(true)
                    .setDesign(720, 1280)
                    .build();
               //设置AutoOptions
             AutoUtils.setAutoOptions(builder);
        }
    }
    
    public abstract class BaseActivity extends AppCompatActivity{
         @Override
        protected void onCreate(Bundle savedInstanceState) {
               AutoUtils.auto(this);
        }
    }
    

    如果不想使用默认的AutoOptions.

    每个方法都支持传入AutoOptions进行计算,也可以直接setAutoOptions(),进行全局修改.

    -------------------------------------------分割线---------------------------------------------

    目前的缺点:

    1.无法判别view是否已经auto计算,可能重复auto,需要注意
    2.对于某些控件(如tablayout中的tab)无效.需要另写工具类进行适配

    详细代码:

    附上Github地址


    您的喜欢与建议是我最大的动力-_-

    相关文章

      网友评论

      • AwaitZhang:问一下这个tab怎么适配啊?
        Jlanglang:@AwaitZhang tablayout不是可以拿到Tab,然后setCustomView()么
        AwaitZhang:@Jlanglang 您的意思是继承tablayout?还是写一个类似于这种的控件?
        Jlanglang: @AwaitZhang tablayout吧,自定义view,然后手动auto
      • AwaitZhang:问一下,这个枚举里面的 PX(-1), DP(1), DP_2(2), DP_3(3);是什么意思啊?方便说一下吗?谢谢你了:smile:
        AwaitZhang:@Jlanglang 哦,这样啊,谢谢哈
        Jlanglang: @AwaitZhang 比如px(1)的意思就是xml写的是px,用px乘算。dp(1)的意思,xml写的是dp,与px比率是1:1

      本文标题:Android简单易懂的屏幕适配AutoUtils(低侵入)

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