Android自动布局,一次编写全部设备适用

在做android项目中,遇到最多的问题就是适配,各种尺寸的机型,让开发者头痛,自己在开发中也存在这个问题,不过我目前的公司大多项目是demo的性质,但是最近一个产品化的项目,让我在适配问题上遇到了不少困难。

于是想要使用别人的研究成果,就找到了鸿祥大神写的https://github.com/hongyangAndroid/AndroidAutoLayout 库,他的设计思路是根据UI设计的效果图尺寸,然后在不同手机上根据比例进行缩放,感觉满足绝大多数适配需求,可惜大神太忙,这个库已经停止维护了。

针对鸿祥的设计思路,自己也写了一个自动布局的库https://github.com/tenny1225/AndroidAutoLayout,目地也是使用方式简单,尽量少改现有的代码。以下有部分照搬鸿祥博客里面的内容

假设我们拿到一张设计图:


Paste_Image.png

这样的设计图开发中很常见吧,有些公司可能需要自己去测量。

按照我们的思想:

布局直接抄设计图上的尺寸

对于布局文库应该这么写:

<com.xz.autoLayout.AutoRelativeLayout
android:layout_width="match_parent"
android:layout_height="86px"
android:layout_marginTop="26px"
android:background="#ffffffff">

<ImageView
    android:id="@+id/id_tv_add"
    android:layout_width="34px"
    android:layout_height="34px"
    android:layout_gravity="center_vertical"
    android:layout_marginLeft="276px"
    android:layout_marginTop="26px"
    android:src="@mipmap/add"
    />

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_centerVertical="true"
    android:layout_marginLeft="26px"
    android:layout_toRightOf="@id/id_tv_add"
    android:text="新增旅客"
    android:textColor="#1fb6c4"
    android:textSize="32px"
    />
</com.xz.autoLayout.AutoRelativeLayout>

可以看到只有第一个RelativeLayout修改成了自定义的AutoRelativeLayout,就可以做到根据设计图,自动适配。

用法

  1. 设定设计图尺寸

在Application的oncreate方法中加入:

  AutoLayoutManager.init(this,720,1280,false);//720×1280是ui设计图的尺寸
//第四隔参数是设计图是否有状态栏

2.修改布局文件
将所有布局文件中的第一个viewgroup修改成相应的Auto...Layout,目前实现的有
AutoLinearLayout,AutoRelativeyout,AutoFrameLayout,对于在其他的viewgroup,可以实现IAuto接口重写相应方法进行适配,具体参考AutoLinearLayout:

<?xml version="1.0" encoding="utf-8"?>
<com.xz.autoLayout.AutoLinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="140px"
    android:layout_height="140px"
    android:gravity="center"
    android:orientation="vertical">
    <ImageView
        android:id="@+id/iv_icon"
        android:layout_width="80px"
        android:layout_height="80px"
        android:src="@mipmap/ic_launcher"
       android:tag="w-h" />

    <TextView
        android:id="@+id/tv_action_name"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="8px"
        android:gravity="center"
        android:text="@string/next"
        android:textColor="?attr/actionBarTextColor"
        android:textSize="22px"

        />

</com.xz.autoLayout.AutoLinearLayout>

4.直接适配
可以调用auto方法进行适配,例如在baseActivity或者baseFragment中使用

AutoUtil.auto(View v)
  1. 对与长宽一致性问题
    由于长宽缩放的存在,所有在布局文件中,长宽同时设置为200px,其实最后显示他们长宽是不同的,此时可以设置tag "w-h"和"h-w"属性
<TextView
        android:layout_width="85px"
        android:layout_height="70px"
        android:layout_alignTop="@+id/iv_edit"
        android:layout_marginLeft="30px"
         android:tag="w-h" 
        android:layout_marginTop="30px"
        android:background="#aaffffff"
        android:gravity="center"
        android:text="@string/compare"
        android:textColor="?attr/actionBarTextColor" />

"w-h"表示宽度的尺寸缩放参考高度,"h-w"表示高度的尺寸缩放参考宽度。

  1. 适配模式
    这个库默认对所有view的所有属性进行了适配,所以就算你设置了某个属性值为12dp,它还是把他当做px对待进行缩放,所以对于不需要进行缩放的view,可以在tag中加入相应标志,让库忽略掉对应属性,下表面列出来可识别的tag标志
    not 表示对于view的所有属性都不适配
    !w不适配宽度
    !h不适配高度
    !p不适配padding
    !pl不适配paddingLeft
    !pt不适配paddingTop
    !pr不适配paddingRight
    !pb不适配paddingBottom
    !m不适配margin
    !ml不适配marginLeft
    !mt不适配marginTop
    !mr不适配marginRight
    !mb不适配marginBottom
    !maw不适配maxWidth
    !mah不适配maxHeight
    !miw不适配minWidth
    !mih不适配minHeight
    !ts不适配TextSize
    w-hwidth参照height缩放
    h-wheight参照width缩放
    ml-hmarginLeft参照height缩放
    mr-hmarginRight参照height缩放
    mt-wmarginTop参照width缩放
    mb-wmarginBottom参照width缩放
    pl-hpaddingLeft参照height缩放
    pr-hpaddingRight参照height缩放
    pt-wpaddingTop参照width缩放
    pb-wpaddingBottom参照width缩放
    maw-hmaxWidth参照height缩放
    mah-wmaxHeight参照width缩放
    miw-hminWidth参照height缩放
    mih-wminHeight参照width缩放
    ts-wTextSize参照width缩放
<TextView
        android:layout_width="85px"
        android:layout_height="70px"
        android:layout_alignTop="@+id/iv_edit"
        android:layout_marginLeft="30px"
         android:tag="w-h,ml-h"   <!--width参照height缩放,marginLeft参照height缩放-->
        android:layout_marginTop="30px"
        android:background="#aaffffff"
        android:gravity="center"
        android:text="@string/compare"
        android:textColor="?attr/actionBarTextColor" />
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 200,392评论 5 470
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,258评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 147,417评论 0 332
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,992评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,930评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,199评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,652评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,327评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,463评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,382评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,432评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,118评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,704评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,787评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,999评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,476评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,057评论 2 341

推荐阅读更多精彩内容