android适配autolayout的使用心得体会

原文:Android AutoLayout全新的适配方式 堪称适配终结者

平时我们拿到设计图的时候是px,而我们android的尺寸单位,却是sp,dp之类的。

传统的适配方案要建一大堆文件夹进行适配,百分比布局还要计算百分比。

我们希望:

拿到设计图,meta信息中填入设计图的尺寸,然后不需要额外计算,布局直接抄设计图上的尺寸,不产生任何多余的资源

文件,完成各种分辨率的适配!

鸿洋大大的autolayout基本完成了这一项工作。

用法

1、将autolayout引入

dependencies {
    compile project(':autolayout')
}

也可以直接

dependencies {
    compile 'com.zhy:autolayout:1.4.5'
}

2、标明设计稿尺寸

在AndroidManifest

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

3、使用时候有两种用法:

一种是让你的Activity继承自AutoLayoutActivity.一般可以把你的基类继承AutoLayoutActivity

如果你觉得这种对你的activity改变太大等等,,,

那么,你可以将你的布局替换成

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

系统原有的属性都会保留。

ps:几个注意事项

1、可以多用margin,减少嵌套,因为不需要考虑适配问题,所以,可以直接margin固定距离尺寸等等,

LinearLayout的weight也不需要,直接每个布局设置相同宽度即可。

2、textview使用中发现很多问题,直接用px会出现高度不对问题。鸿洋这样解释:设计稿一般只会标识一个字体的大小

,比如你设置textSize=”20px”,实际上TextView所占据的高度肯定大于20px,字的上下都会有一定的间隙,所以一定要

灵活去写字体的高度,比如对于text上下的margin可以选择尽可能小一点。或者选择别的约束条件去定位(比如上例,选

择了marginBottom)

但是更简单的处理方式是,我们的字体尺寸可以继续用sp.

3、在listview ,recycleview 或者一些布局我们无法转换为autoXXX的布局,我们想为子布局做适配的时候,我们需要

用到同一个方法, AutoUtils.autoSize(convertView);我们可以实例化出来子布局,然后设置适配,那么这个子布局将
会适配auto布局。

对于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使用三个参数的方法!

当然大家现在也没谁用这种low炸了,直接写adapter了吧,太麻烦了,BaseQucickAdapter是一个高达14k的强大的adapter,

那我们该怎么适配呢,其实只需要一句话。

  @Override
    public BaseViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        AutoUtils.auto(parent);
        return super.onCreateViewHolder(parent, viewType);
    }

4、对于我们自定义的布局,我们可以用平常的适配,如果也想支持px直接写的话,可以在里面进行适配:

例如博文给出的:

AutoCardView.java


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);
}

@Override
public LayoutParams generateLayoutParams(AttributeSet attrs) {
    return new LayoutParams(getContext(), attrs);
}

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec)
{
    if (!isInEditMode())
        mHelper.adjustChildren();
    super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}

@Override
protected void onLayout(boolean changed, int left, int top, int right, int bottom)
{
    super.onLayout(changed, left, top, right, bottom);
}

public static class LayoutParams extends CardView.LayoutParams
        implements AutoLayoutHelper.AutoLayoutParams
{
    private AutoLayoutInfo mAutoLayoutInfo;

    public LayoutParams(Context c, AttributeSet attrs)
    {
        super(c, attrs);
        mAutoLayoutInfo = AutoLayoutHelper.getAutoLayoutInfo(c, attrs);
    }

    public LayoutParams(int width, int height)
    {
        super(width, height);
    }

    public LayoutParams(int width, int height, int gravity)
    {
        super(width, height, gravity);
    }

    public LayoutParams(ViewGroup.LayoutParams source)
    {
        super(source);
    }

    public LayoutParams(MarginLayoutParams source){
        super(source);
    }

    public LayoutParams(FrameLayout.LayoutParams source) {
        super((MarginLayoutParams) source);
        gravity = source.gravity;
    }

    public LayoutParams(LayoutParams source){
        this((FrameLayout.LayoutParams) source);
        mAutoLayoutInfo = source.mAutoLayoutInfo;
    }

    @Override
    public AutoLayoutInfo getAutoLayoutInfo(){
        return mAutoLayoutInfo;
    }
}
}

意思是我们想要进行直接px进行适配,就必须用auto布局加以包裹,否则不能适配。那么一些Radiogroup,toolbar之类的需要我们写成autoxxx形式。一些开发者也进行了补充,链接,其中包括一些常用的布局类。

android适配autolayout的使用心得体会_第1张图片

5、指定设置的值参考宽度或者高度
由于该库的特点,布局文件中宽高上的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.

你可能感兴趣的:(安卓基础)