AutoLayout - 自動適配所有機型的分辨率,來自鴻雁大神,推薦大家使用
AndroidAutoLayout
內容引用于 https://github.com/hongyangAndroid/AndroidAutoLayout 歡迎大家fork。關注鴻雁大神。
Android屏幕適配方案,直接填寫設計圖上的像素尺寸即可完成適配。
非常感謝 : 吃土豆的人 的協作。
效果圖
最大幅度解決適配問題,并且最大化方便開發者。
so,看下用法:
你沒有看錯,拿到設計稿,在布局文件里面直接填寫對應的px即可,px:這里的px并非是Google不建議使用的px,在內部會進行轉化處理。
ok,拿一些實際項目的頁面,看下不同分辨率下的效果:
左為:768 * 1280 ; 右為:1080 * 1920
上述兩個機器的分辨率差距挺大了,但是完美實現了適配,最為重要的是:
- 再也不用拿著設計稿去想這控件的寬高到底取多少dp
- 再也不用去為多個屏幕去寫多個dimens
- 再也不用去計算百分比了(如果使用百分比控件完成適配)
- 再也不用去跟UI MM去解釋什么是dp了
你所要做的就是抄抄設計稿上面的px,直接寫入布局文件。
還有很多好處,比如上面的Item里面元素比較多,如果標識的比較全面,一個FrameLayout,里面的View填寫各種marginLeft,marginTop就能完美實現,幾乎不需要嵌套了。
引入
- Android Studio
將autolayout引入
dependencies {
compile project(':autolayout')
}
也可以直接
dependencies { compile 'com.zhy:autolayout:1.3.6' }
- Eclipse
下載AutoLayoutDemoForEclipse.zip,導入到eclipse中即可。
用法
第一步:
在你的項目的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
{
@Override
public void onCreate()
{
super.onCreate();
AutoLayoutConifg.getInstance().useDeviceSize();
}
}
預覽
大家都知道,寫布局文件的時候,不能實時的去預覽效果,那么體驗真的是非常的不好,也在很大程度上降低開發效率,所以下面教大家如何用好,用對PreView(針對該庫)。
首先,你要記得你設計稿的尺寸,比如 768 * 1280
然后在你的PreView面板,選擇于設計圖分辨率一致的設備:然后在你的PreView面板,選擇于設計圖分辨率一致的設備:
然后你就可以看到最為精確的
預覽了:
兩個注意事項:
- 你們UI給的設計圖的尺寸并非是主流的設計圖,該尺寸沒找到,你可以自己去新建一個設備。
- 不要在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); } @Override public AutoFrameLayout.LayoutParams generateLayoutParams(AttributeSet attrs) { return new AutoFrameLayout.LayoutParams(getContext(), attrs); } @Override protected 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)
TODO
- 增加單個Activity橫屏布局的支持(設計圖必須是橫屏的)
- 完善demo(復雜的,簡單的,ListView的各種)
其他信息
作者信息:
- hongyangAndroid
- 吃土豆的人
靈感來自: