diff --git a/.gitignore b/.gitignore
index 9c4de58..f6cc02c 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,7 +1,40 @@
-.gradle
-/local.properties
-/.idea/workspace.xml
-/.idea/libraries
-.DS_Store
-/build
+
/captures
+
+# Built application files
+*.apk
+*.ap_
+
+
+
+# Generated files
+bin/
+gen/
+
+# Gradle files
+.gradle/
+/build
+/*/build/
+
+# Local configuration file (sdk path, etc)
+local.properties
+
+# Proguard folder generated by Eclipse
+proguard/
+
+# Log Files
+*.log
+
+# Eclipse project files
+.classpath
+.project
+.settings/
+
+# Intellij project files
+*.iml
+*.ipr
+*.iws
+.idea/
+
+# System files
+.DS_Store
\ No newline at end of file
diff --git a/.idea/.name b/.idea/.name
deleted file mode 100644
index a1cdf6f..0000000
--- a/.idea/.name
+++ /dev/null
@@ -1 +0,0 @@
-AutoLayout
\ No newline at end of file
diff --git a/.idea/compiler.xml b/.idea/compiler.xml
deleted file mode 100644
index 9a8b7e5..0000000
--- a/.idea/compiler.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/.idea/copyright/profiles_settings.xml b/.idea/copyright/profiles_settings.xml
deleted file mode 100644
index e7bedf3..0000000
--- a/.idea/copyright/profiles_settings.xml
+++ /dev/null
@@ -1,3 +0,0 @@
-
-
-
\ No newline at end of file
diff --git a/.idea/gradle.xml b/.idea/gradle.xml
deleted file mode 100644
index 0cb7726..0000000
--- a/.idea/gradle.xml
+++ /dev/null
@@ -1,19 +0,0 @@
-
-
-
-
-
-
\ No newline at end of file
diff --git a/.idea/misc.xml b/.idea/misc.xml
deleted file mode 100644
index dae7a60..0000000
--- a/.idea/misc.xml
+++ /dev/null
@@ -1,62 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 1.7
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/.idea/modules.xml b/.idea/modules.xml
deleted file mode 100644
index b51290a..0000000
--- a/.idea/modules.xml
+++ /dev/null
@@ -1,10 +0,0 @@
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/.idea/runConfigurations.xml b/.idea/runConfigurations.xml
deleted file mode 100644
index 7f68460..0000000
--- a/.idea/runConfigurations.xml
+++ /dev/null
@@ -1,12 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/.idea/vcs.xml b/.idea/vcs.xml
deleted file mode 100644
index 94a25f7..0000000
--- a/.idea/vcs.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-
-
-
-
-
-
\ No newline at end of file
diff --git a/AutoLayout.iml b/AutoLayout.iml
deleted file mode 100644
index 6799bc5..0000000
--- a/AutoLayout.iml
+++ /dev/null
@@ -1,19 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/AutoLayoutDemoForEclipse.zip b/AutoLayoutDemoForEclipse.zip
deleted file mode 100644
index 2bc0466..0000000
Binary files a/AutoLayoutDemoForEclipse.zip and /dev/null differ
diff --git a/README.md b/README.md
index 6a9ce0c..aa40659 100644
--- a/README.md
+++ b/README.md
@@ -1,12 +1,23 @@
# AndroidAutoLayout
-Android屏幕适配方案,直接填写设计图上的像素尺寸即可完成适配。
+[DEPRECATED]Android屏幕适配方案,直接填写设计图上的像素尺寸即可完成适配。
+
+>目前没有精力,已停止维护,使用前务必看明白代码,明确该方案可以解决自身问题,有扩展代码能力,否则不建议使用。
非常感谢 : 吃土豆的人 的协作。
+
+>推荐使用[AndroidAutoSize](https://github.com/JessYanCoding/AndroidAutoSize)
+
+AndroidAutoSize目前作者一直在维护,私下也有一些交流,也是 AndroidAutoLayout 3年的使用者,自研了[AndroidAutoSize](https://github.com/JessYanCoding/AndroidAutoSize), 在目前本库已经没有精力维护的情况下,推荐使用;如果使用了本库,迁移成本也非常低,[迁移指南](https://github.com/JessYanCoding/AndroidAutoSize/issues/90)。
+
+
+
## 效果图
最大幅度解决适配问题,并且最大化方便开发者。
+
+
so,看下用法:
@@ -55,13 +66,13 @@ dependencies {
```
dependencies {
- compile 'com.zhy:autolayout:1.3.4'
+ compile 'com.zhy:autolayout:1.4.5'
}
```
* Eclipse
-下载[AutoLayoutDemoForEclipse.zip](AutoLayoutDemoForEclipse.zip),导入到eclipse中即可。
+建议使用As,方便版本更新。实在不行,只有复制粘贴源码了。
## 用法
@@ -96,7 +107,6 @@ dependencies {
这样也可以完成适配。
-
## 目前支持属性
* layout_width
@@ -104,7 +114,27 @@ dependencies {
* layout_margin(left,top,right,bottom)
* pading(left,top,right,bottom)
* textSize
+* maxWidth, minWidth, maxHeight, minHeight
+
+
+## 配置
+
+默认使用的高度是设备的可用高度,也就是不包括状态栏和底部的操作栏的,如果你希望拿设备的物理高度进行百分比化:
+可以在Application的onCreate方法中进行设置:
+
+```java
+public class UseDeviceSizeApplication extends Application
+{
+ @Override
+ public void onCreate()
+ {
+ super.onCreate();
+ AutoLayoutConifg.getInstance().useDeviceSize();
+ }
+}
+
+```
## 预览
@@ -187,7 +217,11 @@ public class AutoCardView extends CardView
### ListView、RecyclerView类的Item的适配
-对于ListView这类控件的item,默认跟局部写“px”进行适配是无效的,因为外层非AutoXXXLayout,而是ListView。但是,不用怕,一行代码就可以支持了:
+**sample中包含ListView、RecyclerView例子,具体查看sample**
+
+* 对于ListView
+
+对于ListView这类控件的item,默认根局部写“px”进行适配是无效的,因为外层非AutoXXXLayout,而是ListView。但是,不用怕,一行代码就可以支持了:
```java
@Override
@@ -213,6 +247,28 @@ public View getView(int position, View convertView, ViewGroup parent)
注意` AutoUtils.autoSize(convertView);`这行代码的位置即可。demo中也有相关实例。
+* 对于RecyclerView
+
+```java
+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是不相等的,于是如果需要宽高保持一致的情况,布局中使用属性:
@@ -234,12 +290,36 @@ public View getView(int position, View convertView, ViewGroup parent)
### TextView的高度问题
-设计稿一般只会标识一个字体的大小,比如你设置textSize="20px",实际上TextView所占据的高度肯定大于20px,字的上下都会有一定的建议,所以一定要灵活去写字体的高度,比如对于text上下的margin可以选择尽可能小一点。或者选择别的约束条件去定位(比如上例,选择了marginBottom)
+设计稿一般只会标识一个字体的大小,比如你设置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](https://github.com/hongyangAndroid/AndroidAutoLayout/issues/74)
+
+###(2)RadioGroup,Toolbar等控件中的子View无法完成适配
+
+这个其实上文已经提到过了,需要自己扩展。不过这个很多使用者贡献了他们的扩展类可以直接使用,
+参考[autolayout-widget](https://github.com/hongyangAndroid/AndroidAutoLayout/tree/master/widgetsample),
+如果没有发现你需要的容器类,那么你就真的需要自行扩展了,当然如果你完成了扩展,可以给我发个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`.
-##TODO
-* 增加单个Activity横屏布局的支持(设计图必须是横屏的)
-* 完善demo(复杂的,简单的,ListView的各种)
## 其他信息
diff --git a/app/app.iml b/app/app.iml
deleted file mode 100644
index 1a2c739..0000000
--- a/app/app.iml
+++ /dev/null
@@ -1,96 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- generateDebugAndroidTestSources
- generateDebugSources
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/autolayout-widget/.gitignore b/autolayout-widget/.gitignore
new file mode 100644
index 0000000..796b96d
--- /dev/null
+++ b/autolayout-widget/.gitignore
@@ -0,0 +1 @@
+/build
diff --git a/autolayout-widget/build.gradle b/autolayout-widget/build.gradle
new file mode 100644
index 0000000..12479e2
--- /dev/null
+++ b/autolayout-widget/build.gradle
@@ -0,0 +1,29 @@
+apply plugin: 'com.android.library'
+
+android {
+ compileSdkVersion 23
+ buildToolsVersion "23.0.1"
+
+ defaultConfig {
+ minSdkVersion 10
+ targetSdkVersion 23
+ versionCode 1
+ versionName "1.0"
+ }
+ buildTypes {
+ release {
+ minifyEnabled false
+ proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
+ }
+ }
+}
+
+dependencies {
+ compile fileTree(dir: 'libs', include: ['*.jar'])
+ compile 'com.android.support:appcompat-v7:23.1.0'
+ compile project(':autolayout')
+ compile 'com.android.support:support-v4:23.1.0'
+ compile 'com.android.support:design:23.1.1'
+ compile 'com.android.support:gridlayout-v7:23.1.0'
+ compile 'com.android.support:cardview-v7:23.1.0'
+}
diff --git a/autolayout-widget/proguard-rules.pro b/autolayout-widget/proguard-rules.pro
new file mode 100644
index 0000000..1c6c033
--- /dev/null
+++ b/autolayout-widget/proguard-rules.pro
@@ -0,0 +1,17 @@
+# Add project specific ProGuard rules here.
+# By default, the flags in this file are appended to flags specified
+# in /Users/zhy/android/sdk/android-sdk-macosx/tools/proguard/proguard-android.txt
+# You can edit the include path and order by changing the proguardFiles
+# directive in build.gradle.
+#
+# For more details, see
+# http://developer.android.com/guide/developing/tools/proguard.html
+
+# Add any project specific keep options here:
+
+# If your project uses WebView with JS, uncomment the following
+# and specify the fully qualified class name to the JavaScript interface
+# class:
+#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
+# public *;
+#}
diff --git a/autolayout-widget/src/androidTest/java/com/zhy/autolayout/widget/ApplicationTest.java b/autolayout-widget/src/androidTest/java/com/zhy/autolayout/widget/ApplicationTest.java
new file mode 100644
index 0000000..31ab05b
--- /dev/null
+++ b/autolayout-widget/src/androidTest/java/com/zhy/autolayout/widget/ApplicationTest.java
@@ -0,0 +1,15 @@
+package com.zhy.autolayout.widget;
+
+import android.app.Application;
+import android.test.ApplicationTestCase;
+
+/**
+ * Testing Fundamentals
+ */
+public class ApplicationTest extends ApplicationTestCase
+{
+ public ApplicationTest()
+ {
+ super(Application.class);
+ }
+}
\ No newline at end of file
diff --git a/autolayout-widget/src/main/AndroidManifest.xml b/autolayout-widget/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..cb3eb3f
--- /dev/null
+++ b/autolayout-widget/src/main/AndroidManifest.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
diff --git a/autolayout-widget/src/main/java/com/zhy/autolayout/widget/AutoActionMenuItemView.java b/autolayout-widget/src/main/java/com/zhy/autolayout/widget/AutoActionMenuItemView.java
new file mode 100644
index 0000000..a700a73
--- /dev/null
+++ b/autolayout-widget/src/main/java/com/zhy/autolayout/widget/AutoActionMenuItemView.java
@@ -0,0 +1,64 @@
+package com.zhy.autolayout.widget;
+
+import android.content.Context;
+import android.content.res.TypedArray;
+
+import android.support.v7.view.menu.ActionMenuItemView;
+import android.util.AttributeSet;
+import android.util.TypedValue;
+
+
+import com.zhy.autolayout.utils.AutoUtils;
+import com.zhy.autolayout.utils.DimenUtils;
+
+/**
+ * Created by hupei on 2016/3/7 14:44.
+ */
+public class AutoActionMenuItemView extends ActionMenuItemView {
+ private static final int NO_VALID = -1;
+ private int mMenuTextSize;
+
+ public AutoActionMenuItemView(Context context) {
+ this(context, null);
+ }
+
+ public AutoActionMenuItemView(Context context, AttributeSet attrs) {
+ this(context, attrs, 0);
+ }
+
+ public AutoActionMenuItemView(Context context, AttributeSet attrs, int defStyle) {
+ super(context, attrs, defStyle);
+ TypedArray a = context.getTheme().obtainStyledAttributes(attrs, R.styleable.Theme,
+ defStyle, R.style.ThemeOverlay_AppCompat);
+ int menuTextAppearance = a.getResourceId(R.styleable.Theme_actionBarTheme,
+ R.style.ThemeOverlay_AppCompat_ActionBar);
+ mMenuTextSize = loadTextSizeFromTextAppearance(menuTextAppearance);
+ a.recycle();
+ }
+
+ @Override
+ protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
+ if (!this.isInEditMode()) {
+ setUpTitleTextSize();
+ }
+ super.onMeasure(widthMeasureSpec, heightMeasureSpec);
+ }
+
+ private int loadTextSizeFromTextAppearance(int textAppearanceResId) {
+ TypedArray a = getContext().obtainStyledAttributes(textAppearanceResId,
+ R.styleable.TextAppearance);
+ try {
+ if (!DimenUtils.isPxVal(a.peekValue(R.styleable.TextAppearance_android_textSize)))
+ return NO_VALID;
+ return a.getDimensionPixelSize(R.styleable.TextAppearance_android_textSize, NO_VALID);
+ } finally {
+ a.recycle();
+ }
+ }
+
+ private void setUpTitleTextSize() {
+ if (mMenuTextSize == -1) return;
+ int autoTextSize = AutoUtils.getPercentHeightSize(mMenuTextSize);
+ setTextSize(TypedValue.COMPLEX_UNIT_PX, autoTextSize);
+ }
+}
diff --git a/autolayout-widget/src/main/java/com/zhy/autolayout/widget/AutoCardView.java b/autolayout-widget/src/main/java/com/zhy/autolayout/widget/AutoCardView.java
new file mode 100644
index 0000000..9b1dcba
--- /dev/null
+++ b/autolayout-widget/src/main/java/com/zhy/autolayout/widget/AutoCardView.java
@@ -0,0 +1,49 @@
+package com.zhy.autolayout.widget;
+
+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);
+ }
+
+
+}
diff --git a/autolayout-widget/src/main/java/com/zhy/autolayout/widget/AutoLayoutWidgetActivity.java b/autolayout-widget/src/main/java/com/zhy/autolayout/widget/AutoLayoutWidgetActivity.java
new file mode 100644
index 0000000..b2c73e6
--- /dev/null
+++ b/autolayout-widget/src/main/java/com/zhy/autolayout/widget/AutoLayoutWidgetActivity.java
@@ -0,0 +1,31 @@
+package com.zhy.autolayout.widget;
+
+import android.content.Context;
+import android.util.AttributeSet;
+import android.view.View;
+
+import com.zhy.autolayout.AutoLayoutActivity;
+
+/**
+ * Created by hupei on 2016/3/7 16:44.
+ */
+public class AutoLayoutWidgetActivity extends AutoLayoutActivity {
+
+ private static final String ACTION_MENU_ITEM_VIEW = "android.support.v7.view.menu.ActionMenuItemView";
+ private static final String TAB_LAYOUT = "android.support.design.widget.TabLayout";
+
+ @Override
+ public View onCreateView(String name, Context context, AttributeSet attrs) {
+ View view = null;
+
+ if (name.equals(ACTION_MENU_ITEM_VIEW)) {
+ view = new AutoActionMenuItemView(context, attrs);
+ }
+ if (name.equals(TAB_LAYOUT)) {
+ view = new AutoTabLayout(context, attrs);
+ }
+
+ if (view != null) return view;
+ return super.onCreateView(name, context, attrs);
+ }
+}
\ No newline at end of file
diff --git a/autolayout-widget/src/main/java/com/zhy/autolayout/widget/AutoRadioGroup.java b/autolayout-widget/src/main/java/com/zhy/autolayout/widget/AutoRadioGroup.java
new file mode 100644
index 0000000..2170594
--- /dev/null
+++ b/autolayout-widget/src/main/java/com/zhy/autolayout/widget/AutoRadioGroup.java
@@ -0,0 +1,83 @@
+package com.zhy.autolayout.widget;
+
+import android.content.Context;
+import android.util.AttributeSet;
+import android.view.ViewGroup;
+import android.widget.RadioGroup;
+
+import com.zhy.autolayout.AutoLayoutInfo;
+import com.zhy.autolayout.utils.AutoLayoutHelper;
+
+/**
+ * Created by hupei on 2016/2/29 9:59.
+ */
+public class AutoRadioGroup extends RadioGroup
+{
+ private AutoLayoutHelper mHelper = new AutoLayoutHelper(this);
+
+ public AutoRadioGroup(Context context)
+ {
+ super(context);
+ }
+
+ public AutoRadioGroup(Context context, AttributeSet attrs)
+ {
+ super(context, attrs);
+ }
+
+
+ @Override
+ protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec)
+ {
+ if (!isInEditMode())
+ mHelper.adjustChildren();
+ super.onMeasure(widthMeasureSpec, heightMeasureSpec);
+ }
+
+ @Override
+ protected void onLayout(boolean changed, int l, int t, int r, int b)
+ {
+ super.onLayout(changed, l, t, r, b);
+ }
+
+ @Override
+ public LayoutParams generateLayoutParams(AttributeSet attrs)
+ {
+ return new LayoutParams(getContext(), attrs);
+ }
+
+ public static class LayoutParams extends RadioGroup.LayoutParams
+ implements AutoLayoutHelper.AutoLayoutParams
+ {
+ private AutoLayoutInfo mAutoLayoutInfo;
+
+ public LayoutParams(Context c, AttributeSet attrs)
+ {
+ super(c, attrs);
+ mAutoLayoutInfo = AutoLayoutHelper.getAutoLayoutInfo(c, attrs);
+ }
+
+ @Override
+ public AutoLayoutInfo getAutoLayoutInfo()
+ {
+ return mAutoLayoutInfo;
+ }
+
+
+ public LayoutParams(int width, int height)
+ {
+ super(width, height);
+ }
+
+ public LayoutParams(ViewGroup.LayoutParams source)
+ {
+ super(source);
+ }
+
+ public LayoutParams(MarginLayoutParams source)
+ {
+ super(source);
+ }
+
+ }
+}
diff --git a/autolayout-widget/src/main/java/com/zhy/autolayout/widget/AutoTabLayout.java b/autolayout-widget/src/main/java/com/zhy/autolayout/widget/AutoTabLayout.java
new file mode 100644
index 0000000..6211c44
--- /dev/null
+++ b/autolayout-widget/src/main/java/com/zhy/autolayout/widget/AutoTabLayout.java
@@ -0,0 +1,112 @@
+package com.zhy.autolayout.widget;
+
+import android.content.Context;
+import android.content.res.TypedArray;
+import android.support.design.widget.TabLayout;
+import android.util.AttributeSet;
+import android.util.TypedValue;
+import android.view.ViewGroup;
+import android.widget.TextView;
+
+import com.zhy.autolayout.utils.AutoUtils;
+import com.zhy.autolayout.utils.DimenUtils;
+
+/**
+ * Created by zhy on 16/3/3.
+ */
+public class AutoTabLayout extends TabLayout
+{
+ private static final int NO_VALID = -1;
+ private int mTextSize;
+ private boolean mTextSizeBaseWidth = false;
+
+ public AutoTabLayout(Context context)
+ {
+ this(context, null);
+ }
+
+ public AutoTabLayout(Context context, AttributeSet attrs)
+ {
+ this(context, attrs, 0);
+ }
+
+ public AutoTabLayout(Context context, AttributeSet attrs, int defStyleAttr)
+ {
+ super(context, attrs, defStyleAttr);
+
+ initTextSizeBaseWidth(context, attrs);
+
+ TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.TabLayout,
+ defStyleAttr, R.style.Widget_Design_TabLayout);
+ int tabTextAppearance = a.getResourceId(R.styleable.TabLayout_tabTextAppearance,
+ R.style.TextAppearance_Design_Tab);
+
+ mTextSize = loadTextSizeFromTextAppearance(tabTextAppearance);
+ a.recycle();
+ }
+
+ private void initTextSizeBaseWidth(Context context, AttributeSet attrs)
+ {
+ TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.AutoTabLayout);
+ mTextSizeBaseWidth = a.getBoolean(R.styleable.AutoTabLayout_auto_textSize_base_width, false);
+ a.recycle();
+ }
+
+ private int loadTextSizeFromTextAppearance(int textAppearanceResId)
+ {
+ TypedArray a = getContext().obtainStyledAttributes(textAppearanceResId,
+ R.styleable.TextAppearance);
+
+ try
+ {
+ if (!DimenUtils.isPxVal(a.peekValue(R.styleable.TextAppearance_android_textSize)))
+ return NO_VALID;
+ return a.getDimensionPixelSize(R.styleable.TextAppearance_android_textSize, NO_VALID);
+ } finally
+ {
+ a.recycle();
+ }
+ }
+
+ @Override
+ public void addTab(Tab tab, int position, boolean setSelected)
+ {
+ super.addTab(tab, position, setSelected);
+ setUpTabTextSize(tab);
+ }
+
+ @Override
+ public void addTab(Tab tab, boolean setSelected)
+ {
+ super.addTab(tab, setSelected);
+ setUpTabTextSize(tab);
+ }
+
+ private void setUpTabTextSize(Tab tab)
+ {
+ if (mTextSize == NO_VALID || tab.getCustomView() != null) return;
+
+ ViewGroup tabGroup = (ViewGroup) getChildAt(0);
+ ViewGroup tabContainer = (ViewGroup) tabGroup.getChildAt(tab.getPosition());
+ TextView textView = (TextView) tabContainer.getChildAt(1);
+
+
+ if (AutoUtils.autoed(textView))
+ {
+ return;
+ }
+ int autoTextSize = 0 ;
+ if (mTextSizeBaseWidth)
+ {
+ autoTextSize = AutoUtils.getPercentWidthSize(mTextSize);
+ } else
+ {
+ autoTextSize = AutoUtils.getPercentHeightSize(mTextSize);
+ }
+
+
+ textView.setTextSize(TypedValue.COMPLEX_UNIT_PX, autoTextSize);
+ }
+
+
+}
diff --git a/autolayout-widget/src/main/java/com/zhy/autolayout/widget/AutoTableLayout.java b/autolayout-widget/src/main/java/com/zhy/autolayout/widget/AutoTableLayout.java
new file mode 100644
index 0000000..adc584a
--- /dev/null
+++ b/autolayout-widget/src/main/java/com/zhy/autolayout/widget/AutoTableLayout.java
@@ -0,0 +1,86 @@
+package com.zhy.autolayout.widget;
+
+import android.content.Context;
+import android.util.AttributeSet;
+import android.view.ViewGroup;
+import android.widget.TableLayout;
+
+import com.zhy.autolayout.AutoLayoutInfo;
+import com.zhy.autolayout.utils.AutoLayoutHelper;
+
+/**
+ * Created by hupei on 2016/2/29 9:59.
+ */
+public class AutoTableLayout extends TableLayout
+{
+ private AutoLayoutHelper mHelper = new AutoLayoutHelper(this);
+
+ public AutoTableLayout(Context context)
+ {
+ super(context);
+ }
+
+ public AutoTableLayout(Context context, AttributeSet attrs)
+ {
+ super(context, attrs);
+ }
+
+ @Override
+ protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec)
+ {
+ if (!isInEditMode())
+ mHelper.adjustChildren();
+ super.onMeasure(widthMeasureSpec, heightMeasureSpec);
+ }
+
+
+ @Override
+ protected void onLayout(boolean changed, int l, int t, int r, int b)
+ {
+ super.onLayout(changed, l, t, r, b);
+ }
+
+
+ @Override
+ public LayoutParams generateLayoutParams(AttributeSet attrs)
+ {
+ return new LayoutParams(getContext(), attrs);
+ }
+
+
+ public static class LayoutParams extends TableLayout.LayoutParams
+ implements AutoLayoutHelper.AutoLayoutParams
+ {
+ private AutoLayoutInfo mAutoLayoutInfo;
+
+ public LayoutParams(Context c, AttributeSet attrs)
+ {
+ super(c, attrs);
+ mAutoLayoutInfo = AutoLayoutHelper.getAutoLayoutInfo(c, attrs);
+ }
+
+ @Override
+ public AutoLayoutInfo getAutoLayoutInfo()
+ {
+ return mAutoLayoutInfo;
+ }
+
+
+ public LayoutParams(int width, int height)
+ {
+ super(width, height);
+ }
+
+
+ public LayoutParams(ViewGroup.LayoutParams source)
+ {
+ super(source);
+ }
+
+ public LayoutParams(MarginLayoutParams source)
+ {
+ super(source);
+ }
+
+ }
+}
diff --git a/autolayout-widget/src/main/java/com/zhy/autolayout/widget/AutoTableRow.java b/autolayout-widget/src/main/java/com/zhy/autolayout/widget/AutoTableRow.java
new file mode 100644
index 0000000..553d3ad
--- /dev/null
+++ b/autolayout-widget/src/main/java/com/zhy/autolayout/widget/AutoTableRow.java
@@ -0,0 +1,87 @@
+package com.zhy.autolayout.widget;
+
+import android.content.Context;
+import android.util.AttributeSet;
+import android.view.ViewGroup;
+import android.widget.TableRow;
+
+import com.zhy.autolayout.AutoLayoutInfo;
+import com.zhy.autolayout.utils.AutoLayoutHelper;
+
+/**
+ * Created by hupei on 2016/2/29 9:59.
+ */
+public class AutoTableRow extends TableRow
+{
+ private AutoLayoutHelper mHelper = new AutoLayoutHelper(this);
+
+ public AutoTableRow(Context context)
+ {
+ super(context);
+ }
+
+ public AutoTableRow(Context context, AttributeSet attrs)
+ {
+ super(context, attrs);
+ }
+
+
+ @Override
+ protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec)
+ {
+ if (!isInEditMode())
+ mHelper.adjustChildren();
+ super.onMeasure(widthMeasureSpec, heightMeasureSpec);
+ }
+
+
+ @Override
+ protected void onLayout(boolean changed, int l, int t, int r, int b)
+ {
+ super.onLayout(changed, l, t, r, b);
+ }
+
+
+ @Override
+ public LayoutParams generateLayoutParams(AttributeSet attrs)
+ {
+ return new LayoutParams(getContext(), attrs);
+ }
+
+
+ public static class LayoutParams extends TableRow.LayoutParams
+ implements AutoLayoutHelper.AutoLayoutParams
+ {
+ private AutoLayoutInfo mAutoLayoutInfo;
+
+ public LayoutParams(Context c, AttributeSet attrs)
+ {
+ super(c, attrs);
+ mAutoLayoutInfo = AutoLayoutHelper.getAutoLayoutInfo(c, attrs);
+ }
+
+ @Override
+ public AutoLayoutInfo getAutoLayoutInfo()
+ {
+ return mAutoLayoutInfo;
+ }
+
+
+ public LayoutParams(int width, int height)
+ {
+ super(width, height);
+ }
+
+
+ public LayoutParams(ViewGroup.LayoutParams source)
+ {
+ super(source);
+ }
+
+ public LayoutParams(MarginLayoutParams source)
+ {
+ super(source);
+ }
+
+ }
+}
diff --git a/autolayout-widget/src/main/java/com/zhy/autolayout/widget/AutoToolbar.java b/autolayout-widget/src/main/java/com/zhy/autolayout/widget/AutoToolbar.java
new file mode 100644
index 0000000..90f4a9e
--- /dev/null
+++ b/autolayout-widget/src/main/java/com/zhy/autolayout/widget/AutoToolbar.java
@@ -0,0 +1,143 @@
+package com.zhy.autolayout.widget;
+
+import android.content.Context;
+import android.content.res.TypedArray;
+import android.support.v7.widget.Toolbar;
+import android.text.TextUtils;
+import android.util.AttributeSet;
+import android.util.TypedValue;
+import android.widget.TextView;
+
+import com.zhy.autolayout.AutoLayoutInfo;
+import com.zhy.autolayout.utils.AutoLayoutHelper;
+import com.zhy.autolayout.utils.AutoUtils;
+import com.zhy.autolayout.utils.DimenUtils;
+
+import java.lang.reflect.Field;
+
+/**
+ * Created by hupei on 2015/12/28 20:33.
+ */
+public class AutoToolbar extends Toolbar {
+ private static final int NO_VALID = -1;
+ private int mTextSize;
+ private int mSubTextSize;
+ private final AutoLayoutHelper mHelper = new AutoLayoutHelper(this);
+
+ public AutoToolbar(Context context, AttributeSet attrs, int defStyleAttr) {
+ super(context, attrs, defStyleAttr);
+ TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.Toolbar,
+ defStyleAttr, R.style.Widget_AppCompat_Toolbar);
+
+ int titleTextAppearance = a.getResourceId(R.styleable.Toolbar_titleTextAppearance,
+ R.style.TextAppearance_Widget_AppCompat_Toolbar_Title);
+
+ int subtitleTextAppearance = a.getResourceId(R.styleable.Toolbar_subtitleTextAppearance,
+ R.style.TextAppearance_Widget_AppCompat_Toolbar_Subtitle);
+
+ mTextSize = loadTextSizeFromTextAppearance(titleTextAppearance);
+ mSubTextSize = loadTextSizeFromTextAppearance(subtitleTextAppearance);
+
+ TypedArray menuA = context.getTheme().obtainStyledAttributes(attrs, R.styleable.Theme,
+ defStyleAttr, R.style.ThemeOverlay_AppCompat);
+ int menuTextAppearance = menuA.getResourceId(R.styleable.Theme_actionBarTheme,
+ R.style.ThemeOverlay_AppCompat_ActionBar);
+ int menuTextSize = loadTextSizeFromTextAppearance(menuTextAppearance);
+
+ //防止 menu 定义 textSize,而 Toolbar 无定义 textSize 时,title 的 textSize 随 menu 变化
+ if (mTextSize == NO_VALID) mTextSize = menuTextSize;
+ if (mSubTextSize == NO_VALID) mSubTextSize = menuTextSize;
+
+ a.recycle();
+ menuA.recycle();
+ }
+
+ public AutoToolbar(Context context, AttributeSet attrs) {
+ this(context, attrs, 0);
+ }
+
+ public AutoToolbar(Context context) {
+ this(context, null);
+ }
+
+ private int loadTextSizeFromTextAppearance(int textAppearanceResId) {
+ TypedArray a = getContext().obtainStyledAttributes(textAppearanceResId,
+ R.styleable.TextAppearance);
+ try {
+ if (!DimenUtils.isPxVal(a.peekValue(R.styleable.TextAppearance_android_textSize)))
+ return NO_VALID;
+ return a.getDimensionPixelSize(R.styleable.TextAppearance_android_textSize, NO_VALID);
+ } finally {
+ a.recycle();
+ }
+ }
+
+ private void setUpTitleTextSize() {
+ CharSequence title = getTitle();
+ if (!TextUtils.isEmpty(title) && mTextSize != NO_VALID)
+ setUpTitleTextSize("mTitleTextView", mTextSize);
+ CharSequence subtitle = getSubtitle();
+ if (!TextUtils.isEmpty(subtitle) && mSubTextSize != NO_VALID)
+ setUpTitleTextSize("mSubtitleTextView", mSubTextSize);
+ }
+
+ private void setUpTitleTextSize(String name, int val) {
+ try {
+ //反射 Toolbar 的 TextView
+ Field f = getClass().getSuperclass().getDeclaredField(name);
+ f.setAccessible(true);
+ TextView textView = (TextView) f.get(this);
+ if (textView != null) {
+ int autoTextSize = AutoUtils.getPercentHeightSize(val);
+ textView.setTextSize(TypedValue.COMPLEX_UNIT_PX, autoTextSize);
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+
+ @Override
+ protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
+ if (!this.isInEditMode()) {
+ setUpTitleTextSize();
+ this.mHelper.adjustChildren();
+ }
+ super.onMeasure(widthMeasureSpec, heightMeasureSpec);
+ }
+
+ @Override
+ protected void onLayout(boolean changed, int l, int t, int r, int b) {
+ super.onLayout(changed, l, t, r, b);
+ }
+
+ @Override
+ public LayoutParams generateLayoutParams(AttributeSet attrs) {
+ return new LayoutParams(this.getContext(), attrs);
+ }
+
+ public static class LayoutParams extends Toolbar.LayoutParams implements AutoLayoutHelper.AutoLayoutParams {
+ private AutoLayoutInfo mDimenLayoutInfo;
+
+ public LayoutParams(Context c, AttributeSet attrs) {
+ super(c, attrs);
+ this.mDimenLayoutInfo = AutoLayoutHelper.getAutoLayoutInfo(c, attrs);
+ }
+
+ @Override
+ public AutoLayoutInfo getAutoLayoutInfo() {
+ return this.mDimenLayoutInfo;
+ }
+
+ public LayoutParams(int width, int height) {
+ super(width, height);
+ }
+
+ public LayoutParams(android.view.ViewGroup.LayoutParams source) {
+ super(source);
+ }
+
+ public LayoutParams(MarginLayoutParams source) {
+ super(source);
+ }
+ }
+}
diff --git a/autolayout-widget/src/main/res/values/attrs.xml b/autolayout-widget/src/main/res/values/attrs.xml
new file mode 100644
index 0000000..c0ece0c
--- /dev/null
+++ b/autolayout-widget/src/main/res/values/attrs.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/autolayout-widget/src/main/res/values/strings.xml b/autolayout-widget/src/main/res/values/strings.xml
new file mode 100644
index 0000000..c2c541a
--- /dev/null
+++ b/autolayout-widget/src/main/res/values/strings.xml
@@ -0,0 +1,3 @@
+
+ autolayout-widget
+
diff --git a/autolayout/autolayout.iml b/autolayout/autolayout.iml
deleted file mode 100644
index 64b84c3..0000000
--- a/autolayout/autolayout.iml
+++ /dev/null
@@ -1,103 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- generateDebugAndroidTestSources
- generateDebugSources
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/autolayout/build.gradle b/autolayout/build.gradle
index c7d2e91..d02e622 100644
--- a/autolayout/build.gradle
+++ b/autolayout/build.gradle
@@ -2,7 +2,7 @@ apply plugin: 'com.android.library'
apply plugin: 'com.github.dcendents.android-maven'
apply plugin: 'com.jfrog.bintray'
-version = "1.3.4"
+version = "1.4.5"
android {
compileSdkVersion 23
diff --git a/autolayout/src/main/AndroidManifest.xml b/autolayout/src/main/AndroidManifest.xml
index 02c4172..4fc9a81 100644
--- a/autolayout/src/main/AndroidManifest.xml
+++ b/autolayout/src/main/AndroidManifest.xml
@@ -1,10 +1,4 @@
-
+
-
-
-
diff --git a/autolayout/src/main/java/com/zhy/autolayout/AutoFrameLayout.java b/autolayout/src/main/java/com/zhy/autolayout/AutoFrameLayout.java
index 37ed323..595d933 100644
--- a/autolayout/src/main/java/com/zhy/autolayout/AutoFrameLayout.java
+++ b/autolayout/src/main/java/com/zhy/autolayout/AutoFrameLayout.java
@@ -16,12 +16,12 @@
package com.zhy.autolayout;
+import android.annotation.TargetApi;
import android.content.Context;
+import android.os.Build;
import android.util.AttributeSet;
import android.view.ViewGroup;
import android.widget.FrameLayout;
-
-import com.zhy.autolayout.config.AutoLayoutConifg;
import com.zhy.autolayout.utils.AutoLayoutHelper;
public class AutoFrameLayout extends FrameLayout
@@ -43,6 +43,11 @@ public AutoFrameLayout(Context context, AttributeSet attrs, int defStyleAttr)
super(context, attrs, defStyleAttr);
}
+ @TargetApi(Build.VERSION_CODES.LOLLIPOP)
+ public AutoFrameLayout(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
+ super(context, attrs, defStyleAttr, defStyleRes);
+ }
+
@Override
public LayoutParams generateLayoutParams(AttributeSet attrs)
{
diff --git a/autolayout/src/main/java/com/zhy/autolayout/AutoLayoutInfo.java b/autolayout/src/main/java/com/zhy/autolayout/AutoLayoutInfo.java
index fef6236..ebe2a2a 100644
--- a/autolayout/src/main/java/com/zhy/autolayout/AutoLayoutInfo.java
+++ b/autolayout/src/main/java/com/zhy/autolayout/AutoLayoutInfo.java
@@ -1,8 +1,26 @@
package com.zhy.autolayout;
import android.view.View;
+import android.view.ViewGroup;
+import android.widget.TextView;
+import com.zhy.autolayout.attr.Attrs;
import com.zhy.autolayout.attr.AutoAttr;
+import com.zhy.autolayout.attr.HeightAttr;
+import com.zhy.autolayout.attr.MarginBottomAttr;
+import com.zhy.autolayout.attr.MarginLeftAttr;
+import com.zhy.autolayout.attr.MarginRightAttr;
+import com.zhy.autolayout.attr.MarginTopAttr;
+import com.zhy.autolayout.attr.MaxHeightAttr;
+import com.zhy.autolayout.attr.MaxWidthAttr;
+import com.zhy.autolayout.attr.MinHeightAttr;
+import com.zhy.autolayout.attr.MinWidthAttr;
+import com.zhy.autolayout.attr.PaddingBottomAttr;
+import com.zhy.autolayout.attr.PaddingLeftAttr;
+import com.zhy.autolayout.attr.PaddingRightAttr;
+import com.zhy.autolayout.attr.PaddingTopAttr;
+import com.zhy.autolayout.attr.TextSizeAttr;
+import com.zhy.autolayout.attr.WidthAttr;
import java.util.ArrayList;
import java.util.List;
@@ -10,6 +28,7 @@
public class AutoLayoutInfo
{
private List autoAttrs = new ArrayList<>();
+
public void addAttr(AutoAttr autoAttr)
{
autoAttrs.add(autoAttr);
@@ -24,6 +43,108 @@ public void fillAttrs(View view)
}
}
+
+ public static AutoLayoutInfo getAttrFromView(View view, int attrs, int base)
+ {
+ ViewGroup.LayoutParams params = view.getLayoutParams();
+ if (params == null) return null;
+ AutoLayoutInfo autoLayoutInfo = new AutoLayoutInfo();
+
+ // width & height
+ if ((attrs & Attrs.WIDTH) != 0 && params.width > 0)
+ {
+ autoLayoutInfo.addAttr(WidthAttr.generate(params.width, base));
+ }
+
+ if ((attrs & Attrs.HEIGHT) != 0 && params.height > 0)
+ {
+ autoLayoutInfo.addAttr(HeightAttr.generate(params.height, base));
+ }
+
+ //margin
+ if (params instanceof ViewGroup.MarginLayoutParams)
+ {
+ if ((attrs & Attrs.MARGIN) != 0)
+ {
+ autoLayoutInfo.addAttr(MarginLeftAttr.generate(((ViewGroup.MarginLayoutParams) params).leftMargin, base));
+ autoLayoutInfo.addAttr(MarginTopAttr.generate(((ViewGroup.MarginLayoutParams) params).topMargin, base));
+ autoLayoutInfo.addAttr(MarginRightAttr.generate(((ViewGroup.MarginLayoutParams) params).rightMargin, base));
+ autoLayoutInfo.addAttr(MarginBottomAttr.generate(((ViewGroup.MarginLayoutParams) params).bottomMargin, base));
+ }
+ if ((attrs & Attrs.MARGIN_LEFT) != 0)
+ {
+ autoLayoutInfo.addAttr(MarginLeftAttr.generate(((ViewGroup.MarginLayoutParams) params).leftMargin, base));
+ }
+ if ((attrs & Attrs.MARGIN_TOP) != 0)
+ {
+ autoLayoutInfo.addAttr(MarginTopAttr.generate(((ViewGroup.MarginLayoutParams) params).topMargin, base));
+ }
+ if ((attrs & Attrs.MARGIN_RIGHT) != 0)
+ {
+ autoLayoutInfo.addAttr(MarginRightAttr.generate(((ViewGroup.MarginLayoutParams) params).rightMargin, base));
+ }
+ if ((attrs & Attrs.MARGIN_BOTTOM) != 0)
+ {
+ autoLayoutInfo.addAttr(MarginBottomAttr.generate(((ViewGroup.MarginLayoutParams) params).bottomMargin, base));
+ }
+ }
+
+ //padding
+ if ((attrs & Attrs.PADDING) != 0)
+ {
+ autoLayoutInfo.addAttr(PaddingLeftAttr.generate(view.getPaddingLeft(), base));
+ autoLayoutInfo.addAttr(PaddingTopAttr.generate(view.getPaddingTop(), base));
+ autoLayoutInfo.addAttr(PaddingRightAttr.generate(view.getPaddingRight(), base));
+ autoLayoutInfo.addAttr(PaddingBottomAttr.generate(view.getPaddingBottom(), base));
+ }
+ if ((attrs & Attrs.PADDING_LEFT) != 0)
+ {
+ autoLayoutInfo.addAttr(MarginLeftAttr.generate(view.getPaddingLeft(), base));
+ }
+ if ((attrs & Attrs.PADDING_TOP) != 0)
+ {
+ autoLayoutInfo.addAttr(MarginTopAttr.generate(view.getPaddingTop(), base));
+ }
+ if ((attrs & Attrs.PADDING_RIGHT) != 0)
+ {
+ autoLayoutInfo.addAttr(MarginRightAttr.generate(view.getPaddingRight(), base));
+ }
+ if ((attrs & Attrs.PADDING_BOTTOM) != 0)
+ {
+ autoLayoutInfo.addAttr(MarginBottomAttr.generate(view.getPaddingBottom(), base));
+ }
+
+ //minWidth ,maxWidth , minHeight , maxHeight
+ if ((attrs & Attrs.MIN_WIDTH) != 0)
+ {
+ autoLayoutInfo.addAttr(MinWidthAttr.generate(MinWidthAttr.getMinWidth(view), base));
+ }
+ if ((attrs & Attrs.MAX_WIDTH) != 0)
+ {
+ autoLayoutInfo.addAttr(MaxWidthAttr.generate(MaxWidthAttr.getMaxWidth(view), base));
+ }
+ if ((attrs & Attrs.MIN_HEIGHT) != 0)
+ {
+ autoLayoutInfo.addAttr(MinHeightAttr.generate(MinHeightAttr.getMinHeight(view), base));
+ }
+ if ((attrs & Attrs.MAX_HEIGHT) != 0)
+ {
+ autoLayoutInfo.addAttr(MaxHeightAttr.generate(MaxHeightAttr.getMaxHeight(view), base));
+ }
+
+ //textsize
+
+ if (view instanceof TextView)
+ {
+ if ((attrs & Attrs.TEXTSIZE) != 0)
+ {
+ autoLayoutInfo.addAttr(TextSizeAttr.generate((int) ((TextView) view).getTextSize(), base));
+ }
+ }
+ return autoLayoutInfo;
+ }
+
+
@Override
public String toString()
{
diff --git a/autolayout/src/main/java/com/zhy/autolayout/AutoLinearLayout.java b/autolayout/src/main/java/com/zhy/autolayout/AutoLinearLayout.java
index 2cb61e8..f0f93d6 100644
--- a/autolayout/src/main/java/com/zhy/autolayout/AutoLinearLayout.java
+++ b/autolayout/src/main/java/com/zhy/autolayout/AutoLinearLayout.java
@@ -1,6 +1,8 @@
package com.zhy.autolayout;
+import android.annotation.TargetApi;
import android.content.Context;
+import android.os.Build;
import android.util.AttributeSet;
import android.view.ViewGroup;
import android.widget.LinearLayout;
@@ -15,11 +17,23 @@ public class AutoLinearLayout extends LinearLayout
private AutoLayoutHelper mHelper = new AutoLayoutHelper(this);
- public AutoLinearLayout(Context context, AttributeSet attrs)
- {
+ public AutoLinearLayout(Context context) {
+ super(context);
+ }
+
+ public AutoLinearLayout(Context context, AttributeSet attrs) {
super(context, attrs);
}
+ @TargetApi(Build.VERSION_CODES.HONEYCOMB)
+ public AutoLinearLayout(Context context, AttributeSet attrs, int defStyleAttr) {
+ super(context, attrs, defStyleAttr);
+ }
+
+ @TargetApi(Build.VERSION_CODES.LOLLIPOP)
+ public AutoLinearLayout(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
+ super(context, attrs, defStyleAttr, defStyleRes);
+ }
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec)
diff --git a/autolayout/src/main/java/com/zhy/autolayout/AutoRelativeLayout.java b/autolayout/src/main/java/com/zhy/autolayout/AutoRelativeLayout.java
index 9e34dc0..c107e57 100644
--- a/autolayout/src/main/java/com/zhy/autolayout/AutoRelativeLayout.java
+++ b/autolayout/src/main/java/com/zhy/autolayout/AutoRelativeLayout.java
@@ -16,7 +16,9 @@
package com.zhy.autolayout;
+import android.annotation.TargetApi;
import android.content.Context;
+import android.os.Build;
import android.util.AttributeSet;
import android.view.ViewGroup;
import android.widget.RelativeLayout;
@@ -42,6 +44,11 @@ public AutoRelativeLayout(Context context, AttributeSet attrs, int defStyle)
super(context, attrs, defStyle);
}
+ @TargetApi(Build.VERSION_CODES.LOLLIPOP)
+ public AutoRelativeLayout(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
+ super(context, attrs, defStyleAttr, defStyleRes);
+ }
+
@Override
public LayoutParams generateLayoutParams(AttributeSet attrs)
{
diff --git a/autolayout/src/main/java/com/zhy/autolayout/attr/Attrs.java b/autolayout/src/main/java/com/zhy/autolayout/attr/Attrs.java
index 5d95ae5..774d803 100644
--- a/autolayout/src/main/java/com/zhy/autolayout/attr/Attrs.java
+++ b/autolayout/src/main/java/com/zhy/autolayout/attr/Attrs.java
@@ -20,5 +20,9 @@ public interface Attrs
public static final int PADDING_TOP = PADDING_LEFT << 1;
public static final int PADDING_RIGHT = PADDING_TOP << 1;
public static final int PADDING_BOTTOM = PADDING_RIGHT << 1;
+ public static final int MIN_WIDTH = PADDING_BOTTOM << 1;
+ public static final int MAX_WIDTH = MIN_WIDTH << 1;
+ public static final int MIN_HEIGHT = MAX_WIDTH << 1;
+ public static final int MAX_HEIGHT = MIN_HEIGHT << 1;
}
diff --git a/autolayout/src/main/java/com/zhy/autolayout/attr/AutoAttr.java b/autolayout/src/main/java/com/zhy/autolayout/attr/AutoAttr.java
index 2fa358d..0f1259f 100644
--- a/autolayout/src/main/java/com/zhy/autolayout/attr/AutoAttr.java
+++ b/autolayout/src/main/java/com/zhy/autolayout/attr/AutoAttr.java
@@ -11,10 +11,31 @@
*/
public abstract class AutoAttr
{
+ public static final int BASE_WIDTH = 1;
+ public static final int BASE_HEIGHT = 2;
+ public static final int BASE_DEFAULT = 3;
+
protected int pxVal;
protected int baseWidth;
protected int baseHeight;
+ /*
+ protected boolean isBaseWidth;
+ protected boolean isBaseDefault;
+
+ public AutoAttr(int pxVal)
+ {
+ this.pxVal = pxVal;
+ isBaseDefault = true;
+ }
+
+ public AutoAttr(int pxVal, boolean isBaseWidth)
+ {
+ this.pxVal = pxVal;
+ this.isBaseWidth = isBaseWidth;
+ }
+ */
+
public AutoAttr(int pxVal, int baseWidth, int baseHeight)
{
this.pxVal = pxVal;
@@ -55,18 +76,19 @@ public void apply(View view)
}
}
- val = Math.max(val, 1);//for very thin divider
+ if (val > 0)
+ val = Math.max(val, 1);//for very thin divider
execute(view, val);
}
protected int getPercentWidthSize()
{
- return AutoUtils.getPercentWidthSize(pxVal);
+ return AutoUtils.getPercentWidthSizeBigger(pxVal);
}
protected int getPercentHeightSize()
{
- return AutoUtils.getPercentHeightSize(pxVal);
+ return AutoUtils.getPercentHeightSizeBigger(pxVal);
}
@@ -91,6 +113,7 @@ protected boolean contains(int baseVal, int flag)
protected abstract void execute(View view, int val);
+
@Override
public String toString()
{
diff --git a/autolayout/src/main/java/com/zhy/autolayout/attr/AutoAttrEnum.java b/autolayout/src/main/java/com/zhy/autolayout/attr/AutoAttrEnum.java
deleted file mode 100644
index fe1f648..0000000
--- a/autolayout/src/main/java/com/zhy/autolayout/attr/AutoAttrEnum.java
+++ /dev/null
@@ -1,37 +0,0 @@
-package com.zhy.autolayout.attr;
-
-import android.view.View;
-
-/**
- * Created by zhy on 15/12/4.
- */
-public enum AutoAttrEnum
-{
- TEXT_SIZE
- {
- @Override
- public void apply(View view)
- {
-
- }
- };
-
- private int pxVal ;
-
- public int getPxVal()
- {
- return pxVal;
- }
-
- public void setPxVal(int pxVal)
- {
- this.pxVal = pxVal;
- }
-
- public abstract void apply(View view);
-
-
-
-
-
-}
diff --git a/autolayout/src/main/java/com/zhy/autolayout/attr/HeightAttr.java b/autolayout/src/main/java/com/zhy/autolayout/attr/HeightAttr.java
index 3f3149d..c754c90 100644
--- a/autolayout/src/main/java/com/zhy/autolayout/attr/HeightAttr.java
+++ b/autolayout/src/main/java/com/zhy/autolayout/attr/HeightAttr.java
@@ -31,4 +31,24 @@ protected void execute(View view, int val)
ViewGroup.LayoutParams lp = view.getLayoutParams();
lp.height = val;
}
+
+ public static HeightAttr generate(int val, int baseFlag)
+ {
+ HeightAttr heightAttr = null;
+ switch (baseFlag)
+ {
+ case AutoAttr.BASE_WIDTH:
+ heightAttr = new HeightAttr(val, Attrs.HEIGHT, 0);
+ break;
+ case AutoAttr.BASE_HEIGHT:
+ heightAttr = new HeightAttr(val, 0, Attrs.HEIGHT);
+ break;
+ case AutoAttr.BASE_DEFAULT:
+ heightAttr = new HeightAttr(val, 0, 0);
+ break;
+ }
+ return heightAttr;
+ }
+
+
}
diff --git a/autolayout/src/main/java/com/zhy/autolayout/attr/MarginAttr.java b/autolayout/src/main/java/com/zhy/autolayout/attr/MarginAttr.java
index 82377ee..8769fbe 100644
--- a/autolayout/src/main/java/com/zhy/autolayout/attr/MarginAttr.java
+++ b/autolayout/src/main/java/com/zhy/autolayout/attr/MarginAttr.java
@@ -47,6 +47,6 @@ protected void execute(View view, int val)
{
ViewGroup.MarginLayoutParams lp = (ViewGroup.MarginLayoutParams) view.getLayoutParams();
lp.leftMargin = lp.rightMargin = lp.topMargin = lp.bottomMargin = val;
-
}
+
}
diff --git a/autolayout/src/main/java/com/zhy/autolayout/attr/MarginBottomAttr.java b/autolayout/src/main/java/com/zhy/autolayout/attr/MarginBottomAttr.java
index 9a0bea2..7d78272 100644
--- a/autolayout/src/main/java/com/zhy/autolayout/attr/MarginBottomAttr.java
+++ b/autolayout/src/main/java/com/zhy/autolayout/attr/MarginBottomAttr.java
@@ -35,4 +35,22 @@ protected void execute(View view, int val)
ViewGroup.MarginLayoutParams lp = (ViewGroup.MarginLayoutParams) view.getLayoutParams();
lp.bottomMargin = val;
}
+
+ public static MarginBottomAttr generate(int val, int baseFlag)
+ {
+ MarginBottomAttr attr = null;
+ switch (baseFlag)
+ {
+ case AutoAttr.BASE_WIDTH:
+ attr = new MarginBottomAttr(val, Attrs.MARGIN_BOTTOM, 0);
+ break;
+ case AutoAttr.BASE_HEIGHT:
+ attr = new MarginBottomAttr(val, 0, Attrs.MARGIN_BOTTOM);
+ break;
+ case AutoAttr.BASE_DEFAULT:
+ attr = new MarginBottomAttr(val, 0, 0);
+ break;
+ }
+ return attr;
+ }
}
diff --git a/autolayout/src/main/java/com/zhy/autolayout/attr/MarginLeftAttr.java b/autolayout/src/main/java/com/zhy/autolayout/attr/MarginLeftAttr.java
index 8f3d58a..4bc5feb 100644
--- a/autolayout/src/main/java/com/zhy/autolayout/attr/MarginLeftAttr.java
+++ b/autolayout/src/main/java/com/zhy/autolayout/attr/MarginLeftAttr.java
@@ -28,11 +28,29 @@ protected boolean defaultBaseWidth()
@Override
protected void execute(View view, int val)
{
- if(!(view.getLayoutParams() instanceof ViewGroup.MarginLayoutParams))
+ if (!(view.getLayoutParams() instanceof ViewGroup.MarginLayoutParams))
{
- return ;
+ return;
}
ViewGroup.MarginLayoutParams lp = (ViewGroup.MarginLayoutParams) view.getLayoutParams();
lp.leftMargin = val;
}
+
+ public static MarginLeftAttr generate(int val, int baseFlag)
+ {
+ MarginLeftAttr attr = null;
+ switch (baseFlag)
+ {
+ case AutoAttr.BASE_WIDTH:
+ attr = new MarginLeftAttr(val, Attrs.MARGIN_LEFT, 0);
+ break;
+ case AutoAttr.BASE_HEIGHT:
+ attr = new MarginLeftAttr(val, 0, Attrs.MARGIN_LEFT);
+ break;
+ case AutoAttr.BASE_DEFAULT:
+ attr = new MarginLeftAttr(val, 0, 0);
+ break;
+ }
+ return attr;
+ }
}
diff --git a/autolayout/src/main/java/com/zhy/autolayout/attr/MarginRightAttr.java b/autolayout/src/main/java/com/zhy/autolayout/attr/MarginRightAttr.java
index a04554a..4f80198 100644
--- a/autolayout/src/main/java/com/zhy/autolayout/attr/MarginRightAttr.java
+++ b/autolayout/src/main/java/com/zhy/autolayout/attr/MarginRightAttr.java
@@ -28,11 +28,30 @@ protected boolean defaultBaseWidth()
@Override
protected void execute(View view, int val)
{
- if(!(view.getLayoutParams() instanceof ViewGroup.MarginLayoutParams))
+ if (!(view.getLayoutParams() instanceof ViewGroup.MarginLayoutParams))
{
- return ;
+ return;
}
ViewGroup.MarginLayoutParams lp = (ViewGroup.MarginLayoutParams) view.getLayoutParams();
lp.rightMargin = val;
}
+
+
+ public static MarginRightAttr generate(int val, int baseFlag)
+ {
+ MarginRightAttr attr = null;
+ switch (baseFlag)
+ {
+ case AutoAttr.BASE_WIDTH:
+ attr = new MarginRightAttr(val, Attrs.MARGIN_RIGHT, 0);
+ break;
+ case AutoAttr.BASE_HEIGHT:
+ attr = new MarginRightAttr(val, 0, Attrs.MARGIN_RIGHT);
+ break;
+ case AutoAttr.BASE_DEFAULT:
+ attr = new MarginRightAttr(val, 0, 0);
+ break;
+ }
+ return attr;
+ }
}
diff --git a/autolayout/src/main/java/com/zhy/autolayout/attr/MarginTopAttr.java b/autolayout/src/main/java/com/zhy/autolayout/attr/MarginTopAttr.java
index 30ca451..d0821b5 100644
--- a/autolayout/src/main/java/com/zhy/autolayout/attr/MarginTopAttr.java
+++ b/autolayout/src/main/java/com/zhy/autolayout/attr/MarginTopAttr.java
@@ -28,11 +28,31 @@ protected boolean defaultBaseWidth()
@Override
protected void execute(View view, int val)
{
- if(!(view.getLayoutParams() instanceof ViewGroup.MarginLayoutParams))
+ if (!(view.getLayoutParams() instanceof ViewGroup.MarginLayoutParams))
{
- return ;
+ return;
}
ViewGroup.MarginLayoutParams lp = (ViewGroup.MarginLayoutParams) view.getLayoutParams();
lp.topMargin = val;
+
+ }
+
+
+ public static MarginTopAttr generate(int val, int baseFlag)
+ {
+ MarginTopAttr attr = null;
+ switch (baseFlag)
+ {
+ case AutoAttr.BASE_WIDTH:
+ attr = new MarginTopAttr(val, Attrs.MARGIN_TOP, 0);
+ break;
+ case AutoAttr.BASE_HEIGHT:
+ attr = new MarginTopAttr(val, 0, Attrs.MARGIN_TOP);
+ break;
+ case AutoAttr.BASE_DEFAULT:
+ attr = new MarginTopAttr(val, 0, 0);
+ break;
+ }
+ return attr;
}
}
diff --git a/autolayout/src/main/java/com/zhy/autolayout/attr/MaxHeightAttr.java b/autolayout/src/main/java/com/zhy/autolayout/attr/MaxHeightAttr.java
new file mode 100644
index 0000000..9af66af
--- /dev/null
+++ b/autolayout/src/main/java/com/zhy/autolayout/attr/MaxHeightAttr.java
@@ -0,0 +1,70 @@
+package com.zhy.autolayout.attr;
+
+import android.view.View;
+
+import java.lang.reflect.Method;
+
+/**
+ * Created by zhy on 15/12/24.
+ */
+public class MaxHeightAttr extends AutoAttr
+{
+ public MaxHeightAttr(int pxVal, int baseWidth, int baseHeight)
+ {
+ super(pxVal, baseWidth, baseHeight);
+ }
+
+ @Override
+ protected int attrVal()
+ {
+ return Attrs.MAX_HEIGHT;
+ }
+
+ @Override
+ protected boolean defaultBaseWidth()
+ {
+ return false;
+ }
+
+ @Override
+ protected void execute(View view, int val)
+ {
+ try
+ {
+ Method setMaxWidthMethod = view.getClass().getMethod("setMaxHeight", int.class);
+ setMaxWidthMethod.invoke(view, val);
+ } catch (Exception ignore)
+ {
+ }
+ }
+
+ public static MaxHeightAttr generate(int val, int baseFlag)
+ {
+ MaxHeightAttr attr = null;
+ switch (baseFlag)
+ {
+ case AutoAttr.BASE_WIDTH:
+ attr = new MaxHeightAttr(val, Attrs.MAX_HEIGHT, 0);
+ break;
+ case AutoAttr.BASE_HEIGHT:
+ attr = new MaxHeightAttr(val, 0, Attrs.MAX_HEIGHT);
+ break;
+ case AutoAttr.BASE_DEFAULT:
+ attr = new MaxHeightAttr(val, 0, 0);
+ break;
+ }
+ return attr;
+ }
+
+ public static int getMaxHeight(View view)
+ {
+ try
+ {
+ Method setMaxWidthMethod = view.getClass().getMethod("getMaxHeight");
+ return (int) setMaxWidthMethod.invoke(view);
+ } catch (Exception ignore)
+ {
+ }
+ return 0;
+ }
+}
diff --git a/autolayout/src/main/java/com/zhy/autolayout/attr/MaxWidthAttr.java b/autolayout/src/main/java/com/zhy/autolayout/attr/MaxWidthAttr.java
new file mode 100644
index 0000000..51a4a95
--- /dev/null
+++ b/autolayout/src/main/java/com/zhy/autolayout/attr/MaxWidthAttr.java
@@ -0,0 +1,70 @@
+package com.zhy.autolayout.attr;
+
+import android.view.View;
+
+import java.lang.reflect.Method;
+
+/**
+ * Created by zhy on 15/12/24.
+ */
+public class MaxWidthAttr extends AutoAttr
+{
+ public MaxWidthAttr(int pxVal, int baseWidth, int baseHeight)
+ {
+ super(pxVal, baseWidth, baseHeight);
+ }
+
+ @Override
+ protected int attrVal()
+ {
+ return Attrs.MAX_WIDTH;
+ }
+
+ @Override
+ protected boolean defaultBaseWidth()
+ {
+ return true;
+ }
+
+ @Override
+ protected void execute(View view, int val)
+ {
+ try
+ {
+ Method setMaxWidthMethod = view.getClass().getMethod("setMaxWidth", int.class);
+ setMaxWidthMethod.invoke(view, val);
+ } catch (Exception ignore)
+ {
+ }
+ }
+
+ public static MaxWidthAttr generate(int val, int baseFlag)
+ {
+ MaxWidthAttr attr = null;
+ switch (baseFlag)
+ {
+ case AutoAttr.BASE_WIDTH:
+ attr = new MaxWidthAttr(val, Attrs.MAX_WIDTH, 0);
+ break;
+ case AutoAttr.BASE_HEIGHT:
+ attr = new MaxWidthAttr(val, 0, Attrs.MAX_WIDTH);
+ break;
+ case AutoAttr.BASE_DEFAULT:
+ attr = new MaxWidthAttr(val, 0, 0);
+ break;
+ }
+ return attr;
+ }
+
+ public static int getMaxWidth(View view)
+ {
+ try
+ {
+ Method setMaxWidthMethod = view.getClass().getMethod("getMaxWidth");
+ return (int) setMaxWidthMethod.invoke(view);
+ } catch (Exception ignore)
+ {
+ }
+ return 0;
+ }
+}
diff --git a/autolayout/src/main/java/com/zhy/autolayout/attr/MinHeightAttr.java b/autolayout/src/main/java/com/zhy/autolayout/attr/MinHeightAttr.java
new file mode 100644
index 0000000..4b271bb
--- /dev/null
+++ b/autolayout/src/main/java/com/zhy/autolayout/attr/MinHeightAttr.java
@@ -0,0 +1,81 @@
+package com.zhy.autolayout.attr;
+
+import android.os.Build;
+import android.view.View;
+
+import java.lang.reflect.Field;
+
+/**
+ * Created by zhy on 15/12/24.
+ */
+public class MinHeightAttr extends AutoAttr
+{
+ public MinHeightAttr(int pxVal, int baseWidth, int baseHeight)
+ {
+ super(pxVal, baseWidth, baseHeight);
+ }
+
+ @Override
+ protected int attrVal()
+ {
+ return Attrs.MIN_HEIGHT;
+ }
+
+ @Override
+ protected boolean defaultBaseWidth()
+ {
+ return false;
+ }
+
+ @Override
+ protected void execute(View view, int val)
+ {
+ try
+ {
+ view.setMinimumHeight(val);
+// Method setMaxWidthMethod = view.getClass().getMethod("setMinHeight", int.class);
+// setMaxWidthMethod.invoke(view, val);
+ } catch (Exception ignore)
+ {
+ }
+ }
+
+ public static MinHeightAttr generate(int val, int baseFlag)
+ {
+ MinHeightAttr attr = null;
+ switch (baseFlag)
+ {
+ case AutoAttr.BASE_WIDTH:
+ attr = new MinHeightAttr(val, Attrs.MIN_HEIGHT, 0);
+ break;
+ case AutoAttr.BASE_HEIGHT:
+ attr = new MinHeightAttr(val, 0, Attrs.MIN_HEIGHT);
+ break;
+ case AutoAttr.BASE_DEFAULT:
+ attr = new MinHeightAttr(val, 0, 0);
+ break;
+ }
+ return attr;
+ }
+
+ public static int getMinHeight(View view)
+ {
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN)
+ {
+ return view.getMinimumHeight();
+ } else
+ {
+ try
+ {
+ Field minHeight = view.getClass().getField("mMinHeight");
+ minHeight.setAccessible(true);
+ return (int) minHeight.get(view);
+ } catch (Exception e)
+ {
+ }
+ }
+
+ return 0;
+ }
+
+}
diff --git a/autolayout/src/main/java/com/zhy/autolayout/attr/MinWidthAttr.java b/autolayout/src/main/java/com/zhy/autolayout/attr/MinWidthAttr.java
new file mode 100644
index 0000000..438ef59
--- /dev/null
+++ b/autolayout/src/main/java/com/zhy/autolayout/attr/MinWidthAttr.java
@@ -0,0 +1,77 @@
+package com.zhy.autolayout.attr;
+
+import android.os.Build;
+import android.view.View;
+
+import java.lang.reflect.Field;
+
+/**
+ * Created by zhy on 15/12/24.
+ */
+public class MinWidthAttr extends AutoAttr
+{
+ public MinWidthAttr(int pxVal, int baseWidth, int baseHeight)
+ {
+ super(pxVal, baseWidth, baseHeight);
+ }
+
+ @Override
+ protected int attrVal()
+ {
+ return Attrs.MIN_WIDTH;
+ }
+
+ @Override
+ protected boolean defaultBaseWidth()
+ {
+ return true;
+ }
+
+ @Override
+ protected void execute(View view, int val)
+ {
+ try
+ {
+// Method setMaxWidthMethod = view.getClass().getMethod("setMinWidth", int.class);
+// setMaxWidthMethod.invoke(view, val);
+ } catch (Exception ignore)
+ {
+ }
+
+ view.setMinimumWidth(val);
+ }
+
+ public static int getMinWidth(View view)
+ {
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN)
+ return view.getMinimumWidth();
+ try
+ {
+ Field minWidth = view.getClass().getField("mMinWidth");
+ minWidth.setAccessible(true);
+ return (int) minWidth.get(view);
+ } catch (Exception ignore)
+ {
+ }
+ return 0;
+ }
+
+
+ public static MinWidthAttr generate(int val, int baseFlag)
+ {
+ MinWidthAttr attr = null;
+ switch (baseFlag)
+ {
+ case AutoAttr.BASE_WIDTH:
+ attr = new MinWidthAttr(val, Attrs.MIN_WIDTH, 0);
+ break;
+ case AutoAttr.BASE_HEIGHT:
+ attr = new MinWidthAttr(val, 0, Attrs.MIN_WIDTH);
+ break;
+ case AutoAttr.BASE_DEFAULT:
+ attr = new MinWidthAttr(val, 0, 0);
+ break;
+ }
+ return attr;
+ }
+}
diff --git a/autolayout/src/main/java/com/zhy/autolayout/attr/PaddingAttr.java b/autolayout/src/main/java/com/zhy/autolayout/attr/PaddingAttr.java
index 81ad869..b0869af 100644
--- a/autolayout/src/main/java/com/zhy/autolayout/attr/PaddingAttr.java
+++ b/autolayout/src/main/java/com/zhy/autolayout/attr/PaddingAttr.java
@@ -43,4 +43,7 @@ protected void execute(View view, int val)
{
view.setPadding(val, val, val, val);
}
+
+
+
}
diff --git a/autolayout/src/main/java/com/zhy/autolayout/attr/PaddingBottomAttr.java b/autolayout/src/main/java/com/zhy/autolayout/attr/PaddingBottomAttr.java
index 7ca1eb9..cbb4af9 100644
--- a/autolayout/src/main/java/com/zhy/autolayout/attr/PaddingBottomAttr.java
+++ b/autolayout/src/main/java/com/zhy/autolayout/attr/PaddingBottomAttr.java
@@ -34,4 +34,23 @@ protected void execute(View view, int val)
view.setPadding(l, t, r, b);
}
+
+
+ public static PaddingBottomAttr generate(int val, int baseFlag)
+ {
+ PaddingBottomAttr attr = null;
+ switch (baseFlag)
+ {
+ case AutoAttr.BASE_WIDTH:
+ attr = new PaddingBottomAttr(val, Attrs.PADDING_BOTTOM, 0);
+ break;
+ case AutoAttr.BASE_HEIGHT:
+ attr = new PaddingBottomAttr(val, 0, Attrs.PADDING_BOTTOM);
+ break;
+ case AutoAttr.BASE_DEFAULT:
+ attr = new PaddingBottomAttr(val, 0, 0);
+ break;
+ }
+ return attr;
+ }
}
diff --git a/autolayout/src/main/java/com/zhy/autolayout/attr/PaddingLeftAttr.java b/autolayout/src/main/java/com/zhy/autolayout/attr/PaddingLeftAttr.java
index 344f2ef..960fbd2 100644
--- a/autolayout/src/main/java/com/zhy/autolayout/attr/PaddingLeftAttr.java
+++ b/autolayout/src/main/java/com/zhy/autolayout/attr/PaddingLeftAttr.java
@@ -34,4 +34,23 @@ protected void execute(View view, int val)
view.setPadding(l, t, r, b);
}
+
+
+ public static PaddingLeftAttr generate(int val, int baseFlag)
+ {
+ PaddingLeftAttr attr = null;
+ switch (baseFlag)
+ {
+ case AutoAttr.BASE_WIDTH:
+ attr = new PaddingLeftAttr(val, Attrs.PADDING_LEFT, 0);
+ break;
+ case AutoAttr.BASE_HEIGHT:
+ attr = new PaddingLeftAttr(val, 0, Attrs.PADDING_LEFT);
+ break;
+ case AutoAttr.BASE_DEFAULT:
+ attr = new PaddingLeftAttr(val, 0, 0);
+ break;
+ }
+ return attr;
+ }
}
diff --git a/autolayout/src/main/java/com/zhy/autolayout/attr/PaddingRightAttr.java b/autolayout/src/main/java/com/zhy/autolayout/attr/PaddingRightAttr.java
index 81d1eee..a7db5a9 100644
--- a/autolayout/src/main/java/com/zhy/autolayout/attr/PaddingRightAttr.java
+++ b/autolayout/src/main/java/com/zhy/autolayout/attr/PaddingRightAttr.java
@@ -34,4 +34,23 @@ protected void execute(View view, int val)
view.setPadding(l, t, r, b);
}
+
+
+ public static PaddingRightAttr generate(int val, int baseFlag)
+ {
+ PaddingRightAttr attr = null;
+ switch (baseFlag)
+ {
+ case AutoAttr.BASE_WIDTH:
+ attr = new PaddingRightAttr(val, Attrs.PADDING_RIGHT, 0);
+ break;
+ case AutoAttr.BASE_HEIGHT:
+ attr = new PaddingRightAttr(val, 0, Attrs.PADDING_RIGHT);
+ break;
+ case AutoAttr.BASE_DEFAULT:
+ attr = new PaddingRightAttr(val, 0, 0);
+ break;
+ }
+ return attr;
+ }
}
diff --git a/autolayout/src/main/java/com/zhy/autolayout/attr/PaddingTopAttr.java b/autolayout/src/main/java/com/zhy/autolayout/attr/PaddingTopAttr.java
index 0c58761..d8a5e15 100644
--- a/autolayout/src/main/java/com/zhy/autolayout/attr/PaddingTopAttr.java
+++ b/autolayout/src/main/java/com/zhy/autolayout/attr/PaddingTopAttr.java
@@ -32,6 +32,23 @@ protected void execute(View view, int val)
int r = view.getPaddingRight();
int b = view.getPaddingBottom();
view.setPadding(l, t, r, b);
+ }
+ public static PaddingTopAttr generate(int val, int baseFlag)
+ {
+ PaddingTopAttr attr = null;
+ switch (baseFlag)
+ {
+ case AutoAttr.BASE_WIDTH:
+ attr = new PaddingTopAttr(val, Attrs.PADDING_TOP, 0);
+ break;
+ case AutoAttr.BASE_HEIGHT:
+ attr = new PaddingTopAttr(val, 0, Attrs.PADDING_TOP);
+ break;
+ case AutoAttr.BASE_DEFAULT:
+ attr = new PaddingTopAttr(val, 0, 0);
+ break;
+ }
+ return attr;
}
}
diff --git a/autolayout/src/main/java/com/zhy/autolayout/attr/TextSizeAttr.java b/autolayout/src/main/java/com/zhy/autolayout/attr/TextSizeAttr.java
index dd9df4c..bb4e2a5 100644
--- a/autolayout/src/main/java/com/zhy/autolayout/attr/TextSizeAttr.java
+++ b/autolayout/src/main/java/com/zhy/autolayout/attr/TextSizeAttr.java
@@ -36,5 +36,23 @@ protected void execute(View view, int val)
((TextView) view).setTextSize(TypedValue.COMPLEX_UNIT_PX, val);
}
+ public static TextSizeAttr generate(int val, int baseFlag)
+ {
+ TextSizeAttr attr = null;
+ switch (baseFlag)
+ {
+ case AutoAttr.BASE_WIDTH:
+ attr = new TextSizeAttr(val, Attrs.TEXTSIZE, 0);
+ break;
+ case AutoAttr.BASE_HEIGHT:
+ attr = new TextSizeAttr(val, 0, Attrs.TEXTSIZE);
+ break;
+ case AutoAttr.BASE_DEFAULT:
+ attr = new TextSizeAttr(val, 0, 0);
+ break;
+ }
+ return attr;
+ }
+
}
diff --git a/autolayout/src/main/java/com/zhy/autolayout/attr/WidthAttr.java b/autolayout/src/main/java/com/zhy/autolayout/attr/WidthAttr.java
index 06e9b78..2de66c9 100644
--- a/autolayout/src/main/java/com/zhy/autolayout/attr/WidthAttr.java
+++ b/autolayout/src/main/java/com/zhy/autolayout/attr/WidthAttr.java
@@ -32,4 +32,22 @@ protected void execute(View view, int val)
lp.width = val;
}
+ public static WidthAttr generate(int val, int baseFlag)
+ {
+ WidthAttr widthAttr = null;
+ switch (baseFlag)
+ {
+ case AutoAttr.BASE_WIDTH:
+ widthAttr = new WidthAttr(val, Attrs.WIDTH, 0);
+ break;
+ case AutoAttr.BASE_HEIGHT:
+ widthAttr = new WidthAttr(val, 0, Attrs.WIDTH);
+ break;
+ case AutoAttr.BASE_DEFAULT:
+ widthAttr = new WidthAttr(val, 0, 0);
+ break;
+ }
+ return widthAttr;
+ }
+
}
diff --git a/autolayout/src/main/java/com/zhy/autolayout/config/AutoLayoutConifg.java b/autolayout/src/main/java/com/zhy/autolayout/config/AutoLayoutConifg.java
index 1ddcc9f..3261b67 100644
--- a/autolayout/src/main/java/com/zhy/autolayout/config/AutoLayoutConifg.java
+++ b/autolayout/src/main/java/com/zhy/autolayout/config/AutoLayoutConifg.java
@@ -25,6 +25,8 @@ public class AutoLayoutConifg
private int mDesignWidth;
private int mDesignHeight;
+ private boolean useDeviceSize;
+
private AutoLayoutConifg()
{
@@ -32,13 +34,19 @@ private AutoLayoutConifg()
public void checkParams()
{
- if(mDesignHeight <=0 || mDesignWidth <= 0 )
+ if (mDesignHeight <= 0 || mDesignWidth <= 0)
{
throw new RuntimeException(
"you must set " + KEY_DESIGN_WIDTH + " and " + KEY_DESIGN_HEIGHT + " in your manifest file.");
}
}
+ public AutoLayoutConifg useDeviceSize()
+ {
+ useDeviceSize = true;
+ return this;
+ }
+
public static AutoLayoutConifg getInstance()
{
@@ -71,7 +79,7 @@ public void init(Context context)
{
getMetaData(context);
- int[] screenSize = ScreenUtils.getScreenSize(context);
+ int[] screenSize = ScreenUtils.getScreenSize(context, useDeviceSize);
mScreenWidth = screenSize[0];
mScreenHeight = screenSize[1];
L.e(" screenWidth =" + mScreenWidth + " ,screenHeight = " + mScreenHeight);
diff --git a/autolayout/src/main/java/com/zhy/autolayout/utils/AutoLayoutHelper.java b/autolayout/src/main/java/com/zhy/autolayout/utils/AutoLayoutHelper.java
index 666d6f4..9ac666e 100644
--- a/autolayout/src/main/java/com/zhy/autolayout/utils/AutoLayoutHelper.java
+++ b/autolayout/src/main/java/com/zhy/autolayout/utils/AutoLayoutHelper.java
@@ -30,6 +30,10 @@
import com.zhy.autolayout.attr.MarginLeftAttr;
import com.zhy.autolayout.attr.MarginRightAttr;
import com.zhy.autolayout.attr.MarginTopAttr;
+import com.zhy.autolayout.attr.MaxHeightAttr;
+import com.zhy.autolayout.attr.MaxWidthAttr;
+import com.zhy.autolayout.attr.MinHeightAttr;
+import com.zhy.autolayout.attr.MinWidthAttr;
import com.zhy.autolayout.attr.PaddingAttr;
import com.zhy.autolayout.attr.PaddingBottomAttr;
import com.zhy.autolayout.attr.PaddingLeftAttr;
@@ -58,6 +62,11 @@ public class AutoLayoutHelper
android.R.attr.layout_marginTop,//
android.R.attr.layout_marginRight,//
android.R.attr.layout_marginBottom,//
+ android.R.attr.maxWidth,//
+ android.R.attr.maxHeight,//
+ android.R.attr.minWidth,//
+ android.R.attr.minHeight,//16843072
+
};
@@ -74,6 +83,11 @@ public class AutoLayoutHelper
private static final int INDEX_MARGIN_TOP = 10;
private static final int INDEX_MARGIN_RIGHT = 11;
private static final int INDEX_MARGIN_BOTTOM = 12;
+ private static final int INDEX_MAX_WIDTH = 13;
+ private static final int INDEX_MAX_HEIGHT = 14;
+ private static final int INDEX_MIN_WIDTH = 15;
+ private static final int INDEX_MIN_HEIGHT = 16;
+
/**
* move to other place?
@@ -139,9 +153,10 @@ public static AutoLayoutInfo getAutoLayoutInfo(Context context,
for (int i = 0; i < n; i++)
{
int index = array.getIndex(i);
- String val = array.getString(index);
+// String val = array.getString(index);
+// if (!isPxVal(val)) continue;
- if (!isPxVal(val)) continue;
+ if (!DimenUtils.isPxVal(array.peekValue(index))) continue;
int pxVal = 0;
try
@@ -192,7 +207,18 @@ public static AutoLayoutInfo getAutoLayoutInfo(Context context,
case INDEX_MARGIN_BOTTOM:
info.addAttr(new MarginBottomAttr(pxVal, baseWidth, baseHeight));
break;
-
+ case INDEX_MAX_WIDTH:
+ info.addAttr(new MaxWidthAttr(pxVal, baseWidth, baseHeight));
+ break;
+ case INDEX_MAX_HEIGHT:
+ info.addAttr(new MaxHeightAttr(pxVal, baseWidth, baseHeight));
+ break;
+ case INDEX_MIN_WIDTH:
+ info.addAttr(new MinWidthAttr(pxVal, baseWidth, baseHeight));
+ break;
+ case INDEX_MIN_HEIGHT:
+ info.addAttr(new MinHeightAttr(pxVal, baseWidth, baseHeight));
+ break;
}
}
array.recycle();
@@ -200,15 +226,6 @@ public static AutoLayoutInfo getAutoLayoutInfo(Context context,
return info;
}
- private static boolean isPxVal(String val)
- {
- if (val.endsWith("px"))
- {
- return true;
- }
- return false;
- }
-
public interface AutoLayoutParams
{
AutoLayoutInfo getAutoLayoutInfo();
diff --git a/autolayout/src/main/java/com/zhy/autolayout/utils/AutoUtils.java b/autolayout/src/main/java/com/zhy/autolayout/utils/AutoUtils.java
index 210c74b..1252648 100644
--- a/autolayout/src/main/java/com/zhy/autolayout/utils/AutoUtils.java
+++ b/autolayout/src/main/java/com/zhy/autolayout/utils/AutoUtils.java
@@ -1,9 +1,11 @@
package com.zhy.autolayout.utils;
import android.view.View;
-import android.view.ViewGroup;
+import com.zhy.autolayout.AutoLayoutInfo;
import com.zhy.autolayout.R;
+import com.zhy.autolayout.attr.Attrs;
+import com.zhy.autolayout.attr.AutoAttr;
import com.zhy.autolayout.config.AutoLayoutConifg;
/**
@@ -22,82 +24,121 @@ public static void auto(View view)
autoSize(view);
autoPadding(view);
autoMargin(view);
+ autoTextSize(view, AutoAttr.BASE_DEFAULT);
}
- public static void autoMargin(View view)
+ /**
+ * @param view
+ * @param attrs #Attrs.WIDTH|Attrs.HEIGHT
+ * @param base AutoAttr.BASE_WIDTH|AutoAttr.BASE_HEIGHT|AutoAttr.BASE_DEFAULT
+ */
+ public static void auto(View view, int attrs, int base)
{
- if (!(view.getLayoutParams() instanceof ViewGroup.MarginLayoutParams))
- return;
+ AutoLayoutInfo autoLayoutInfo = AutoLayoutInfo.getAttrFromView(view, attrs, base);
+ if (autoLayoutInfo != null)
+ autoLayoutInfo.fillAttrs(view);
+ }
- ViewGroup.MarginLayoutParams lp = (ViewGroup.MarginLayoutParams) view.getLayoutParams();
- if(lp == null)return ;
+ public static void autoTextSize(View view)
+ {
+ auto(view, Attrs.TEXTSIZE, AutoAttr.BASE_DEFAULT);
+ }
- Object tag = view.getTag(R.id.id_tag_autolayout_margin);
- if (tag != null) return;
- view.setTag(R.id.id_tag_autolayout_margin, "Just Identify");
+ public static void autoTextSize(View view, int base)
+ {
+ auto(view, Attrs.TEXTSIZE, base);
+ }
- lp.leftMargin = getPercentWidthSize(lp.leftMargin);
- lp.topMargin = getPercentHeightSize(lp.topMargin);
- lp.rightMargin = getPercentWidthSize(lp.rightMargin);
- lp.bottomMargin = getPercentHeightSize(lp.bottomMargin);
+ public static void autoMargin(View view)
+ {
+ auto(view, Attrs.MARGIN, AutoAttr.BASE_DEFAULT);
+ }
+ public static void autoMargin(View view, int base)
+ {
+ auto(view, Attrs.MARGIN, base);
}
public static void autoPadding(View view)
{
- Object tag = view.getTag(R.id.id_tag_autolayout_padding);
- if (tag != null) return;
- view.setTag(R.id.id_tag_autolayout_padding, "Just Identify");
-
- int l = view.getPaddingLeft();
- int t = view.getPaddingTop();
- int r = view.getPaddingRight();
- int b = view.getPaddingBottom();
-
- l = getPercentWidthSize(l);
- t = getPercentHeightSize(t);
- r = getPercentWidthSize(r);
- b = getPercentHeightSize(b);
+ auto(view, Attrs.PADDING, AutoAttr.BASE_DEFAULT);
+ }
- view.setPadding(l, t, r, b);
+ public static void autoPadding(View view, int base)
+ {
+ auto(view, Attrs.PADDING, base);
}
public static void autoSize(View view)
{
- ViewGroup.LayoutParams lp = view.getLayoutParams();
+ auto(view, Attrs.WIDTH | Attrs.HEIGHT, AutoAttr.BASE_DEFAULT);
+ }
- if (lp == null) return;
+ public static void autoSize(View view, int base)
+ {
+ auto(view, Attrs.WIDTH | Attrs.HEIGHT, base);
+ }
+ public static boolean autoed(View view)
+ {
Object tag = view.getTag(R.id.id_tag_autolayout_size);
- if (tag != null) return;
-
+ if (tag != null) return true;
view.setTag(R.id.id_tag_autolayout_size, "Just Identify");
+ return false;
+ }
- if(lp.width>0)
- {
- int screenWidth = AutoLayoutConifg.getInstance().getScreenWidth();
- int designWidth = AutoLayoutConifg.getInstance().getDesignWidth();
- lp.width = (int) (lp.width * 1.0f / designWidth * screenWidth);
- }
-
- if(lp.height>0)
- {
- int screenHeight = AutoLayoutConifg.getInstance().getScreenHeight();
- int designHeight = AutoLayoutConifg.getInstance().getDesignHeight();
- lp.height = (int) (lp.height * 1.0f / designHeight * screenHeight);
- }
-
+ public static float getPercentWidth1px()
+ {
+ int screenWidth = AutoLayoutConifg.getInstance().getScreenWidth();
+ int designWidth = AutoLayoutConifg.getInstance().getDesignWidth();
+ return 1.0f * screenWidth / designWidth;
+ }
+ public static float getPercentHeight1px()
+ {
+ int screenHeight = AutoLayoutConifg.getInstance().getScreenHeight();
+ int designHeight = AutoLayoutConifg.getInstance().getDesignHeight();
+ return 1.0f * screenHeight / designHeight;
+ }
+ public static int getPercentWidthSize(int val)
+ {
+ int screenWidth = AutoLayoutConifg.getInstance().getScreenWidth();
+ int designWidth = AutoLayoutConifg.getInstance().getDesignWidth();
+ return (int) (val * 1.0f / designWidth * screenWidth);
}
- public static int getPercentWidthSize(int val)
+
+ public static int getPercentWidthSizeBigger(int val)
{
int screenWidth = AutoLayoutConifg.getInstance().getScreenWidth();
int designWidth = AutoLayoutConifg.getInstance().getDesignWidth();
- return (int) (val * 1.0f / designWidth * screenWidth);
+ int res = val * screenWidth;
+ if (res % designWidth == 0)
+ {
+ return res / designWidth;
+ } else
+ {
+ return res / designWidth + 1;
+ }
+
+ }
+
+ public static int getPercentHeightSizeBigger(int val)
+ {
+ int screenHeight = AutoLayoutConifg.getInstance().getScreenHeight();
+ int designHeight = AutoLayoutConifg.getInstance().getDesignHeight();
+
+ int res = val * screenHeight;
+ if (res % designHeight == 0)
+ {
+ return res / designHeight;
+ } else
+ {
+ return res / designHeight + 1;
+ }
}
public static int getPercentHeightSize(int val)
diff --git a/autolayout/src/main/java/com/zhy/autolayout/utils/DimenUtils.java b/autolayout/src/main/java/com/zhy/autolayout/utils/DimenUtils.java
new file mode 100644
index 0000000..a055670
--- /dev/null
+++ b/autolayout/src/main/java/com/zhy/autolayout/utils/DimenUtils.java
@@ -0,0 +1,24 @@
+package com.zhy.autolayout.utils;
+
+import android.util.TypedValue;
+
+/**
+ * Created by zhy on 16/3/3.
+ */
+public class DimenUtils
+{
+ private static int getComplexUnit(int data)
+ {
+ return TypedValue.COMPLEX_UNIT_MASK & (data >> TypedValue.COMPLEX_UNIT_SHIFT);
+ }
+
+ public static boolean isPxVal(TypedValue val)
+ {
+ if (val != null && val.type == TypedValue.TYPE_DIMENSION &&
+ getComplexUnit(val.data) == TypedValue.COMPLEX_UNIT_PX)
+ {
+ return true;
+ }
+ return false;
+ }
+}
diff --git a/autolayout/src/main/java/com/zhy/autolayout/utils/ScreenUtils.java b/autolayout/src/main/java/com/zhy/autolayout/utils/ScreenUtils.java
index f6064f8..d7db439 100644
--- a/autolayout/src/main/java/com/zhy/autolayout/utils/ScreenUtils.java
+++ b/autolayout/src/main/java/com/zhy/autolayout/utils/ScreenUtils.java
@@ -1,6 +1,7 @@
package com.zhy.autolayout.utils;
import android.content.Context;
+import android.content.res.Resources;
import android.graphics.Point;
import android.os.Build;
import android.util.DisplayMetrics;
@@ -13,7 +14,26 @@
*/
public class ScreenUtils
{
- public static int[] getScreenSize(Context context)
+
+ public static int getStatusBarHeight(Context context)
+ {
+ int result = 0;
+ try
+ {
+ int resourceId = context.getResources().getIdentifier("status_bar_height", "dimen", "android");
+ if (resourceId > 0)
+ {
+ result = context.getResources().getDimensionPixelSize(resourceId);
+ }
+ } catch (Resources.NotFoundException e)
+ {
+ e.printStackTrace();
+ }
+ return result;
+ }
+
+
+ public static int[] getScreenSize(Context context, boolean useDeviceSize)
{
int[] size = new int[2];
@@ -25,6 +45,15 @@ public static int[] getScreenSize(Context context)
// since SDK_INT = 1;
int widthPixels = metrics.widthPixels;
int heightPixels = metrics.heightPixels;
+
+ if (!useDeviceSize)
+ {
+ size[0] = widthPixels;
+ size[1] = heightPixels - getStatusBarHeight(context);
+
+ return size;
+ }
+
// includes window decorations (statusbar bar/menu bar)
if (Build.VERSION.SDK_INT >= 14 && Build.VERSION.SDK_INT < 17)
try
diff --git a/autolayout/src/main/java/com/zhy/autolayout/widget/MetroLayout.java b/autolayout/src/main/java/com/zhy/autolayout/widget/MetroLayout.java
new file mode 100644
index 0000000..44c732e
--- /dev/null
+++ b/autolayout/src/main/java/com/zhy/autolayout/widget/MetroLayout.java
@@ -0,0 +1,233 @@
+package com.zhy.autolayout.widget;
+
+import android.content.Context;
+import android.content.res.TypedArray;
+import android.graphics.Color;
+import android.util.AttributeSet;
+import android.view.View;
+import android.view.ViewGroup;
+
+import com.zhy.autolayout.AutoLayoutInfo;
+import com.zhy.autolayout.R;
+import com.zhy.autolayout.utils.AutoLayoutHelper;
+import com.zhy.autolayout.utils.AutoUtils;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Random;
+
+/**
+ * Created by zhy on 15/12/10.
+ *
+ * //do not use
+ */
+public class MetroLayout extends ViewGroup
+{
+
+ private final AutoLayoutHelper mHelper = new AutoLayoutHelper(this);
+
+ private static class MetroBlock
+ {
+ int left;
+ int top;
+ int width;
+ }
+
+ private List mAvailablePos = new ArrayList<>();
+ private int mDivider;
+
+ public MetroLayout(Context context, AttributeSet attrs)
+ {
+ super(context, attrs);
+ TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.MetroLayout);
+ mDivider = a.getDimensionPixelOffset(R.styleable.MetroLayout_metro_divider, 0);
+ mDivider = AutoUtils.getPercentWidthSizeBigger(mDivider);
+ a.recycle();
+
+ }
+
+ @Override
+ protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec)
+ {
+
+ if (true)
+ randomColor();
+
+ if (!isInEditMode())
+ mHelper.adjustChildren();
+
+ measureChildren(widthMeasureSpec, heightMeasureSpec);
+ super.onMeasure(widthMeasureSpec, heightMeasureSpec);
+
+ }
+
+ private void randomColor()
+ {
+ Random r = new Random(255);
+
+ for (int i = 0, n = getChildCount(); i < n; i++)
+ {
+ View v = getChildAt(i);
+
+ v.setBackgroundColor(Color.argb(100, r.nextInt(), r.nextInt(), r.nextInt()));
+ }
+ }
+
+
+ @Override
+ protected void onLayout(boolean changed, int l, int t, int r, int b)
+ {
+
+ initAvailablePosition();
+
+ int left = 0;
+ int top = 0;
+ int divider = mDivider;
+
+ for (int i = 0, n = getChildCount(); i < n; i++)
+ {
+ View v = getChildAt(i);
+ if (v.getVisibility() == View.GONE) continue;
+
+ MetroBlock newPos = findAvailablePos(v);
+ left = newPos.left;
+ top = newPos.top;
+
+ int childWidth = v.getMeasuredWidth();
+ int childHeight = v.getMeasuredHeight();
+
+ int right = left + childWidth;
+ int bottom = top + childHeight;
+
+ v.layout(left, top, right, bottom);
+
+ if (childWidth + divider < newPos.width)
+ {
+ newPos.left += childWidth + divider;
+ newPos.width -= childWidth + divider;
+ } else
+ {
+ mAvailablePos.remove(newPos);
+ }
+
+ MetroBlock p = new MetroBlock();
+ p.left = left;
+ p.top = bottom + divider;
+ p.width = childWidth;
+ mAvailablePos.add(p);
+
+ mergeAvailablePosition();
+
+ }
+ }
+
+ private void mergeAvailablePosition()
+ {
+ if (mAvailablePos.size() <= 1) return;
+
+ List needRemoveBlocks = new ArrayList<>();
+
+ MetroBlock one = mAvailablePos.get(0);
+ MetroBlock two = mAvailablePos.get(1);
+
+ for (int i = 1, n = mAvailablePos.size(); i < n - 1; i++)
+ {
+ if (one.top == two.top)
+ {
+ one.width = one.width + two.width;
+ needRemoveBlocks.add(one);
+ two.left = one.left;
+ two = mAvailablePos.get(i + 1);
+ } else
+ {
+ one = mAvailablePos.get(i);
+ two = mAvailablePos.get(i + 1);
+ }
+ }
+
+ mAvailablePos.removeAll(needRemoveBlocks);
+
+ }
+
+ private void initAvailablePosition()
+ {
+ mAvailablePos.clear();
+ MetroBlock first = new MetroBlock();
+ first.left = getPaddingLeft();
+ first.top = getPaddingTop();
+ first.width = getMeasuredWidth();
+ mAvailablePos.add(first);
+ }
+
+ private MetroBlock findAvailablePos(View view)
+ {
+ MetroBlock p = new MetroBlock();
+ if (mAvailablePos.size() == 0)
+ {
+ p.left = getPaddingLeft();
+ p.top = getPaddingTop();
+ p.width = getMeasuredWidth();
+ return p;
+ }
+ int min = mAvailablePos.get(0).top;
+ MetroBlock minHeightPos = mAvailablePos.get(0);
+ for (MetroBlock _p : mAvailablePos)
+ {
+ if (_p.top < min)
+ {
+ min = _p.top;
+ minHeightPos = _p;
+ }
+ }
+ return minHeightPos;
+ }
+
+
+ @Override
+ public MetroLayout.LayoutParams generateLayoutParams(AttributeSet attrs)
+ {
+ return new LayoutParams(getContext(), attrs);
+ }
+
+ public static class LayoutParams extends ViewGroup.MarginLayoutParams
+ 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)
+ {
+ super(source);
+ }
+
+ public LayoutParams(MarginLayoutParams source)
+ {
+ super(source);
+ }
+
+ public LayoutParams(LayoutParams source)
+ {
+ this((ViewGroup.LayoutParams) source);
+ mAutoLayoutInfo = source.mAutoLayoutInfo;
+ }
+
+ @Override
+ public AutoLayoutInfo getAutoLayoutInfo()
+ {
+ return mAutoLayoutInfo;
+ }
+
+
+ }
+
+}
diff --git a/autolayout/src/main/res/values/attrs.xml b/autolayout/src/main/res/values/attrs.xml
index 5a76ef7..c1d75c7 100644
--- a/autolayout/src/main/res/values/attrs.xml
+++ b/autolayout/src/main/res/values/attrs.xml
@@ -33,9 +33,18 @@
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/build.gradle b/build.gradle
index 5cfc154..c207088 100644
--- a/build.gradle
+++ b/build.gradle
@@ -8,9 +8,6 @@ buildscript {
classpath 'com.android.tools.build:gradle:1.2.3'
classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.0'
classpath 'com.github.dcendents:android-maven-plugin:1.2'
-
- // NOTE: Do not place your application dependencies here; they belong
- // in the individual module build.gradle files
}
}
diff --git a/sample/build.gradle b/sample/build.gradle
index 2d038fd..6fc8339 100644
--- a/sample/build.gradle
+++ b/sample/build.gradle
@@ -23,6 +23,8 @@ dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.android.support:appcompat-v7:23.1.0'
compile project(':autolayout')
+ compile 'com.zhy:base-adapter:2.0.2'
compile 'com.android.support:design:23.1.0'
compile 'com.android.support:cardview-v7:23.1.0'
+ compile 'com.android.support:recyclerview-v7:23.2.0'
}
diff --git a/sample/sample.iml b/sample/sample.iml
deleted file mode 100644
index 309a8ac..0000000
--- a/sample/sample.iml
+++ /dev/null
@@ -1,104 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- generateDebugAndroidTestSources
- generateDebugSources
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/sample/src/main/AndroidManifest.xml b/sample/src/main/AndroidManifest.xml
index f402dca..7e065bb 100644
--- a/sample/src/main/AndroidManifest.xml
+++ b/sample/src/main/AndroidManifest.xml
@@ -6,7 +6,6 @@
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
-
android:theme="@style/AppTheme" >
-
-
diff --git a/sample/src/main/java/com/zhy/sample/CategoryActivity.java b/sample/src/main/java/com/zhy/sample/CategoryActivity.java
index e6ecff0..54a4e76 100644
--- a/sample/src/main/java/com/zhy/sample/CategoryActivity.java
+++ b/sample/src/main/java/com/zhy/sample/CategoryActivity.java
@@ -1,5 +1,6 @@
package com.zhy.sample;
+import android.content.Context;
import android.os.Bundle;
import android.support.design.widget.TabLayout;
import android.support.v4.app.Fragment;
@@ -19,6 +20,12 @@ public class CategoryActivity extends AutoLayoutActivity
{"单个UI", "正方形"};
+ @Override
+ public Context getBaseContext()
+ {
+ return super.getBaseContext();
+ }
+
@Override
protected void onCreate(Bundle savedInstanceState)
{
@@ -55,5 +62,4 @@ public int getCount()
mTabLayout.setupWithViewPager(mViewPager);
}
-
}
diff --git a/sample/src/main/java/com/zhy/sample/MainActivity.java b/sample/src/main/java/com/zhy/sample/MainActivity.java
index fcf823a..953f3c9 100755
--- a/sample/src/main/java/com/zhy/sample/MainActivity.java
+++ b/sample/src/main/java/com/zhy/sample/MainActivity.java
@@ -7,12 +7,16 @@
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.view.ViewPager;
+import android.view.Menu;
import android.view.WindowManager;
import com.zhy.autolayout.AutoLayoutActivity;
import com.zhy.sample.fragment.ListFragment;
import com.zhy.sample.fragment.PayFragment;
+import com.zhy.sample.fragment.RecyclerViewFragment;
+import com.zhy.sample.fragment.RecyclerViewGridFragment;
import com.zhy.sample.fragment.RegisterFragment;
+import com.zhy.sample.fragment.TestFragment;
import java.util.ArrayList;
@@ -27,6 +31,8 @@ protected void onCreate(Bundle savedInstanceState) {
//requestWindowFeature(Window.FEATURE_NO_TITLE);
setImmersionStatus();
setContentView(R.layout.activity_main);
+
+
initView();
initDatas();
}
@@ -36,7 +42,7 @@ private void setImmersionStatus() {
// 透明状态栏
getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
// 透明导航栏
- getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
+// getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
}
}
@@ -45,6 +51,9 @@ private void initDatas() {
mList.add(new ListFragment());
mList.add(new RegisterFragment());
mList.add(new PayFragment());
+ mList.add(new RecyclerViewFragment());
+ mList.add(new RecyclerViewGridFragment());
+ mList.add(new TestFragment());
mViewPager.setAdapter(new MyAdapter(getSupportFragmentManager(), mList));
}
@@ -52,6 +61,15 @@ private void initView() {
mViewPager = (ViewPager) findViewById(R.id.id_viewpager);
}
+ @Override
+ public boolean onCreateOptionsMenu(Menu menu)
+ {
+ // Inflate the menu; this adds items to the action bar if it is present.
+ getMenuInflater().inflate(R.menu.menu_main, menu);
+ return true;
+ }
+
+
public class MyAdapter extends FragmentPagerAdapter {
ArrayList tabs = null;
diff --git a/sample/src/main/java/com/zhy/sample/UseDeviceSizeApplication.java b/sample/src/main/java/com/zhy/sample/UseDeviceSizeApplication.java
new file mode 100644
index 0000000..ee9bba3
--- /dev/null
+++ b/sample/src/main/java/com/zhy/sample/UseDeviceSizeApplication.java
@@ -0,0 +1,18 @@
+package com.zhy.sample;
+
+import android.app.Application;
+
+import com.zhy.autolayout.config.AutoLayoutConifg;
+
+/**
+ * Created by zhy on 15/12/23.
+ */
+public class UseDeviceSizeApplication extends Application
+{
+ @Override
+ public void onCreate()
+ {
+ super.onCreate();
+ AutoLayoutConifg.getInstance().useDeviceSize().init(this);
+ }
+}
diff --git a/sample/src/main/java/com/zhy/sample/fragment/ListFragment.java b/sample/src/main/java/com/zhy/sample/fragment/ListFragment.java
index 2444bd6..133117e 100755
--- a/sample/src/main/java/com/zhy/sample/fragment/ListFragment.java
+++ b/sample/src/main/java/com/zhy/sample/fragment/ListFragment.java
@@ -41,6 +41,21 @@ private void initView()
mList.add(i + "");
}
mlistview.setAdapter(new MyAdapter());
+
+// mlistview.setAdapter(new CommonAdapter(getActivity(),R.layout.list_item,mList)
+// {
+// @Override
+// protected void onConvertViewCreated(View convertView)
+// {
+// AutoUtils.autoSize(convertView);
+// }
+//
+// @Override
+// public void convert(com.zhy.base.adapter.ViewHolder viewHolder, String s)
+// {
+//
+// }
+// });
}
class MyAdapter extends BaseAdapter
diff --git a/sample/src/main/java/com/zhy/sample/fragment/RecyclerViewFragment.java b/sample/src/main/java/com/zhy/sample/fragment/RecyclerViewFragment.java
new file mode 100755
index 0000000..781a72b
--- /dev/null
+++ b/sample/src/main/java/com/zhy/sample/fragment/RecyclerViewFragment.java
@@ -0,0 +1,75 @@
+package com.zhy.sample.fragment;
+
+import android.content.Context;
+import android.os.Bundle;
+import android.support.annotation.Nullable;
+import android.support.v4.app.Fragment;
+import android.support.v7.widget.LinearLayoutManager;
+import android.support.v7.widget.RecyclerView;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+
+import com.zhy.autolayout.utils.AutoUtils;
+import com.zhy.base.adapter.recyclerview.CommonAdapter;
+import com.zhy.sample.R;
+import com.zhy.sample.view.DividerItemDecoration;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class RecyclerViewFragment extends Fragment
+{
+ private View mView;
+ private RecyclerView mRecyclerView;
+ private List mList;
+ private Context mContext;
+
+ @Override
+ public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState)
+ {
+ mView = inflater.inflate(R.layout.fragment_recyclerview, container, false);
+ initView();
+ return mView;
+ }
+
+ private void initView()
+ {
+ mContext = getActivity();
+ mRecyclerView = (RecyclerView) mView.findViewById(R.id.id_recyclerview);
+ mList = new ArrayList();
+ for (int i = 0; i < 50; i++)
+ {
+ mList.add(i + "");
+ }
+ mRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
+ mRecyclerView.setAdapter(new MyAdapter(getActivity(),mList));
+
+ mRecyclerView.addItemDecoration(new DividerItemDecoration(getActivity(),
+ DividerItemDecoration.VERTICAL_LIST));
+ }
+
+ class MyAdapter extends CommonAdapter
+ {
+ public MyAdapter(Context context, List datas)
+ {
+ super(context, R.layout.recyclerview_item, datas);
+ }
+
+ @Override
+ public com.zhy.base.adapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType)
+ {
+ com.zhy.base.adapter.ViewHolder viewHolder = super.onCreateViewHolder(parent, viewType);
+ AutoUtils.autoSize(viewHolder.getConvertView());
+ return viewHolder;
+ }
+
+ @Override
+ public void convert(com.zhy.base.adapter.ViewHolder viewHolder, String s)
+ {
+ }
+ }
+
+
+
+}
diff --git a/sample/src/main/java/com/zhy/sample/fragment/RecyclerViewGridFragment.java b/sample/src/main/java/com/zhy/sample/fragment/RecyclerViewGridFragment.java
new file mode 100755
index 0000000..a919d72
--- /dev/null
+++ b/sample/src/main/java/com/zhy/sample/fragment/RecyclerViewGridFragment.java
@@ -0,0 +1,95 @@
+package com.zhy.sample.fragment;
+
+import android.content.Context;
+import android.graphics.Color;
+import android.os.Bundle;
+import android.support.annotation.Nullable;
+import android.support.v4.app.Fragment;
+import android.support.v7.widget.GridLayoutManager;
+import android.support.v7.widget.RecyclerView;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+
+import com.zhy.autolayout.attr.AutoAttr;
+import com.zhy.autolayout.utils.AutoUtils;
+import com.zhy.sample.R;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Random;
+
+public class RecyclerViewGridFragment extends Fragment
+{
+ private View mView;
+ private RecyclerView mRecyclerView;
+ private List mList;
+ private Context mContext;
+
+ @Override
+ public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState)
+ {
+ mView = inflater.inflate(R.layout.fragment_recyclerview_grid, container, false);
+ initView();
+ return mView;
+ }
+
+ private void initView()
+ {
+ mContext = getActivity();
+ mRecyclerView = (RecyclerView) mView.findViewById(R.id.id_recyclerview);
+ mList = new ArrayList();
+ for (int i = 0; i < 50; i++)
+ {
+ mList.add(i + "");
+ }
+ mRecyclerView.setLayoutManager(new GridLayoutManager(getActivity(), 2, GridLayoutManager.HORIZONTAL, false));
+ mRecyclerView.setAdapter(new MyAdapter());
+
+ }
+
+ class MyAdapter extends RecyclerView.Adapter
+ {
+ @Override
+ public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType)
+ {
+ View convertView = LayoutInflater.from(mContext).inflate(R.layout.recyclerview_item_grid, parent, false);
+ return new ViewHolder(convertView);
+ }
+
+ @Override
+ public void onBindViewHolder(ViewHolder holder, int position)
+ {
+
+ }
+
+ @Override
+ public long getItemId(int position)
+ {
+ return position;
+ }
+
+ @Override
+ public int getItemCount()
+ {
+ return mList.size();
+ }
+
+
+ }
+
+ static class ViewHolder extends RecyclerView.ViewHolder
+ {
+
+ public ViewHolder(View itemView)
+ {
+ super(itemView);
+ Random random = new Random();
+ itemView.setBackgroundColor(Color.argb(200, random.nextInt(255), random.nextInt(255), random.nextInt(255)));
+ //recyclerview,注意添加这一行
+ AutoUtils.autoSize(itemView, AutoAttr.BASE_HEIGHT);
+// Log.e("", itemView.getLayoutParams().width + " , " + itemView.getLayoutParams().height);
+ }
+ }
+
+}
diff --git a/sample/src/main/java/com/zhy/sample/fragment/TestFragment.java b/sample/src/main/java/com/zhy/sample/fragment/TestFragment.java
new file mode 100755
index 0000000..b7f2b61
--- /dev/null
+++ b/sample/src/main/java/com/zhy/sample/fragment/TestFragment.java
@@ -0,0 +1,21 @@
+package com.zhy.sample.fragment;
+
+import android.os.Bundle;
+import android.support.annotation.Nullable;
+import android.support.v4.app.Fragment;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+
+import com.zhy.sample.R;
+
+public class TestFragment extends Fragment
+{
+
+ @Override
+ public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState)
+ {
+ return inflater.inflate(R.layout.activity_test, container, false);
+ }
+
+}
diff --git a/sample/src/main/java/com/zhy/sample/view/DividerItemDecoration.java b/sample/src/main/java/com/zhy/sample/view/DividerItemDecoration.java
new file mode 100644
index 0000000..741f06b
--- /dev/null
+++ b/sample/src/main/java/com/zhy/sample/view/DividerItemDecoration.java
@@ -0,0 +1,106 @@
+package com.zhy.sample.view;/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * limitations under the License.
+ */
+
+import android.content.Context;
+import android.content.res.TypedArray;
+import android.graphics.Canvas;
+import android.graphics.Rect;
+import android.graphics.drawable.Drawable;
+import android.support.v7.widget.LinearLayoutManager;
+import android.support.v7.widget.RecyclerView;
+import android.util.Log;
+import android.view.View;
+
+
+/**
+ * This class is from the v7 samples of the Android SDK. It's not by me!
+ *
+ * See the license above for details.
+ */
+public class DividerItemDecoration extends RecyclerView.ItemDecoration {
+
+ private static final int[] ATTRS = new int[]{
+ android.R.attr.listDivider
+ };
+
+ public static final int HORIZONTAL_LIST = LinearLayoutManager.HORIZONTAL;
+
+ public static final int VERTICAL_LIST = LinearLayoutManager.VERTICAL;
+
+ private Drawable mDivider;
+
+ private int mOrientation;
+
+ public DividerItemDecoration(Context context, int orientation) {
+ final TypedArray a = context.obtainStyledAttributes(ATTRS);
+ mDivider = a.getDrawable(0);
+ a.recycle();
+ setOrientation(orientation);
+ }
+
+ public void setOrientation(int orientation) {
+ if (orientation != HORIZONTAL_LIST && orientation != VERTICAL_LIST) {
+ throw new IllegalArgumentException("invalid orientation");
+ }
+ mOrientation = orientation;
+ }
+
+ @Override
+ public void onDraw(Canvas c, RecyclerView parent) {
+ Log.v("recyclerview - itemdecoration", "onDraw()");
+
+ if (mOrientation == VERTICAL_LIST) {
+ drawVertical(c, parent);
+ } else {
+ drawHorizontal(c, parent);
+ }
+
+ }
+
+
+ public void drawVertical(Canvas c, RecyclerView parent) {
+ final int left = parent.getPaddingLeft();
+ final int right = parent.getWidth() - parent.getPaddingRight();
+
+ final int childCount = parent.getChildCount();
+ for (int i = 0; i < childCount; i++) {
+ final View child = parent.getChildAt(i);
+ RecyclerView v = new RecyclerView(parent.getContext());
+ final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child
+ .getLayoutParams();
+ final int top = child.getBottom() + params.bottomMargin;
+ final int bottom = top + mDivider.getIntrinsicHeight();
+ mDivider.setBounds(left, top, right, bottom);
+ mDivider.draw(c);
+ }
+ }
+
+ public void drawHorizontal(Canvas c, RecyclerView parent) {
+ final int top = parent.getPaddingTop();
+ final int bottom = parent.getHeight() - parent.getPaddingBottom();
+
+ final int childCount = parent.getChildCount();
+ for (int i = 0; i < childCount; i++) {
+ final View child = parent.getChildAt(i);
+ final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child
+ .getLayoutParams();
+ final int left = child.getRight() + params.rightMargin;
+ final int right = left + mDivider.getIntrinsicHeight();
+ mDivider.setBounds(left, top, right, bottom);
+ mDivider.draw(c);
+ }
+ }
+
+ @Override
+ public void getItemOffsets(Rect outRect, int itemPosition, RecyclerView parent) {
+ if (mOrientation == VERTICAL_LIST) {
+ outRect.set(0, 0, 0, mDivider.getIntrinsicHeight());
+ } else {
+ outRect.set(0, 0, mDivider.getIntrinsicWidth(), 0);
+ }
+ }
+}
\ No newline at end of file
diff --git a/sample/src/main/res/layout/activity_main.xml b/sample/src/main/res/layout/activity_main.xml
index 408fe8a..4d12145 100644
--- a/sample/src/main/res/layout/activity_main.xml
+++ b/sample/src/main/res/layout/activity_main.xml
@@ -7,7 +7,6 @@
android:orientation="vertical" >
-
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/sample/src/main/res/layout/fragment_recyclerview.xml b/sample/src/main/res/layout/fragment_recyclerview.xml
new file mode 100755
index 0000000..34e9785
--- /dev/null
+++ b/sample/src/main/res/layout/fragment_recyclerview.xml
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/sample/src/main/res/layout/fragment_recyclerview_grid.xml b/sample/src/main/res/layout/fragment_recyclerview_grid.xml
new file mode 100755
index 0000000..4655f75
--- /dev/null
+++ b/sample/src/main/res/layout/fragment_recyclerview_grid.xml
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/sample/src/main/res/layout/recyclerview_item.xml b/sample/src/main/res/layout/recyclerview_item.xml
new file mode 100755
index 0000000..5648870
--- /dev/null
+++ b/sample/src/main/res/layout/recyclerview_item.xml
@@ -0,0 +1,57 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/sample/src/main/res/layout/recyclerview_item_grid.xml b/sample/src/main/res/layout/recyclerview_item_grid.xml
new file mode 100755
index 0000000..00c5466
--- /dev/null
+++ b/sample/src/main/res/layout/recyclerview_item_grid.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/sample/src/main/res/menu/menu_main.xml b/sample/src/main/res/menu/menu_main.xml
index a459e0a..761dd8a 100644
--- a/sample/src/main/res/menu/menu_main.xml
+++ b/sample/src/main/res/menu/menu_main.xml
@@ -6,4 +6,15 @@
android:title="@string/action_settings"
android:orderInCategory="100"
app:showAsAction="never"/>
+
+
+
+
+
diff --git a/settings.gradle b/settings.gradle
index 97a7501..16eda15 100644
--- a/settings.gradle
+++ b/settings.gradle
@@ -1 +1 @@
-include ':sample', ':autolayout'
+include ':sample', ':autolayout', ':widgetsample', ':autolayout-widget'
diff --git a/widgetsample/.gitignore b/widgetsample/.gitignore
new file mode 100644
index 0000000..796b96d
--- /dev/null
+++ b/widgetsample/.gitignore
@@ -0,0 +1 @@
+/build
diff --git a/widgetsample/build.gradle b/widgetsample/build.gradle
new file mode 100644
index 0000000..513b9f8
--- /dev/null
+++ b/widgetsample/build.gradle
@@ -0,0 +1,31 @@
+apply plugin: 'com.android.application'
+
+android {
+ compileSdkVersion 23
+ buildToolsVersion "23.0.1"
+
+ defaultConfig {
+ applicationId "com.zhy.autolayout.test.widgets"
+ minSdkVersion 10
+ targetSdkVersion 23
+ versionCode 1
+ versionName "1.0"
+ }
+ buildTypes {
+ release {
+ minifyEnabled false
+ proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
+ }
+ }
+}
+
+dependencies {
+ compile fileTree(dir: 'libs', include: ['*.jar'])
+ compile project(':autolayout')
+ compile project(':autolayout-widget')
+ compile 'com.android.support:design:23.1.1'
+ compile 'com.android.support:support-v4:23.1.1'
+ compile 'com.android.support:appcompat-v7:23.1.1'
+ compile 'com.android.support:gridlayout-v7:23.1.1'
+ compile 'com.android.support:cardview-v7:23.1.1'
+}
diff --git a/widgetsample/proguard-rules.pro b/widgetsample/proguard-rules.pro
new file mode 100644
index 0000000..1c6c033
--- /dev/null
+++ b/widgetsample/proguard-rules.pro
@@ -0,0 +1,17 @@
+# Add project specific ProGuard rules here.
+# By default, the flags in this file are appended to flags specified
+# in /Users/zhy/android/sdk/android-sdk-macosx/tools/proguard/proguard-android.txt
+# You can edit the include path and order by changing the proguardFiles
+# directive in build.gradle.
+#
+# For more details, see
+# http://developer.android.com/guide/developing/tools/proguard.html
+
+# Add any project specific keep options here:
+
+# If your project uses WebView with JS, uncomment the following
+# and specify the fully qualified class name to the JavaScript interface
+# class:
+#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
+# public *;
+#}
diff --git a/widgetsample/src/androidTest/java/com/zhy/autolayout/test/widgets/ApplicationTest.java b/widgetsample/src/androidTest/java/com/zhy/autolayout/test/widgets/ApplicationTest.java
new file mode 100644
index 0000000..6ca54cc
--- /dev/null
+++ b/widgetsample/src/androidTest/java/com/zhy/autolayout/test/widgets/ApplicationTest.java
@@ -0,0 +1,15 @@
+package com.zhy.autolayout.test.widgets;
+
+import android.app.Application;
+import android.test.ApplicationTestCase;
+
+/**
+ * Testing Fundamentals
+ */
+public class ApplicationTest extends ApplicationTestCase
+{
+ public ApplicationTest()
+ {
+ super(Application.class);
+ }
+}
\ No newline at end of file
diff --git a/widgetsample/src/main/AndroidManifest.xml b/widgetsample/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..06f4b33
--- /dev/null
+++ b/widgetsample/src/main/AndroidManifest.xml
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/widgetsample/src/main/java/com/zhy/autolayout/test/widgets/MainActivity.java b/widgetsample/src/main/java/com/zhy/autolayout/test/widgets/MainActivity.java
new file mode 100644
index 0000000..5ee91a8
--- /dev/null
+++ b/widgetsample/src/main/java/com/zhy/autolayout/test/widgets/MainActivity.java
@@ -0,0 +1,73 @@
+package com.zhy.autolayout.test.widgets;
+
+import android.os.Bundle;
+import android.support.design.widget.TabLayout;
+import android.support.v4.app.Fragment;
+import android.support.v4.app.FragmentPagerAdapter;
+import android.support.v4.view.ViewPager;
+import android.support.v7.widget.Toolbar;
+import android.view.Menu;
+import android.view.MenuItem;
+
+import com.zhy.autolayout.test.widgets.fragments.SimpleFragment;
+import com.zhy.autolayout.widget.AutoLayoutWidgetActivity;
+
+public class MainActivity extends AutoLayoutWidgetActivity {
+ private TabLayout mTabLayout;
+ private ViewPager mViewPager;
+
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_main);
+
+ Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
+ toolbar.setTitle("标题");
+ setSupportActionBar(toolbar);
+ mTabLayout = (TabLayout) findViewById(R.id.id_tablayout);
+ mViewPager = (ViewPager) findViewById(R.id.id_viewpager);
+
+ mViewPager.setAdapter(new FragmentPagerAdapter(getSupportFragmentManager()) {
+ @Override
+ public Fragment getItem(int position) {
+ return new SimpleFragment();
+ }
+
+ @Override
+ public int getCount() {
+ return 2;
+ }
+
+ @Override
+ public CharSequence getPageTitle(int position) {
+ return "Page " + position;
+ }
+ });
+
+ mTabLayout.setupWithViewPager(mViewPager);
+
+ }
+
+ @Override
+ public boolean onCreateOptionsMenu(Menu menu) {
+ // Inflate the menu; this adds items to the action bar if it is present.
+ getMenuInflater().inflate(R.menu.menu_main, menu);
+ return true;
+ }
+
+ @Override
+ public boolean onOptionsItemSelected(MenuItem item) {
+ // Handle action bar item clicks here. The action bar will
+ // automatically handle clicks on the Home/Up button, so long
+ // as you specify a parent activity in AndroidManifest.xml.
+ int id = item.getItemId();
+
+ //noinspection SimplifiableIfStatement
+ if (id == R.id.action_settings) {
+ return true;
+ }
+
+ return super.onOptionsItemSelected(item);
+ }
+}
diff --git a/widgetsample/src/main/java/com/zhy/autolayout/test/widgets/fragments/SimpleFragment.java b/widgetsample/src/main/java/com/zhy/autolayout/test/widgets/fragments/SimpleFragment.java
new file mode 100644
index 0000000..ff7876e
--- /dev/null
+++ b/widgetsample/src/main/java/com/zhy/autolayout/test/widgets/fragments/SimpleFragment.java
@@ -0,0 +1,23 @@
+package com.zhy.autolayout.test.widgets.fragments;
+
+import android.os.Bundle;
+import android.support.annotation.Nullable;
+import android.support.v4.app.Fragment;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+
+import com.zhy.autolayout.test.widgets.R;
+
+/**
+ * Created by zhy on 16/3/3.
+ */
+public class SimpleFragment extends Fragment
+{
+ @Nullable
+ @Override
+ public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
+ {
+ return inflater.inflate(R.layout.fragment_simple, container, false);
+ }
+}
diff --git a/widgetsample/src/main/res/layout/activity_main.xml b/widgetsample/src/main/res/layout/activity_main.xml
new file mode 100644
index 0000000..9523051
--- /dev/null
+++ b/widgetsample/src/main/res/layout/activity_main.xml
@@ -0,0 +1,38 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/widgetsample/src/main/res/layout/fragment_simple.xml b/widgetsample/src/main/res/layout/fragment_simple.xml
new file mode 100644
index 0000000..9792bec
--- /dev/null
+++ b/widgetsample/src/main/res/layout/fragment_simple.xml
@@ -0,0 +1,15 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/widgetsample/src/main/res/menu/menu_main.xml b/widgetsample/src/main/res/menu/menu_main.xml
new file mode 100644
index 0000000..ac17699
--- /dev/null
+++ b/widgetsample/src/main/res/menu/menu_main.xml
@@ -0,0 +1,9 @@
+
diff --git a/widgetsample/src/main/res/mipmap-hdpi/ic_launcher.png b/widgetsample/src/main/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 0000000..cde69bc
Binary files /dev/null and b/widgetsample/src/main/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/widgetsample/src/main/res/mipmap-mdpi/ic_launcher.png b/widgetsample/src/main/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 0000000..c133a0c
Binary files /dev/null and b/widgetsample/src/main/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/widgetsample/src/main/res/mipmap-xhdpi/ic_launcher.png b/widgetsample/src/main/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 0000000..bfa42f0
Binary files /dev/null and b/widgetsample/src/main/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/widgetsample/src/main/res/mipmap-xxhdpi/ic_launcher.png b/widgetsample/src/main/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 0000000..324e72c
Binary files /dev/null and b/widgetsample/src/main/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/widgetsample/src/main/res/values-w820dp/dimens.xml b/widgetsample/src/main/res/values-w820dp/dimens.xml
new file mode 100644
index 0000000..63fc816
--- /dev/null
+++ b/widgetsample/src/main/res/values-w820dp/dimens.xml
@@ -0,0 +1,6 @@
+
+
+ 64dp
+
diff --git a/widgetsample/src/main/res/values/dimens.xml b/widgetsample/src/main/res/values/dimens.xml
new file mode 100644
index 0000000..47c8224
--- /dev/null
+++ b/widgetsample/src/main/res/values/dimens.xml
@@ -0,0 +1,5 @@
+
+
+ 16dp
+ 16dp
+
diff --git a/widgetsample/src/main/res/values/strings.xml b/widgetsample/src/main/res/values/strings.xml
new file mode 100644
index 0000000..96e2fdf
--- /dev/null
+++ b/widgetsample/src/main/res/values/strings.xml
@@ -0,0 +1,6 @@
+
+ widgetSample
+
+ Hello world!
+ 设置
+
diff --git a/widgetsample/src/main/res/values/styles.xml b/widgetsample/src/main/res/values/styles.xml
new file mode 100644
index 0000000..b5cb951
--- /dev/null
+++ b/widgetsample/src/main/res/values/styles.xml
@@ -0,0 +1,23 @@
+
+
+
+
+
+
+
+
+
+
+
+