AutoLayout for Android

An easy way for supporting multiple screens.

This project is forked from hongyangAndroid/AndroidAutoLayout, but different. This project aim to to do the least changes to do the work, and not change the code habit.

What you should do is:


dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) compile 'im.quar:autolayout:1.0.1' apt 'im.quar:autolayout-compiler:1.0.1' }

* Add your base width & height to AndroidManifest.xml, different screens will scale depends on those values.
* Make your base activity extends form AutoLayoutActivity, or override onCreateView method.

public class BaseActivity extends AutoLayoutActivity {

protected void onCreate(Bundle savedInstanceState) {



@Override public View onCreateView(String name, Context context, AttributeSet attrs) { View view = AutoLayoutHelper.createAutoLayoutView(name, context, attrs); return view == null ? super.onCreateView(name, context, attrs) : view; }

**Now you just need change your dimen values from dp to px.
Yes, px. Actually use it with design_with & design_height to calculate the percent .**

__If you just want to use auto layout partially, replace standard layout with Auto**Layout in xml files (e.g. LinearLayout -> AutoLinearLayout).__

### Supported layouts:
Auto adaption will work with those layouts:
* LinearLayout
* RelativeLayout
* FrameLayout
* ListView
* CardView
* RecyclerView

### Supported attrs:
* layout_width
* layout_height
* layout_margin (left, top, right, bottom)
* padding (left, top, right, bottom)
* textSize
* maxWidth, minWidth
* maxHeight, minHeight
* drawablePadding

### Extension:
If you want to make GridView or other else to be auto adaptable, you just need do this:

@AutoLayoutSimple public class AutoGridView extends GridView {

public AutoGridView(Context context, AttributeSet attrs) {
    super(context, attrs);


or more customizes:

@AutoLayout public class AutoGridView extends GridView { private final AutoLayoutHelper mHelper = new AutoLayoutHelper(this);

public AutoGridView(Context context, AttributeSet attrs) {
    super(context, attrs);

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

protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    if (!isInEditMode())
    super.onMeasure(widthMeasureSpec, heightMeasureSpec);

public static class LayoutParams extends GridView.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(ViewGroup.LayoutParams source) {

    public LayoutParams(ViewGroup.MarginLayoutParams source) {

    public AutoLayoutInfo getAutoLayoutInfo() {
        return mAutoLayoutInfo;



### Customize adaption policy:
If the default adaption policy is not adapt to you, you can do this

public class MyApplication extends Application {

public void onCreate() {
    AutoLayoutConfig.init(this, new ScaleAdapter() {
        public float adapt(float scale, int screenWidth, int screenHeight) {
            //Do yourself adaption here.
            if (screenWidth < 720 || screenHeight < 720) {//Small screen device
                if (screenWidth <= 480 || screenHeight <= 480) {//480p
                    scale *= 1.2f;
                } else {
                    if (ScreenUtils.getDevicePhysicalSize(getApplicationContext()) < 4.0) {//Meizu mx
                        scale *= 1.3f;
                    } else {//HUAWEI U9200
                        scale *= 1.05f;
            return scale;


### Aspect ratio
To fixing the aspect ratio, you must explicitly define Auto**Layout in your xml, and change one side(width or height) size of child view to 0dp or 0px.
Add app:auto_aspectRatio="1.33" if you want a width:height ratio of 4:3.

<?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android="" xmlns:app="" android:layout_width="match_parent" android:layout_height="match_parent">




### Adapt in code:

//Scale values int value = AutoUtils.scaleValue(pxVal);

//Adapt all view attrs.;

### Note:
**Don't** use dynamic view‘s **padding**, instead use child's **margin**.
(ListView, GridView, RecyclerView etc.)

### Thanks: