AndroidAutoLayout

AndroidAutoLayout

[DEPRECATED]Android屏幕適配方案,直接填寫設計圖上的像素尺寸便可完成適配。java

目前沒有精力,已中止維護,使用前務必看明白代碼,明確該方案能夠解決自身問題,有擴展代碼能力,不然不建議使用。android

很是感謝 : 吃土豆的人 的協做。git

效果圖

最大幅度解決適配問題,而且最大化方便開發者。github

so,看下用法:api

你沒有看錯,拿到設計稿,在佈局文件裏面直接填寫對應的px便可,px:這裏的px並不是是Google不建議使用的px,在內部會進行轉化處理。app

ok,拿一些實際項目的頁面,看下不一樣分辨率下的效果:maven

左爲:768 * 1280 ; 右爲:1080 * 1920ide

上述兩個機器的分辨率差距挺大了,可是完美實現了適配,最爲重要的是:佈局

  • 不再用拿着設計稿去想這控件的寬高到底取多少dp
  • 不再用去爲多個屏幕去寫多個dimens
  • 不再用去計算百分比了(若是使用百分比控件完成適配)
  • 不再用去跟UI MM去解釋什麼是dp了

你所要作的就是抄抄設計稿上面的px,直接寫入佈局文件。字體

還有不少好處,好比上面的Item裏面元素比較多,若是標識的比較全面,一個FrameLayout,裏面的View填寫各類marginLeft,marginTop就能完美實現,幾乎不須要嵌套了。

引入

  • Android Studio

autolayout引入

dependencies {
    compile project(':autolayout')
}

也能夠直接

dependencies {
    compile 'com.zhy:autolayout:1.4.5'
}
  • 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 { @Override public 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);
    }

    @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)

常見問題

###(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.

相關文章
相關標籤/搜索