diff --git a/README.md b/README.md index 4190366..e7dcc27 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -More, please visit:[My CSDN](http://blog.csdn.net/liaoinstan/article/details/51023907)     apk demo:[download](https://github.com/liaoinstan/SpringView/blob/master/apk/demo-release.apk?raw=true)     中文文档:[中文文档](https://github.com/liaoinstan/SpringView/blob/master/README_CN.md) +More, please visit:[My CSDN](http://blog.csdn.net/liaoinstan/article/details/51023907)     apk demo:[download](https://github.com/liaoinstan/SpringView/blob/master/apk/DemoSpring-1.7.0-release.apk?raw=true)     中文文档:[中文文档](https://github.com/liaoinstan/SpringView/blob/master/README_CN.md) SpringView ===== @@ -25,7 +25,8 @@ SpringView **📌new:** -![这里写图片描述](https://github.com/liaoinstan/SpringView/blob/master/screenshot/weixin_header_s.gif) +![这里写图片描述](https://github.com/liaoinstan/SpringView/blob/master/screenshot/weixin_header_s.gif) ![这里写图片描述](https://github.com/liaoinstan/SpringView/blob/master/screenshot/weixin_header_v2_s.gif) +![这里写图片描述](https://github.com/liaoinstan/SpringView/blob/master/screenshot/auto_footer_s.gif) ![这里写图片描述](https://github.com/liaoinstan/SpringView/blob/master/screenshot/du_header_s.gif) **How to use SpringView** -------- @@ -74,14 +75,15 @@ use Gradle: dependencies { //SpringView core library (only include DefaultHeader/Footer) - implementation 'com.liaoinstan.springview:library:1.5.1' + implementation 'com.liaoinstan.springview:library:1.7.0' //other Headers/Footers, choose one or more that you like - implementation 'com.liaoinstan.springview:AcfunHeader:1.5.1' //AcFun style (header and footer) - implementation 'com.liaoinstan.springview:AliHeader:1.5.1' //alitrip style (header and footer) - implementation 'com.liaoinstan.springview:MeituanHeader:1.5.1' //meituan style (header and footer) - implementation 'com.liaoinstan.springview:RotationHeader:1.5.1' //mechanical gear style (header and footer) - implementation 'com.liaoinstan.springview:WeixinHeader:1.5.1' //weichat Mini Program header(only header) + implementation 'com.liaoinstan.springview:AcfunHeader:1.7.0' //AcFun style (header and footer) + implementation 'com.liaoinstan.springview:AliHeader:1.7.0' //Alitrip style (header and footer) + implementation 'com.liaoinstan.springview:MeituanHeader:1.7.0' //Meituan style (header and footer) + implementation 'com.liaoinstan.springview:RotationHeader:1.7.0' //Mechanical gear style (header and footer) + implementation 'com.liaoinstan.springview:WeixinHeader:1.7.0' //WeChat Mini Program header(only header) + implementation 'com.liaoinstan.springview:DuHeader:1.7.0' //Du app header(only header) } ``` or Maven: @@ -89,7 +91,7 @@ or Maven: com.liaoinstan.springview library - 1.5.1 + 1.7.0 pom ``` @@ -97,44 +99,56 @@ or Maven: **Update log** -------- -####**v1.5.1** - - fix bug when nested layout, fix bug callFresh() can't spring back when set SpringView Give.NONE. +### **v1.7.0** +- Add new a header (DuHeader), and a auto-scrolling Footer (AutoFooter). +- Add a new type SCROLL. Based on this mode, effects such as scrolling to the bottom and automatic loading can be achieved. +- Header / Footer now has setType () method, you can set different Type for Header and Footer respectively. +- Fix issus. + +### **v1.6.0** +- Add a new header (WeixinHeaderV2) for new version of WeChat (WeChat 7). +- The movement parameter of SpringView (MovePara) no longer affects both Header and Footer. BaseHeader/Footer now has a new getMovePara() interface that allows you to set different movement parameters for Header and Footer to match different drag-and-drop feel.(if you don't implement the interface, SpringView is still compatible with the previous rules). +- Update to Android X. +- Fixed several drag and drop stickiness issues, and callFresh method callback issues. + +### **v1.5.1** + - Fix bug when nested layout, fix bug callFresh() can't spring back when set SpringView Give.NONE. -####**v1.5.0** +### **v1.5.0** - headers /footers split off from SpringView library(except DefaultHeader/Footer),simplified core library,now core library's size only **26KB**,You can import headers/footers separately -####**v1.4.0** - - new function setMovePara(),a new header for weixin:WeixinHeader,a new type DRAG like SwipeRefreshLayout:spring.setType(Type.DRAG) +### **v1.4.0** + - New function setMovePara(),a new header for weixin:WeixinHeader,a new type DRAG like SwipeRefreshLayout:spring.setType(Type.DRAG) -####**v1.3.3** +### **v1.3.3** - Optimize several experiential issues,Added onFinishFreshAndLoadDelay(int delay), callFreshDelay(int delay) method,Optimizing performance with BottomSheetBehavior,Optimize the performance used in BottomSheetDialog -####**v1.3.2** - - fix the bug of the linkage damping of AppBarLayout in the case of null data, +### **v1.3.2** + - Fix the bug of the linkage damping of AppBarLayout in the case of null data, new setEnableFooter(Boolean), setEnableHeader(Boolean) disable or enable header/footer. -####**v1.3.0** - - support AppBarLayout,fix sliding conflict +### **v1.3.0** + - Support AppBarLayout,fix sliding conflict -####**v1.2.7** - - bug fix +### **v1.2.7** + - Bug fix -####**v1.2.6** - - padding bug fix +### **v1.2.6** + - Padding bug fix -####**v1.2.5** - - add **setEnable(boolean)** function +### **v1.2.5** + - Add **setEnable(boolean)** function -####**v1.2.4** +### **v1.2.4** - - add **callFresh()** method, used to call the refresh operation manual - - fixes the lateral sliding conflict + - Add **callFresh()** method, used to call the refresh operation manual + - Fixes the lateral sliding conflict -####**v1.2.2** - - repair the callback refresh many times +### **v1.2.2** + - Repair the callback refresh many times -####**v1.2.1** - - repair the click event occasional failure problem +### **v1.2.1** + - Repair the click event occasional failure problem **Feedback** diff --git a/README_CN.md b/README_CN.md index 4086191..e1354fb 100644 --- a/README_CN.md +++ b/README_CN.md @@ -1,4 +1,4 @@ -更多请移步至:[我的CSDN博客](http://blog.csdn.net/liaoinstan/article/details/51023907)     apk演示:[点击下载](https://github.com/liaoinstan/SpringView/blob/master/apk/demo-release.apk?raw=true)     English document:[English document](https://github.com/liaoinstan/SpringView/blob/master/README.md) +更多请移步至:[我的CSDN博客](http://blog.csdn.net/liaoinstan/article/details/51023907)     apk演示:[点击下载](https://github.com/liaoinstan/SpringView/blob/master/apk/DemoSpring-1.7.0-release.apk?raw=true)     English document:[English document](https://github.com/liaoinstan/SpringView/blob/master/README.md) SpringView ===== @@ -25,7 +25,8 @@ SpringView **📌新增:** -![这里写图片描述](https://github.com/liaoinstan/SpringView/blob/master/screenshot/weixin_header.gif) +![这里写图片描述](https://github.com/liaoinstan/SpringView/blob/master/screenshot/weixin_header.gif) ![这里写图片描述](https://github.com/liaoinstan/SpringView/blob/master/screenshot/weixin_header_v2.gif) +![这里写图片描述](https://github.com/liaoinstan/SpringView/blob/master/screenshot/auto_footer.gif) ![这里写图片描述](https://github.com/liaoinstan/SpringView/blob/master/screenshot/du_header.gif) **如何使用 SpringView** -------- @@ -74,14 +75,15 @@ springView.setListener(new SpringView.OnFreshListener() { dependencies { //SpringView核心库 (只包含DefaultHeader/Footer) - implementation 'com.liaoinstan.springview:library:1.5.1' + implementation 'com.liaoinstan.springview:library:1.7.0' //以下是各个风格的Header/Footer,选择自己喜欢的引入 - implementation 'com.liaoinstan.springview:AcfunHeader:1.5.1' //AcFun风格 (header and footer) - implementation 'com.liaoinstan.springview:AliHeader:1.5.1' //阿里旅行风格 (header and footer) - implementation 'com.liaoinstan.springview:MeituanHeader:1.5.1' //美团风格 (header and footer) - implementation 'com.liaoinstan.springview:RotationHeader:1.5.1' //齿轮机械风格 (header and footer) - implementation 'com.liaoinstan.springview:WeixinHeader:1.5.1' //微信小程序header(只有header) + implementation 'com.liaoinstan.springview:AcfunHeader:1.7.0' //AcFun风格 (header and footer) + implementation 'com.liaoinstan.springview:AliHeader:1.7.0' //阿里旅行风格 (header and footer) + implementation 'com.liaoinstan.springview:MeituanHeader:1.7.0' //美团风格 (header and footer) + implementation 'com.liaoinstan.springview:RotationHeader:1.7.0' //齿轮机械风格 (header and footer) + implementation 'com.liaoinstan.springview:WeixinHeader:1.7.0' //微信小程序header(只有header) + implementation 'com.liaoinstan.springview:DuHeader:1.7.0' //'毒'App header(只有header) } ``` 或者 Maven: @@ -89,7 +91,7 @@ dependencies { com.liaoinstan.springview library - 1.5.1 + 1.7.0 pom ``` @@ -97,42 +99,53 @@ dependencies { **更新日志** -------- -####**v1.5.1** +#### **v1.7.0** + - 新增一个仿毒app的header (DuHeader),和一个自动滚动的Footer (AutoFooter) + - 新增SCROLL模式,基于这种模式可以实现滚动到底部自动加载等效果 + - Header/Footer现在新增了setType()方法,你可以分别给Header和Footer设置不同的Type + - 修复一些Bug + +#### **v1.6.0** + - 新增了仿新版微信(微信7)小程序效果的header (WeixinHeaderV2) + - SpringView的移动参数(MovePara)不再同时影响Header和Footer了,BaseHeader/Footer新增了getMovePara()接口,你可以分别为header和footer设置不同的移动参数以匹配不同的拖拽手感。(如果你没有实现该接口,SpringView仍然兼容以前的规则) + - 依赖更新到Android X + - 修复几个拖拽粘滞的问题,和callFresh方法回调的问题 +#### **v1.5.1** - 修复在SpringView内部嵌套布局无法滚动的bug,修复给SpringView设置Give.NONE熟悉时调用callFresh()无法正确回弹的问题。 -####**v1.5.0** +#### **v1.5.0** - 把所有的header和footer单独从SpringView库中分离出来了(除DefaultHeader/Footer),现在可以只选择单独导入自己想要的headers/footers,彻底精简后的SpringView library只有**26KB**,后期新增的header/footer都将以独立库的形式发布,不再冗余到SpringView核心库里,库链接参见上述[获取SpringView]内容 -####**v1.4.0** +#### **v1.4.0** - 新增setMovePara()方法用于设置拖拽时的阻尼系数,新增了一个WeixinHeader仿微信小程序header,新增新的模式:DRAG(拖拽模式),可以实现类似于SwipeRefreshLayout的交互效果,重新设计了overLap模式的实现方式,更加稳定,弃用了support过时api,优化拖拽流畅性和交互效果细节 -####**v1.3.3** +#### **v1.3.3** - 优化几个体验性问题,新增onFinishFreshAndLoadDelay(int delay),callFreshDelay(int delay)方法,优化和BottomSheetBehavior联用的表现,优化在BottomSheetDialog中使用的表现 -####**v1.3.2** +#### **v1.3.2** - 修复空数据情况下和AppBarLayout联动阻尼的bug,新增setEnableFooter(boolean),setEnableHeader(boolean)禁用或启用header/footer -####**v1.3.0** +#### **v1.3.0** - 支持和 AppBarLayout 联动,修复滚动冲突的问题 -####**v1.2.7** +#### **v1.2.7** - 修复一些bug -####**v1.2.6** +#### **v1.2.6** - 修复了内边距的失效的问题 -####**v1.2.5** +#### **v1.2.5** - 新增 **setEnable(boolean)** 方法,用于禁用/启用SpringView -####**v1.2.4** +#### **v1.2.4** - 新增 **callFresh()** 方法, 用于手动调用刷新 - 修复了内置水平滑动控件的事件冲突 -####**v1.2.2** +#### **v1.2.2** - 修复了会多次回调刷新的问题 -####**v1.2.1** +#### **v1.2.1** - 修复点击事件偶尔失效的问题 diff --git a/apk/DemoSpring-1.7.0-release.apk b/apk/DemoSpring-1.7.0-release.apk new file mode 100644 index 0000000..14a34ec Binary files /dev/null and b/apk/DemoSpring-1.7.0-release.apk differ diff --git a/apk/demo-release.apk b/apk/demo-release.apk deleted file mode 100644 index d22a951..0000000 Binary files a/apk/demo-release.apk and /dev/null differ diff --git a/build.gradle b/build.gradle index 901f546..e46d921 100644 --- a/build.gradle +++ b/build.gradle @@ -4,7 +4,7 @@ buildscript { jcenter() } dependencies { - classpath 'com.android.tools.build:gradle:3.2.1' + classpath 'com.android.tools.build:gradle:3.5.3' classpath 'com.novoda:bintray-release:0.9.1' } } @@ -27,8 +27,8 @@ ext { compileSdkVersion = 29 minSdkVersion = 16 targetSdkVersion = 27 - supportLibraryVersion = '1.1.0-rc01' - materialLibraryVersion = '1.1.0-alpha07' + supportLibraryVersion = '1.1.0' + materialLibraryVersion = '1.2.0-alpha02' userOrg = 'liaoinstan' repoName = "maven" diff --git a/demo/build.gradle b/demo/build.gradle index 6a54abb..1f4b07e 100644 --- a/demo/build.gradle +++ b/demo/build.gradle @@ -2,25 +2,34 @@ apply plugin: 'com.android.application' android { compileSdkVersion rootProject.ext.compileSdkVersion - compileOptions { targetCompatibility JavaVersion.VERSION_1_8 sourceCompatibility JavaVersion.VERSION_1_8 } - defaultConfig { applicationId "com.liaoinstan.demospring" minSdkVersion rootProject.ext.minSdkVersion targetSdkVersion rootProject.ext.targetSdkVersion - versionCode 1 - versionName "1.0" + versionCode 17 + versionName "1.7.0" } buildTypes { release { + minifyEnabled true //开启代码混淆 + zipAlignEnabled true //是否zip对齐优化 + shrinkResources true //移除无用的资源文件 + proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' + } + debug { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } + android.applicationVariants.all { variant -> + variant.outputs.all { + outputFileName = "DemoSpring-${defaultConfig.versionName}-${variant.buildType.name}.apk" + } + } } tasks.withType(JavaCompile) { @@ -32,12 +41,13 @@ dependencies { implementation "androidx.appcompat:appcompat:$supportLibraryVersion" implementation "com.google.android.material:material:$materialLibraryVersion" -// implementation 'com.liaoinstan.springview:library:1.5.1' -// implementation 'com.liaoinstan.springview:AcfunHeader:1.5.1' -// implementation 'com.liaoinstan.springview:AliHeader:1.5.1' -// implementation 'com.liaoinstan.springview:MeituanHeader:1.5.1' -// implementation 'com.liaoinstan.springview:RotationHeader:1.5.1' -// implementation 'com.liaoinstan.springview:WeixinHeader:1.5.1' +// implementation 'com.liaoinstan.springview:library:1.7.0' +// implementation 'com.liaoinstan.springview:AcfunHeader:1.7.0' +// implementation 'com.liaoinstan.springview:AliHeader:1.7.0' +// implementation 'com.liaoinstan.springview:MeituanHeader:1.7.0' +// implementation 'com.liaoinstan.springview:RotationHeader:1.7.0' +// implementation 'com.liaoinstan.springview:WeixinHeader:1.7.0' +// implementation 'com.liaoinstan.springview:DuHeader:1.7.0' implementation project(':library') implementation project(':header_ali') @@ -45,6 +55,7 @@ dependencies { implementation project(':header_rotation') implementation project(':header_acfun') implementation project(':header_weixin') + implementation project(':header_du') implementation project(':header_wangyi') } diff --git a/demo/liaoinstan.jks b/demo/liaoinstan.jks new file mode 100644 index 0000000..ac5fa3e Binary files /dev/null and b/demo/liaoinstan.jks differ diff --git a/demo/src/main/AndroidManifest.xml b/demo/src/main/AndroidManifest.xml index 10e4aa5..9a26faa 100644 --- a/demo/src/main/AndroidManifest.xml +++ b/demo/src/main/AndroidManifest.xml @@ -1,5 +1,6 @@ @@ -9,7 +10,8 @@ android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:supportsRtl="true" - android:theme="@style/AppTheme.NoActionBar"> + android:theme="@style/AppTheme.NoActionBar" + tools:ignore="GoogleAppIndexingWarning"> @@ -31,9 +33,11 @@ + + + - \ No newline at end of file diff --git a/demo/src/main/java/com/liaoinstan/demospring/MainActivity.java b/demo/src/main/java/com/liaoinstan/demospring/MainActivity.java index 707d69e..f2a6f37 100644 --- a/demo/src/main/java/com/liaoinstan/demospring/MainActivity.java +++ b/demo/src/main/java/com/liaoinstan/demospring/MainActivity.java @@ -2,13 +2,16 @@ import android.content.Intent; import android.os.Bundle; -import androidx.appcompat.app.AppCompatActivity; import android.view.View; +import androidx.appcompat.app.AppCompatActivity; + import com.liaoinstan.demospring.demo1.Demo1Activity; import com.liaoinstan.demospring.demo10.Demo10Activity; import com.liaoinstan.demospring.demo11.Demo11Activity; import com.liaoinstan.demospring.demo12.Demo12Activity; +import com.liaoinstan.demospring.demo13.Demo13Activity; +import com.liaoinstan.demospring.demo14.Demo14Activity; import com.liaoinstan.demospring.demo2.Demo2Activity; import com.liaoinstan.demospring.demo3.Demo3Activity; import com.liaoinstan.demospring.demo4.Demo4Activity; @@ -17,6 +20,7 @@ import com.liaoinstan.demospring.demo7.Demo7Activity; import com.liaoinstan.demospring.demo8.Demo8Activity; import com.liaoinstan.demospring.demo9.Demo9Activity; +import com.liaoinstan.demospring.demox.DemoXActivity; import com.liaoinstan.demospring.test.TestActivity; import com.liaoinstan.demospring.warning.WarningActivity; @@ -78,6 +82,18 @@ public void onClick(View v) { intent.setClass(this, Demo12Activity.class); startActivity(intent); break; + case R.id.demo13: + intent.setClass(this, Demo13Activity.class); + startActivity(intent); + break; + case R.id.demo14: + intent.setClass(this, Demo14Activity.class); + startActivity(intent); + break; + case R.id.demox: + intent.setClass(this, DemoXActivity.class); + startActivity(intent); + break; case R.id.warning: intent.setClass(this, WarningActivity.class); startActivity(intent); diff --git a/demo/src/main/java/com/liaoinstan/demospring/demo10/Demo10Activity.java b/demo/src/main/java/com/liaoinstan/demospring/demo10/Demo10Activity.java index 24d549e..b31bd19 100644 --- a/demo/src/main/java/com/liaoinstan/demospring/demo10/Demo10Activity.java +++ b/demo/src/main/java/com/liaoinstan/demospring/demo10/Demo10Activity.java @@ -2,6 +2,7 @@ import android.os.Bundle; import android.os.Handler; + import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.widget.Toolbar; @@ -29,7 +30,6 @@ protected void onCreate(Bundle savedInstanceState) { setSupportActionBar(toolbar); springView = findViewById(R.id.springview); - springView.setType(SpringView.Type.DRAG); springView.setListener(new SpringView.OnFreshListener() { @Override public void onRefresh() { @@ -41,7 +41,8 @@ public void onLoadmore() { new Handler().postDelayed(() -> springView.onFinishFreshAndLoad(), 2000); } }); - springView.setHeader(new MeituanHeader(this, pullAnimSrcs, refreshAnimSrcs)); - springView.setFooter(new MeituanFooter(this, loadingAnimSrcs)); + //给header和footer设置为DRAG模式 + springView.setHeader(new MeituanHeader(this, pullAnimSrcs, refreshAnimSrcs).setType(SpringView.Type.DRAG)); + springView.setFooter(new MeituanFooter(this, loadingAnimSrcs).setType(SpringView.Type.DRAG)); } } diff --git a/demo/src/main/java/com/liaoinstan/demospring/demo11/Demo11Activity.java b/demo/src/main/java/com/liaoinstan/demospring/demo11/Demo11Activity.java index 7294cf4..935a572 100644 --- a/demo/src/main/java/com/liaoinstan/demospring/demo11/Demo11Activity.java +++ b/demo/src/main/java/com/liaoinstan/demospring/demo11/Demo11Activity.java @@ -40,7 +40,6 @@ protected void onCreate(Bundle savedInstanceState) { setSupportActionBar(toolbar); springView = findViewById(R.id.springview); - springView.setMovePara(1.5); springView.setListener(new SpringView.OnFreshListener() { @Override public void onRefresh() { diff --git a/demo/src/main/java/com/liaoinstan/demospring/demo12/Demo12Activity.java b/demo/src/main/java/com/liaoinstan/demospring/demo12/Demo12Activity.java index 1f142f4..ceaa3c1 100644 --- a/demo/src/main/java/com/liaoinstan/demospring/demo12/Demo12Activity.java +++ b/demo/src/main/java/com/liaoinstan/demospring/demo12/Demo12Activity.java @@ -1,42 +1,140 @@ package com.liaoinstan.demospring.demo12; import android.os.Bundle; -import android.os.Handler; +import android.view.View; +import android.widget.Toast; +import androidx.appcompat.app.AlertDialog; import androidx.appcompat.app.AppCompatActivity; -import androidx.appcompat.widget.Toolbar; +import androidx.recyclerview.widget.RecyclerView; import com.liaoinstan.demospring.R; -import com.liaoinstan.springview.aliheader.AliFooter; -import com.liaoinstan.springview.wangyiheader.WangyiHeader; +import com.liaoinstan.demospring.utils.StatusBarUtil; +import com.liaoinstan.springview.weixinheader.Program; +import com.liaoinstan.springview.weixinheaderv2.WeixinHeaderV2; +import com.liaoinstan.springview.weixinheaderv2.WeixinTitleBar; import com.liaoinstan.springview.widget.SpringView; -public class Demo12Activity extends AppCompatActivity { +import java.util.ArrayList; +import java.util.List; +import java.util.Random; +public class Demo12Activity extends AppCompatActivity implements WeixinHeaderV2.OnMoreClickListener, WeixinHeaderV2.OnProgramClickListener, WeixinHeaderV2.OnProgramDropListener, WeixinHeaderV2.OnSearchClickListener { + + private View bottomView; + private WeixinTitleBar weixinTitleBar; private SpringView springView; + private WeixinHeaderV2 weixinHeaderV2; + + //测试数据 + //注意这里本应该给每个对象一个网络图片url链接,再利用图片加载框架加载网络图片, + //但是在本demo中不想引入无关框架,所以这里把本地资源图片id转成String类型保存在url字段中,加载图片的时候再转回int类型设置图片,这样做仅为演示 + private List dataRecent = new ArrayList() {{ + add(new Program("ofo小黄车", String.valueOf(R.drawable.wx_program1))); + add(new Program("哈图", String.valueOf(R.drawable.wx_program2))); + add(new Program("好货", String.valueOf(R.drawable.wx_program3))); + add(new Program("快闪", String.valueOf(R.drawable.wx_program4))); + add(new Program("蘑菇街", String.valueOf(R.drawable.wx_program5))); + }}; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_demo12); - Toolbar toolbar = findViewById(R.id.toolbar); - setSupportActionBar(toolbar); - + bottomView = findViewById(R.id.bottom_view); + weixinTitleBar = findViewById(R.id.weixin_title_bar); springView = findViewById(R.id.springview); - springView.setMovePara(1.3); + //设置状态栏为透明重叠(沉浸式) + StatusBarUtil.setTranslucent(this); + springView.setListener(new SpringView.OnFreshListener() { @Override public void onRefresh() { - new Handler().postDelayed(() -> springView.onFinishFreshAndLoad(), 2000); } @Override public void onLoadmore() { - new Handler().postDelayed(() -> springView.onFinishFreshAndLoad(), 2000); } }); - springView.setHeader(new WangyiHeader()); - springView.setFooter(new AliFooter(this)); + /////////////////////////////////// + //// 初始化微信小程序headerV2 //// + /////////////////////////////////// + + //微信headerV2 的构造函数需要bottomView,weixinTitleBar两个参数 + //bottomView 是页面底部导航条,weixinHeaderV2在拖拽过程中会控制它收起或弹出,可以是任意View,这里为了方便使用了material包下的BottomNavigationView + //weixinTitleBar 是页面顶部的标题栏,weixinHeaderV2在拖拽过程中会控制它进行动画交互 + //这两个参数均可为 null,为null则 weixinHeaderV2不会进行任何处理 + weixinHeaderV2 = new WeixinHeaderV2(bottomView, weixinTitleBar); + + //设置加载图片回调方法 + weixinHeaderV2.setOnLoadImgCallback((imageView, imgUrl, position) -> { + //在这个回调中自行使用项目中的图片加载框架加载网络图片,这里因为不想在demo中导入无关框架,所以直接加载本地图片演示 + imageView.setImageResource(Integer.parseInt(imgUrl)); + }); + //item 点击事件 + weixinHeaderV2.setOnProgramClickListener(this); + //item drop(拖拽删除)事件 + weixinHeaderV2.setOnProgramDropListener(this); + //“更多”按钮点击事件 + weixinHeaderV2.setOnMoreClickListener(this); + //“搜索框”点击事件 + weixinHeaderV2.setOnSearchClickListener(this); + + //设置小程序数据('最近使用') + //如果要添加数据到'我的小程序',调用addItemMine(...)方法 + weixinHeaderV2.addItemRecent(dataRecent); + + //设置header到SpringView + springView.setHeader(weixinHeaderV2); + } + + @Override + public void onClick(Program program, RecyclerView.ViewHolder holder, int position) { + Toast.makeText(Demo12Activity.this, program.getName() + " click", Toast.LENGTH_SHORT).show(); + } + + @Override + public boolean onDrop(Program program, RecyclerView.ViewHolder holder, int position) { + //返回ture会执行删除操作,false不删除,默认会删除 + return true; + } + + @Override + public void onSearchClick() { + Toast.makeText(this, "onSearchClick", Toast.LENGTH_SHORT).show(); + } + + @Override + public void onMoreClick() { + //弹出个对话框,点确定就随机添加一个小程序 + new AlertDialog.Builder(this) + .setMessage("确定要添加新的小程序?(仅测试)") + .setPositiveButton("确定", (dialog, which) -> { + if (weixinHeaderV2.getRecentProgramCount() >= 7) { + //'最近使用'最多只能有7条数据 + Toast.makeText(Demo12Activity.this, "已经放不下了", Toast.LENGTH_SHORT).show(); + return; + } + switch (new Random().nextInt(5)) { + case 0: + weixinHeaderV2.addItemRecent(new Program("ofo小黄车", String.valueOf(R.drawable.wx_program1))); + break; + case 1: + weixinHeaderV2.addItemRecent(new Program("哈图", String.valueOf(R.drawable.wx_program2))); + break; + case 2: + weixinHeaderV2.addItemRecent(new Program("好货", String.valueOf(R.drawable.wx_program3))); + break; + case 3: + weixinHeaderV2.addItemRecent(new Program("快闪", String.valueOf(R.drawable.wx_program4))); + break; + case 4: + weixinHeaderV2.addItemRecent(new Program("蘑菇街", String.valueOf(R.drawable.wx_program5))); + break; + } + }) + .create() + .show(); } } diff --git a/demo/src/main/java/com/liaoinstan/demospring/demo13/Demo13Activity.java b/demo/src/main/java/com/liaoinstan/demospring/demo13/Demo13Activity.java new file mode 100644 index 0000000..e75cf15 --- /dev/null +++ b/demo/src/main/java/com/liaoinstan/demospring/demo13/Demo13Activity.java @@ -0,0 +1,147 @@ +package com.liaoinstan.demospring.demo13; + +import android.graphics.Color; +import android.os.Bundle; +import android.os.Handler; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.TextView; +import android.widget.Toast; + +import androidx.annotation.NonNull; +import androidx.appcompat.app.AppCompatActivity; +import androidx.appcompat.widget.Toolbar; +import androidx.recyclerview.widget.DefaultItemAnimator; +import androidx.recyclerview.widget.RecyclerView; +import androidx.recyclerview.widget.StaggeredGridLayoutManager; + +import com.liaoinstan.demospring.R; +import com.liaoinstan.springview.aliheader.AliHeader; +import com.liaoinstan.springview.container.AutoFooter; +import com.liaoinstan.springview.utils.DensityUtil; +import com.liaoinstan.springview.widget.SpringView; + +import java.util.ArrayList; +import java.util.List; +import java.util.Random; + +public class Demo13Activity extends AppCompatActivity { + private List mDatas = new ArrayList<>(); + + private RecyclerView recyclerView; + private RecyclerViewAdapter recyclerViewAdapter; + private SpringView springView; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_demo13); + Toolbar toolbar = findViewById(R.id.toolbar); + setSupportActionBar(toolbar); + + initData(); + + recyclerView = findViewById(R.id.recycle); + recyclerView.setLayoutManager(new StaggeredGridLayoutManager(2, RecyclerView.VERTICAL)); +// recyclerView.setLayoutManager(new GridLayoutManager(Demo13Activity.this, 2, RecyclerView.VERTICAL, false)); + recyclerViewAdapter = new RecyclerViewAdapter(mDatas); + recyclerView.setAdapter(recyclerViewAdapter); + recyclerView.setItemAnimator(new DefaultItemAnimator()); + + springView = findViewById(R.id.springview); + springView.setListener(new SpringView.OnFreshListener() { + @Override + public void onRefresh() { + Toast.makeText(Demo13Activity.this, "onRefresh", Toast.LENGTH_SHORT).show(); + new Handler().postDelayed(() -> springView.onFinishFreshAndLoad(), 1000); + } + + @Override + public void onLoadmore() { + if (springView.getFooter(AutoFooter.class).isInProgress()) { + //模拟网络请求列表数据 + new Handler().postDelayed(() -> { + List remoteData = getRemoteData(); + if (remoteData != null) { + mDatas.addAll(remoteData); + recyclerViewAdapter.notifyItemInserted(mDatas.size() - 1); + } else { + springView.getFooter(AutoFooter.class).showBottomLine(); + } + }, 1000); + } + } + }); + springView.setHeader(new AliHeader(this)); + springView.setFooter(new AutoFooter()); + } + + //模拟请求服务器数据 + //如果数据小于25条就每次返回5条,大于25条就返回null,模拟服务器已经没有数据的情况,这只为演示 + private List getRemoteData() { + if (mDatas.size() < 25) { + List remoteData = new ArrayList<>(); + remoteData.add("add item"); + remoteData.add("add item"); + remoteData.add("add item"); + remoteData.add("add item"); + remoteData.add("add item"); + return remoteData; + } else { + return null; + } + } + + private void initData() { + for (int i = 0; i < 15; i++) { + mDatas.add(i == 0 ? "We are in RecyclerView" : (i == 1 ? "SpringView新增了SCROLL模式\n\n基于这种模式可以实现自动加载等效果\n\n下拉到底部试试" : "")); + } + } + + /** + * Adapter for RecyclerView + */ + public static class RecyclerViewAdapter extends RecyclerView.Adapter { + private List results; + + public RecyclerViewAdapter(List results) { + this.results = results; + } + + @NonNull + @Override + public SampleViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + final View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item, parent, false); + return new SampleViewHolder(view); + } + + @Override + public void onBindViewHolder(@NonNull final SampleViewHolder holder, final int position) { + holder.text_item.setText(results.get(position)); + Random random = new Random(position); + //瀑布流:给item设置一个随机的颜色 + int color = Color.argb(88, random.nextInt(256), random.nextInt(256), random.nextInt(256)); + holder.text_item.setBackgroundColor(color); + holder.text_item.setTextColor(Color.WHITE); + //瀑布流:给item设置一个随机的高度 + ViewGroup.LayoutParams layoutParams = holder.itemView.getLayoutParams(); + layoutParams.height = 300 + DensityUtil.dp2px(random.nextInt(60)); + holder.itemView.setLayoutParams(layoutParams); + } + + @Override + public int getItemCount() { + return results.size(); + } + + class SampleViewHolder extends RecyclerView.ViewHolder { + TextView text_item; + + SampleViewHolder(View view) { + super(view); + text_item = view.findViewById(R.id.item_text); + } + } + } +} diff --git a/demo/src/main/java/com/liaoinstan/demospring/demo14/Demo14Activity.java b/demo/src/main/java/com/liaoinstan/demospring/demo14/Demo14Activity.java new file mode 100644 index 0000000..05ccb35 --- /dev/null +++ b/demo/src/main/java/com/liaoinstan/demospring/demo14/Demo14Activity.java @@ -0,0 +1,47 @@ +package com.liaoinstan.demospring.demo14; + +import android.os.Bundle; +import android.os.Handler; + +import androidx.appcompat.app.AppCompatActivity; +import androidx.appcompat.widget.Toolbar; + +import com.liaoinstan.demospring.R; +import com.liaoinstan.springview.duheader.DuHeader; +import com.liaoinstan.springview.duheader.TopBarFrameLayout; +import com.liaoinstan.springview.widget.SpringView; + +public class Demo14Activity extends AppCompatActivity { + + private SpringView springView; + private TopBarFrameLayout topBarFrameLayout; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_demo14); + Toolbar toolbar = findViewById(R.id.toolbar); + setSupportActionBar(toolbar); + + topBarFrameLayout = findViewById(R.id.top_bar_frame_layout); + springView = findViewById(R.id.springview); + springView.setListener(new SpringView.OnFreshListener() { + @Override + public void onRefresh() { + new Handler().postDelayed(() -> { + //0.5秒后再结束header刷新动画(模仿'毒'的延迟,大概0.5秒左右) + springView.onFinishFreshAndLoadDelay(500); + //开始展开topBar顶部提示,并在2.5秒回自动收回 + topBarFrameLayout.setTopBarText("为你更新20条新内容"); + topBarFrameLayout.showAndHideDelay(2500); + }, 2000); + } + + @Override + public void onLoadmore() { + new Handler().postDelayed(() -> springView.onFinishFreshAndLoad(), 2000); + } + }); + springView.setHeader(new DuHeader()); + } +} diff --git a/demo/src/main/java/com/liaoinstan/demospring/demo2/Demo2Activity.java b/demo/src/main/java/com/liaoinstan/demospring/demo2/Demo2Activity.java index 7bc5b13..5e179b6 100644 --- a/demo/src/main/java/com/liaoinstan/demospring/demo2/Demo2Activity.java +++ b/demo/src/main/java/com/liaoinstan/demospring/demo2/Demo2Activity.java @@ -3,8 +3,6 @@ import android.graphics.Color; import android.os.Bundle; import android.os.Handler; -import androidx.appcompat.app.AppCompatActivity; -import androidx.appcompat.widget.Toolbar; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -12,6 +10,9 @@ import android.widget.ListView; import android.widget.TextView; +import androidx.appcompat.app.AppCompatActivity; +import androidx.appcompat.widget.Toolbar; + import com.liaoinstan.demospring.R; import com.liaoinstan.springview.rotationheader.RotationFooter; import com.liaoinstan.springview.rotationheader.RotationHeader; @@ -52,8 +53,8 @@ public void onLoadmore() { new Handler().postDelayed(() -> springView.onFinishFreshAndLoad(), 1000); } }); - springView.setHeader(new RotationHeader(this)); - springView.setFooter(new RotationFooter(this)); + springView.setHeader(new RotationHeader()); + springView.setFooter(new RotationFooter()); } private void initData() { diff --git a/demo/src/main/java/com/liaoinstan/demospring/demo3/Demo3Activity.java b/demo/src/main/java/com/liaoinstan/demospring/demo3/Demo3Activity.java index 288f504..7c2a7bd 100644 --- a/demo/src/main/java/com/liaoinstan/demospring/demo3/Demo3Activity.java +++ b/demo/src/main/java/com/liaoinstan/demospring/demo3/Demo3Activity.java @@ -46,7 +46,6 @@ protected void onCreate(Bundle savedInstanceState) { recyclerView.setItemAnimator(new DefaultItemAnimator()); springView = findViewById(R.id.springview); - springView.setType(SpringView.Type.FOLLOW); springView.setListener(new SpringView.OnFreshListener() { @Override public void onRefresh() { @@ -63,7 +62,7 @@ public void onLoadmore() { } private void initData() { - for (int i = 0; i < 10; i++) { + for (int i = 0; i < 14; i++) { mDatas.add(i == 0 ? "We are in RecyclerView" : (i == 3 ? "SpringView支持RecyclerView\n\n这是一个仿阿里旅行的header\n\nlogo可以图片可自行替换" : "")); } } diff --git a/demo/src/main/java/com/liaoinstan/demospring/demo4/Demo4Activity.java b/demo/src/main/java/com/liaoinstan/demospring/demo4/Demo4Activity.java index 439e269..f3a17d3 100644 --- a/demo/src/main/java/com/liaoinstan/demospring/demo4/Demo4Activity.java +++ b/demo/src/main/java/com/liaoinstan/demospring/demo4/Demo4Activity.java @@ -27,6 +27,5 @@ protected void onCreate(Bundle savedInstanceState) { WebSettings settings = webView.getSettings(); settings.setJavaScriptEnabled(true); webView.loadUrl("https://github.com"); //https://github.com //http://cn.bing.com/ - } } diff --git a/demo/src/main/java/com/liaoinstan/demospring/demo6/Demo6Activity.java b/demo/src/main/java/com/liaoinstan/demospring/demo6/Demo6Activity.java index 83d64af..81c5266 100644 --- a/demo/src/main/java/com/liaoinstan/demospring/demo6/Demo6Activity.java +++ b/demo/src/main/java/com/liaoinstan/demospring/demo6/Demo6Activity.java @@ -26,7 +26,6 @@ protected void onCreate(Bundle savedInstanceState) { ((RadioGroup) findViewById(R.id.group_header)).setOnCheckedChangeListener(this); springView = findViewById(R.id.springview); - springView.setMovePara(1.5f); //设置拖拽系数(值越大,移动越慢) springView.setListener(new SpringView.OnFreshListener() { @Override public void onRefresh() { @@ -40,7 +39,7 @@ public void onLoadmore() { new Handler().postDelayed(() -> springView.onFinishFreshAndLoad(), 1000); } }); - springView.setHeader(new QQHeader()); + springView.setHeader(new QQHeader().setMovePara(1.5f)); //设置拖拽系数(值越大,移动越慢) springView.setFooter(new DefaultFooter(this, R.drawable.progress_small)); } @@ -48,11 +47,9 @@ public void onLoadmore() { public void onCheckedChanged(RadioGroup group, int checkedId) { switch (checkedId) { case R.id.drag_header: - springView.setType(SpringView.Type.OVERLAP); //重叠模式 springView.setHeader(new QQHeader()); break; case R.id.nomal_header: - springView.setType(SpringView.Type.FOLLOW); //跟随模式 springView.setHeader(new DefaultHeader(this)); break; } diff --git a/demo/src/main/java/com/liaoinstan/demospring/demo6/QQHeader.java b/demo/src/main/java/com/liaoinstan/demospring/demo6/QQHeader.java index b3233a5..0200a26 100644 --- a/demo/src/main/java/com/liaoinstan/demospring/demo6/QQHeader.java +++ b/demo/src/main/java/com/liaoinstan/demospring/demo6/QQHeader.java @@ -6,20 +6,27 @@ import android.widget.TextView; import com.liaoinstan.demospring.R; -import com.liaoinstan.springview.container.BaseHeader; +import com.liaoinstan.springview.container.BaseSimpleHeader; +import com.liaoinstan.springview.widget.SpringView; /** * Created by liaoinstan on 2016/3/23. * 简单定制的QQ新年刷红包效果,可以在此基础上自己增加动画特效,这里只是模拟出该效果框架进行演示,故该Header不放在library里面 */ -public class QQHeader extends BaseHeader { +//TODO:重构后该demo失效,待修复 +public class QQHeader extends BaseSimpleHeader { private TextView text_dot; private int dotcount; + public QQHeader() { + setType(SpringView.Type.OVERLAP); + setMovePara(2.0f); + } + @Override public View getView(LayoutInflater inflater, ViewGroup viewGroup) { - View view = inflater.inflate(R.layout.header_qq, viewGroup, true); + View view = inflater.inflate(R.layout.header_qq, viewGroup, false); text_dot = view.findViewById(R.id.text_dot); return view; } @@ -41,6 +48,12 @@ public int getDragSpringHeight(View rootView) { @Override public void onPreDrag(View rootView) { + dotcount++; + text_dot.setText("x" + dotcount); + } + + @Override + public void onFinishDrag(View rootView) { } @Override @@ -53,8 +66,6 @@ public void onLimitDes(View rootView, boolean upORdown) { @Override public void onStartAnim() { - dotcount++; - text_dot.setText("x" + dotcount); } @Override diff --git a/demo/src/main/java/com/liaoinstan/demospring/demo7/Demo7Activity.java b/demo/src/main/java/com/liaoinstan/demospring/demo7/Demo7Activity.java index e4634f5..2dd1d01 100644 --- a/demo/src/main/java/com/liaoinstan/demospring/demo7/Demo7Activity.java +++ b/demo/src/main/java/com/liaoinstan/demospring/demo7/Demo7Activity.java @@ -30,7 +30,6 @@ protected void onCreate(Bundle savedInstanceState) { setSupportActionBar(toolbar); springView = findViewById(R.id.springview); - springView.setType(SpringView.Type.FOLLOW); springView.setListener(new SpringView.OnFreshListener() { @Override public void onRefresh() { diff --git a/demo/src/main/java/com/liaoinstan/demospring/demo8/Demo8Activity.java b/demo/src/main/java/com/liaoinstan/demospring/demo8/Demo8Activity.java index 7f92497..7664d69 100644 --- a/demo/src/main/java/com/liaoinstan/demospring/demo8/Demo8Activity.java +++ b/demo/src/main/java/com/liaoinstan/demospring/demo8/Demo8Activity.java @@ -36,7 +36,6 @@ protected void onCreate(Bundle savedInstanceState) { initData(); springView = findViewById(R.id.springview); - springView.setType(SpringView.Type.FOLLOW); springView.setListener(new SpringView.OnFreshListener() { @Override public void onRefresh() { @@ -63,7 +62,7 @@ public void onLoadmore() { private void initData() { for (int i = 0; i < 20; i++) { - mDatas.add(i == 0 ? "SpringView处理了水平滑动的手势冲突,侧滑删除试试" : "item" + i); + mDatas.add(i == 0 ? "SpringView不会和水平滑动有冲突,侧滑删除试试" : "item" + i); } } diff --git a/demo/src/main/java/com/liaoinstan/demospring/demo9/Demo9FragmentNote.java b/demo/src/main/java/com/liaoinstan/demospring/demo9/Demo9FragmentNote.java index ac4c7fe..fcf14de 100644 --- a/demo/src/main/java/com/liaoinstan/demospring/demo9/Demo9FragmentNote.java +++ b/demo/src/main/java/com/liaoinstan/demospring/demo9/Demo9FragmentNote.java @@ -2,13 +2,13 @@ import android.os.Bundle; import android.os.Handler; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.fragment.app.Fragment; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; import com.liaoinstan.demospring.R; import com.liaoinstan.springview.rotationheader.RotationFooter; @@ -56,9 +56,8 @@ public void onActivityCreated(@Nullable Bundle savedInstanceState) { private void initView() { //初始化SpringView springView = rootView.findViewById(R.id.springview); - springView.setType(SpringView.Type.OVERLAP); //设为重叠样式 - springView.setHeader(new RotationHeader(getContext())); - springView.setFooter(new RotationFooter(getContext())); + springView.setHeader(new RotationHeader()); + springView.setFooter(new RotationFooter()); springView.setListener(new SpringView.OnFreshListener() { @Override public void onRefresh() { diff --git a/demo/src/main/java/com/liaoinstan/demospring/demox/DemoXActivity.java b/demo/src/main/java/com/liaoinstan/demospring/demox/DemoXActivity.java new file mode 100644 index 0000000..639355b --- /dev/null +++ b/demo/src/main/java/com/liaoinstan/demospring/demox/DemoXActivity.java @@ -0,0 +1,46 @@ +package com.liaoinstan.demospring.demox; + +import android.os.Bundle; +import android.os.Handler; + +import androidx.appcompat.app.AppCompatActivity; +import androidx.appcompat.widget.Toolbar; + +import com.liaoinstan.demospring.R; +import com.liaoinstan.springview.aliheader.AliFooter; +import com.liaoinstan.springview.wangyiheader.WangyiHeader; +import com.liaoinstan.springview.widget.SpringView; + +/** + * 这是仿网易新闻的例子,使用了SpringView新增的'收场动画'特性 + * 目前该特性还处于试验阶段,并未正式发布,如果效果不佳可能在后续版本移除,目前暂时移除掉这个例子 + */ +public class DemoXActivity extends AppCompatActivity { + + private SpringView springView; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_demox); + Toolbar toolbar = findViewById(R.id.toolbar); + setSupportActionBar(toolbar); + + springView = findViewById(R.id.springview); + springView.setMovePara(1.3f); + springView.setListener(new SpringView.OnFreshListener() { + @Override + public void onRefresh() { + new Handler().postDelayed(() -> springView.onFinishFreshAndLoad(), 2000); + } + + @Override + public void onLoadmore() { + new Handler().postDelayed(() -> springView.onFinishFreshAndLoad(), 2000); + } + }); + springView.setHeader(new WangyiHeader()); + springView.setFooter(new AliFooter(this)); + + } +} diff --git a/demo/src/main/java/com/liaoinstan/demospring/test/TestActivity.java b/demo/src/main/java/com/liaoinstan/demospring/test/TestActivity.java index dbd2f21..9b62cd7 100644 --- a/demo/src/main/java/com/liaoinstan/demospring/test/TestActivity.java +++ b/demo/src/main/java/com/liaoinstan/demospring/test/TestActivity.java @@ -54,6 +54,9 @@ public void onCheckedChanged(RadioGroup group, int checkedId) { case R.id.drag: springView.setType(SpringView.Type.DRAG); break; + case R.id.scroll: + springView.setType(SpringView.Type.SCROLL); + break; case R.id.both: springView.setGive(SpringView.Give.BOTH); break; diff --git a/demo/src/main/java/com/liaoinstan/demospring/utils/StatusBarUtil.java b/demo/src/main/java/com/liaoinstan/demospring/utils/StatusBarUtil.java new file mode 100644 index 0000000..6fb9d05 --- /dev/null +++ b/demo/src/main/java/com/liaoinstan/demospring/utils/StatusBarUtil.java @@ -0,0 +1,79 @@ +package com.liaoinstan.demospring.utils; + +import android.app.Activity; +import android.graphics.Color; +import android.os.Build; +import android.view.View; +import android.view.Window; +import android.view.WindowManager; + +import androidx.annotation.ColorInt; +import androidx.annotation.ColorRes; +import androidx.core.content.ContextCompat; + +/** + * 状态栏样式工具栏 + */ +public class StatusBarUtil { + //修改状态栏为全透明 + public static void setTranslucent(Activity activity) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + setBarOverlap(activity); + setStatusBarColorInt(activity, Color.TRANSPARENT); + } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { + Window window = activity.getWindow(); + window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); //4.4设置的透明样式 + } + } + + public static void setStatusBarColor(Activity activity, @ColorRes int colorResId) { + setStatusBarColorInt(activity, ContextCompat.getColor(activity, colorResId)); + } + + //设置状态栏背景色 + public static void setStatusBarColorInt(Activity activity, @ColorInt int color) { + if (activity == null) return; + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + Window window = activity.getWindow(); + window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); //清除4.4设置的透明样式 + window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS); + window.setStatusBarColor(color); + } + } + + //设置状态栏重叠样式 + public static void setBarOverlap(Activity activity) { + Window window = activity.getWindow(); + window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN); +// | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION +// | View.SYSTEM_UI_FLAG_LAYOUT_STABLE); + } + + //设置状态栏正常状态(系统默认) + public static void setBarFollow(Activity activity) { + Window window = activity.getWindow(); + window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_VISIBLE); + } + + //设置状态栏深色文字 + public static void setTextDark(Activity activity) { + Window window = activity.getWindow(); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + //6.0以上调用系统方法 + window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); //清除4.4设置的透明样式 + window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS); + int flag = window.getDecorView().getSystemUiVisibility() | View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR; + window.getDecorView().setSystemUiVisibility(flag); + } + } + + //设置状态栏浅色文字 + public static void setTextLight(Activity activity) { + Window window = activity.getWindow(); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + //6.0以上调用系统方法 + int flag = window.getDecorView().getSystemUiVisibility() & ~View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR; + window.getDecorView().setSystemUiVisibility(flag); + } + } +} diff --git a/demo/src/main/java/com/liaoinstan/demospring/warning/WarningHeader.java b/demo/src/main/java/com/liaoinstan/demospring/warning/WarningHeader.java index a0c283e..64ca40f 100644 --- a/demo/src/main/java/com/liaoinstan/demospring/warning/WarningHeader.java +++ b/demo/src/main/java/com/liaoinstan/demospring/warning/WarningHeader.java @@ -18,7 +18,7 @@ public class WarningHeader extends BaseHeader { @Override public View getView(LayoutInflater inflater, ViewGroup viewGroup) { - View view = inflater.inflate(R.layout.header_warning, viewGroup, true); + View view = inflater.inflate(R.layout.header_warning, viewGroup, false); textView = view.findViewById(R.id.textView); return view; } diff --git a/demo/src/main/res/color/weixin_color_select.xml b/demo/src/main/res/color/weixin_color_select.xml new file mode 100644 index 0000000..d635501 --- /dev/null +++ b/demo/src/main/res/color/weixin_color_select.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/demo/src/main/res/drawable/ic_dashboard_black_24dp.xml b/demo/src/main/res/drawable/ic_dashboard_black_24dp.xml new file mode 100644 index 0000000..46fc8de --- /dev/null +++ b/demo/src/main/res/drawable/ic_dashboard_black_24dp.xml @@ -0,0 +1,9 @@ + + + diff --git a/demo/src/main/res/drawable/ic_home_black_24dp.xml b/demo/src/main/res/drawable/ic_home_black_24dp.xml new file mode 100644 index 0000000..f8bb0b5 --- /dev/null +++ b/demo/src/main/res/drawable/ic_home_black_24dp.xml @@ -0,0 +1,9 @@ + + + diff --git a/demo/src/main/res/drawable/ic_notifications_black_24dp.xml b/demo/src/main/res/drawable/ic_notifications_black_24dp.xml new file mode 100644 index 0000000..78b75c3 --- /dev/null +++ b/demo/src/main/res/drawable/ic_notifications_black_24dp.xml @@ -0,0 +1,9 @@ + + + diff --git a/demo/src/main/res/layout/activity_demo1.xml b/demo/src/main/res/layout/activity_demo1.xml index 059eddd..fbaf87c 100644 --- a/demo/src/main/res/layout/activity_demo1.xml +++ b/demo/src/main/res/layout/activity_demo1.xml @@ -22,89 +22,81 @@ - - + android:layout_height="match_parent"> - + android:layout_height="match_parent" + android:orientation="vertical"> - - - - - - - - - - - - - - - - - - - - - - - - - - - + android:layout_height="200dp" + android:background="#68b3f3" + android:gravity="center" + android:text="We are in ScrollView" + android:textColor="#ffffff" /> + + + + + + + + + + + + + + + + + + + + + + diff --git a/demo/src/main/res/layout/activity_demo10.xml b/demo/src/main/res/layout/activity_demo10.xml index b8e0114..08c7d0b 100644 --- a/demo/src/main/res/layout/activity_demo10.xml +++ b/demo/src/main/res/layout/activity_demo10.xml @@ -32,7 +32,6 @@ android:id="@+id/springview" android:layout_width="match_parent" android:layout_height="match_parent" - android:layout_weight="1" android:background="#ffffff"> @@ -46,7 +45,7 @@ - - - - - - - + android:background="@color/weixin_bg" + tools:ignore="ContentDescription"> + android:layout_height="match_parent"> - - - - - - - - + android:clipToPadding="false" + android:paddingTop="70dp" + android:paddingBottom="?attr/actionBarSize"> - - - - - - - + + + + + + - - - - + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_gravity="center_vertical" + android:layout_marginLeft="12dp" + android:layout_marginRight="12dp" + android:text="微信(2)" + android:textColor="@color/weixin_blank" + android:textSize="17sp" /> + + + + + + - + + + diff --git a/demo/src/main/res/layout/activity_demo13.xml b/demo/src/main/res/layout/activity_demo13.xml new file mode 100644 index 0000000..db18078 --- /dev/null +++ b/demo/src/main/res/layout/activity_demo13.xml @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/demo/src/main/res/layout/activity_demo14.xml b/demo/src/main/res/layout/activity_demo14.xml new file mode 100644 index 0000000..3d9bc23 --- /dev/null +++ b/demo/src/main/res/layout/activity_demo14.xml @@ -0,0 +1,103 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/demo/src/main/res/layout/activity_demo2.xml b/demo/src/main/res/layout/activity_demo2.xml index b498d65..de59053 100644 --- a/demo/src/main/res/layout/activity_demo2.xml +++ b/demo/src/main/res/layout/activity_demo2.xml @@ -5,7 +5,7 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:fitsSystemWindows="true" - tools:context="com.liaoinstan.demospring.demo1.Demo1Activity"> + tools:context="com.liaoinstan.demospring.demo2.Demo2Activity"> + android:background="#ffffff"> - - + android:background="#ffffff"> @@ -50,8 +47,8 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="bottom|right" - android:layout_marginBottom="90dp" android:layout_marginRight="20dp" + android:layout_marginBottom="90dp" android:orientation="vertical">