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 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ 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 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ 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 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ 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 @@ + + + + + + + + + + + +