引入

  • Android Studio

将autolayout引入

dependencies {compile project(':autolayout')
}

也可以直接

dependencies {compile 'com.zhy:autolayout:1.4.3'
}
  • Eclipse

建议使用As,方便版本更新。实在不行,只有复制粘贴源码了。

用法

第一步:

在你的项目的AndroidManifest中注明你的设计稿的尺寸。

<meta-data android:name="design_width" android:value="768">
</meta-data>
<meta-data android:name="design_height" android:value="1280">
</meta-data>

第二步:

让你的Activity继承自AutoLayoutActivity.

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

其他用法

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

  • LinearLayout -> AutoLinearLayout
  • RelativeLayout -> AutoRelativeLayout
  • FrameLayout -> AutoFrameLayout

这样也可以完成适配。

目前支持属性

  • layout_width
  • layout_height
  • layout_margin(left,top,right,bottom)
  • pading(left,top,right,bottom)
  • textSize
  • maxWidth, minWidth, maxHeight, minHeight

配置

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

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

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

预览

大家都知道,写布局文件的时候,不能实时的去预览效果,那么体验真的是非常的不好,也在很大程度上降低开发效率,所以下面教大家如何用好,用对PreView(针对该库)。

首先,你要记得你设计稿的尺寸,比如 768 * 1280

然后在你的PreView面板,选择于设计图分辨率一致的设备:

然后你就可以看到最为精确的预览了:

两个注意事项:

  1. 你们UI给的设计图的尺寸并非是主流的设计图,该尺寸没找到,你可以自己去新建一个设备。
  2. 不要在PreView中去查看所有分辨率下的显示,是看不出来适配效果的,因为有些计算是动态的。

扩展

对于其他继承系统的FrameLayout、LinearLayout、RelativeLayout的控件,比如CardView,如果希望再其内部直接支持"px"百分比化,可以自己扩展,扩展方式为下面的代码,也可参考issue#21:

package com.zhy.sample.view;import android.content.Context;
import android.support.v7.widget.CardView;
import android.util.AttributeSet;import com.zhy.autolayout.AutoFrameLayout;
import com.zhy.autolayout.utils.AutoLayoutHelper;/*** Created by zhy on 15/12/8.*/
public class AutoCardView extends CardView
{private final AutoLayoutHelper mHelper = new AutoLayoutHelper(this);public AutoCardView(Context context){super(context);}public AutoCardView(Context context, AttributeSet attrs){super(context, attrs);}public AutoCardView(Context context, AttributeSet attrs, int defStyleAttr){super(context, attrs, defStyleAttr);}@Overridepublic AutoFrameLayout.LayoutParams generateLayoutParams(AttributeSet attrs){return new AutoFrameLayout.LayoutParams(getContext(), attrs);}@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec){if (!isInEditMode()){mHelper.adjustChildren();}super.onMeasure(widthMeasureSpec, heightMeasureSpec);}}

注意事项

ListView、RecyclerView类的Item的适配

sample中包含ListView、RecyclerView例子,具体查看sample

  • 对于ListView

对于ListView这类控件的item,默认根局部写“px”进行适配是无效的,因为外层非AutoXXXLayout,而是ListView。但是,不用怕,一行代码就可以支持了:

@Override
public View getView(int position, View convertView, ViewGroup parent)
{ViewHolder holder = null;if (convertView == null){holder = new ViewHolder();convertView = LayoutInflater.from(mContext).inflate(R.layout.list_item, parent, false);convertView.setTag(holder);//对于listview,注意添加这一行,即可在item上使用高度AutoUtils.autoSize(convertView);} else{holder = (ViewHolder) convertView.getTag();}return convertView;
}

注意AutoUtils.autoSize(convertView);这行代码的位置即可。demo中也有相关实例。

  • 对于RecyclerView
public ViewHolder(View itemView)
{super(itemView);AutoUtils.autoSize(itemView);
}//...
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType)
{View convertView = LayoutInflater.from(mContext).inflate(R.layout.recyclerview_item, parent, false);return new ViewHolder(convertView);
}

一定要记得LayoutInflater.from(mContext).inflate使用三个参数的方法!

指定设置的值参考宽度或者高度

由于该库的特点,布局文件中宽高上的1px是不相等的,于是如果需要宽高保持一致的情况,布局中使用属性:

app:layout_auto_basewidth="height",代表height上编写的像素值参考宽度。

app:layout_auto_baseheight="width",代表width上编写的像素值参考高度。

如果需要指定多个值参考宽度即:

app:layout_auto_basewidth="height|padding"

用|隔开,类似gravity的用法,取值为:

  • width,height
  • margin,marginLeft,marginTop,marginRight,marginBottom
  • padding,paddingLeft,paddingTop,paddingRight,paddingBottom
  • textSize.

TextView的高度问题

设计稿一般只会标识一个字体的大小,比如你设置textSize="20px",实际上TextView所占据的高度肯定大于20px,字的上下都会有一定的间隙,所以一定要灵活去写字体的高度,比如对于text上下的margin可以选择尽可能小一点。或者选择别的约束条件去定位(比如上例,选择了marginBottom)

常见问题

(1)导入后出现org/gradle/api/publication/maven/internal/DefaultMavenFactory

最简单的方式,通过compile 'com.zhy:autolayout:x.x.x'进行依赖使用,如果一定要以module引用,参考该issue#74

(2)RadioGroup,Toolbar等控件中的子View无法完成适配

这个其实上文已经提到过了,需要自己扩展。不过这个很多使用者贡献了他们的扩展类可以直接使用, 参考autolayout-widget, 如果没有发现你需要的容器类,那么你就真的需要自行扩展了,当然如果你完成了扩展,可以给我发个PR,或者让我知道,我可以加入到 autolayout-widget中方便他人,ps:需要用到哪个copy就好了,不要直接引用autolayout-widget,因为其引用了大量的库,可能很多 库你是用不到的。

(3)java.lang.IllegalStateException: You need to use a Theme.AppCompat theme (or descendant) with this activity.

这个问题是因为默认AutoLayoutActivity会继承自AppCompatActivity,所以默认需要设置 Theme.AppCompat的theme;

如果你使用的依旧是FragmentActivity等,且不考虑使用AppCompatActivity, 你可以选择自己编写一个MyAutoLayoutActivity extends 目前你使用的Activity基类,例如 MyAutoLayoutActivity extends FragmentActivity,然后将该库中AutoLayoutActivity中的逻辑 拷贝进去即可,以后你就继承你的MyAutoLayoutActivity就好了。

ps:还是建议尽快更新SDK版本使用AppCompatActivity.

其他信息

AutoLayout的使用相关推荐

  1. autolayout autoresizing

    WWDC 2012 Session笔记--202, 228, 232 AutoLayout(自动布局)入门 这是博主的WWDC2012笔记系列中的一篇,完整的笔记列表可以参看这里.如果您是首次来到本站 ...

  2. iOS9 This application is modifying the autolayout engine from a background thread, which

    以前在Xcode7之间项目没有问题,但是使用Xcode7后 突然不好使了,This application is modifying the autolayout engine from a back ...

  3. iOS autolayout

    http://blog.csdn.net/dizzthxl/article/details/9009537              (基本用法) http://blog.csdn.net/ysy44 ...

  4. iOS自动布局(AutoLayout)之 NSLayoutAnchor

    自动布局(AutoLayout)之 NSLayoutAnchor 方式使用 AutoLayout 自动布局(AutoLayout)是iOS6引入的关系布局,实现动态位置和多视图关系的布局方式,是对fr ...

  5. (0068)iOS开发之AutoLayout框架Masonry使用心得

    苹果官方给出了一些有关自动布局的建议 不论用interfaceBuilder还是用代码来实现自动布局,这些建议都是适用的. (1)不用view的frame.bounds.center来指定view的形 ...

  6. iOS开发之autoLayout constraint

    前言 ios设备的尺寸越来越多,针对一款app可能要适配到多种设备.多种尺寸.所以.我们期望我们的app可以autoLayout.本文主要介绍在Xcode中使用constraint.未来会不定期对此文 ...

  7. 自动布局(autoLayout)演练2

    2019独角兽企业重金招聘Python工程师标准>>> 那这一篇的练手的任务是: 如上图:红色记号代表间距都是20,两图片的高度都为40,最重要的一点:两图片的右边距(Trailin ...

  8. AutoLayout全解

    AutoLayout简介 Autolayout是一种全新的布局技术,专门用来布局UI界面的,用来取代Frame布局在遇见屏幕尺寸多重多样的问题.Autolayout自iOS 6开始引入,但是由于Xco ...

  9. iOS开发~sizeClass和autolayout

    sizeClass和autolayout,看来不得不开始放弃frame的写法,收集点资料集中学习下 Adaptivity User Interfaces苹果官方文档:https://developer ...

  10. iOS8开发~UI布局(三)深入理解autolayout

    一.概要 通过对iOS8界面布局的学习和总结,发现autolayout才是主角,autolayout是iOS6引入的新特性,当时还粗浅的学习了下,可是没有真正应用到项目中.随着iOS设备尺寸逐渐碎片化 ...

最新文章

  1. linux系统 大分区,linux大硬盘怎么分区
  2. 深入浅出 CPropertySheet
  3. Android 系统中 Location Service 的实现与架构
  4. python扫描内网banner信息
  5. Linux用于账号文件,linux的文件及账号管理
  6. 笔记本选购:i5轻薄本和i7轻薄本该如何选择?
  7. Qt工作笔记-使用Qt中QProcess与iostream中system调用外部进程
  8. linux脚本中空格怎么显示,linux vim 显示空格
  9. php 常用函数 180,php 部分常用函数
  10. 第三十讲:Android之Animation(五)
  11. JAVA线程池ScheduledExecutorService周期性地执行任务 与单个Thread周期性执行任务的异常处理
  12. 002-Go通过ioutil 读写文件
  13. 自己动手写cpu pdf_教你自己动手组装电脑(第一篇:CPU)
  14. linux有线程的概念,Linux线程相关概念
  15. Mac版PhotoShop 2020 最新版下载
  16. “双 亲 委 派 机 制”
  17. go 字符串分割数组
  18. FC6安装配置详细介绍
  19. 【C++入门】命名空间的定义与使用
  20. 四川电信天邑TY1208-Z_强制刷机固件

热门文章

  1. matlab 矩阵的n次,用matlab的for循环产生N个矩阵,怎么取第N次的矩阵?
  2. JAVA之bootstrap01
  3. 判断单链表是否有环 两链表是否相交
  4. struts2远程代码执行漏洞合集
  5. 互联网晚报 | 11/21 星期一 | 31省平均工资发布;​九城不排除重新接盘暴雪魔兽世界;iPhone14Pro发货再次延期...
  6. NRF24L01的配置详解
  7. ST-BlueNrg-lp蓝牙芯片OTA升级过程
  8. 项目添加到服务器报错,基于github+travis自动部署vue项目到远端服务器
  9. updated beforeUpdate() Updated() 生命周期-销毁阶段 vue的nextTick@stage3---week2--day4-1
  10. 《CS:GO》玩家快看,英特尔显卡驱动更新,帧率提升超两倍!