diff --git a/.gitignore b/.gitignore index 5fa6bf0..39fb081 100644 --- a/.gitignore +++ b/.gitignore @@ -1,33 +1,9 @@ -# built application files -*.apk -*.ap_ - -# files for the dex VM -*.dex - -# Java class files -*.class - -# generated files -bin/ -gen/ - -# Local configuration file (sdk path, etc) -local.properties - -# Eclipse project files -.classpath -.project - -# Android Studio -.idea/ -.gradle -/*/local.properties -/*/out -build -/*/*/production *.iml -*.iws -*.ipr -*~ -*.swp \ No newline at end of file +.gradle +/local.properties +/.idea/workspace.xml +/.idea/libraries +.DS_Store +/build +/captures +.externalNativeBuild diff --git a/.idea/caches/build_file_checksums.ser b/.idea/caches/build_file_checksums.ser new file mode 100644 index 0000000..d35314d Binary files /dev/null and b/.idea/caches/build_file_checksums.ser differ diff --git a/.idea/caches/gradle_models.ser b/.idea/caches/gradle_models.ser new file mode 100644 index 0000000..5e80bbc Binary files /dev/null and b/.idea/caches/gradle_models.ser differ diff --git a/.idea/codeStyles/Project.xml b/.idea/codeStyles/Project.xml new file mode 100644 index 0000000..30aa626 --- /dev/null +++ b/.idea/codeStyles/Project.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/gradle.xml b/.idea/gradle.xml new file mode 100644 index 0000000..824b9ce --- /dev/null +++ b/.idea/gradle.xml @@ -0,0 +1,22 @@ + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..fc988af --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,44 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..b43026d --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/.idea/runConfigurations.xml b/.idea/runConfigurations.xml new file mode 100644 index 0000000..7f68460 --- /dev/null +++ b/.idea/runConfigurations.xml @@ -0,0 +1,12 @@ + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..94a25f7 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/README.md b/README.md index 1a91aa0..c58e68c 100644 --- a/README.md +++ b/README.md @@ -3,18 +3,22 @@ ConvenientBanner =========== -通用的广告栏控件,让你轻松实现广告头效果。支持无限循环,可以设置自动翻页和时间(而且非常智能,手指触碰则暂停翻页,离开自动开始翻页。你也可以设置在界面onPause的时候不进行自动翻页,onResume之后继续自动翻页),并且提供多种翻页特效。 -对比其他广告栏控件,大多都需要对源码进行改动才能加载网络图片,或者帮你集成不是你所需要的图片缓存库。而这个库能让有代码洁癖的你欢喜,不需要对库源码进行修改你就可以使用任何你喜欢的网络图片库进行配合。 +ͨ�õĹ�����ؼ�����������ʵ�ֹ��ͷЧ����֧������ѭ�������������Զ���ҳ��ʱ��(���ҷdz����ܣ���ָ��������ͣ��ҳ���뿪�Զ���ʼ��ҳ����Ҳ���������ڽ���onPause��ʱ�򲻽����Զ���ҳ��onResume֮������Զ���ҳ)�������ṩ���ַ�ҳ��Ч�� +�Ա�����������ؼ�����඼��Ҫ��Դ����иĶ����ܼ�������ͼƬ�����߰��㼯�ɲ���������Ҫ��ͼƬ����⡣������������д�������㻶ϲ������Ҫ�Կ�Դ������޸���Ϳ���ʹ���κ���ϲ��������ͼƬ�������ϡ� ## Demo -用模拟器运行的效果,鼠标拨动和模拟器太卡等原因,实际效果比效果图更炫哦~~ +��ģ�������е�Ч������겦����ģ����̫����ԭ��ʵ��Ч����Ч��ͼ����Ŷ���� ![](https://github.com/saiwu-bigkoo/Android-ConvenientBanner/blob/master/preview/convenientbannerdemo.gif) -- [demo代码请看戳这里](https://github.com/saiwu-bigkoo/Android-ConvenientBanner/blob/master/app/src/main/java/com/bigkoo/convenientbannerdemo/MainActivity.java) +- [demo�����뿴������](https://github.com/saiwu-bigkoo/Android-ConvenientBanner/blob/master/app/src/main/java/com/bigkoo/convenientbannerdemo/MainActivity.java) -demo是用Module方式依赖,你也可以使用gradle 依赖: -```java - compile 'com.bigkoo:convenientbanner:2.0.4' +demo����Module��ʽ��������Ҳ����ʹ��gradle ����: +```java + implementation 'com.bigkoo:convenientbanner:2.1.5'//��ַ��Сд�ˣ������ + implementation 'androidx.recyclerview:recyclerview:1.0.0+' + +// compile 'com.bigkoo:ConvenientBanner:2.1.4'//��ַ��ConvenientBanner ��д�ˣ������ +//compile 'com.bigkoo:convenientbanner:2.0.5'�ɰ� ``` @@ -26,30 +30,35 @@ demo是用Module方式依赖,你也可以使用gradle 依赖: android:id="@+id/convenientBanner" android:layout_width="match_parent" android:layout_height="200dp" - app:canLoop="true" //控制循环与否 + app:canLoop="true" //����ѭ����� /> ``` ### config in java code ```java -//自定义你的Holder,实现更多复杂的界面,不一定是图片翻页,其他任何控件翻页亦可。 +//�Զ������Holder��ʵ�ָ��ิ�ӵĽ��棬��һ����ͼƬ��ҳ�������κοؼ���ҳ��ɡ� convenientBanner.setPages( - new CBViewHolderCreator() { + new CBViewHolderCreator() { + @Override + public LocalImageHolderView createHolder(View itemView) { + return new LocalImageHolderView(itemView); + } + @Override - public LocalImageHolderView createHolder() { - return new LocalImageHolderView(); + public int getLayoutId() { + return R.layout.item_localimage; } }, localImages) - //设置两个点图片作为翻页指示器,不设置则没有指示器,可以根据自己需求自行配合自己的指示器,不需要圆点指示器可用不设 - .setPageIndicator(new int[]{R.drawable.ic_page_indicator, R.drawable.ic_page_indicator_focused}) - //设置指示器的方向 - .setPageIndicatorAlign(ConvenientBanner.PageIndicatorAlign.ALIGN_PARENT_RIGHT) - //设置翻页的效果,不需要翻页效果可用不设 - //.setPageTransformer(Transformer.DefaultTransformer); 集成特效之后会有白屏现象,新版已经分离,如果要集成特效的例子可以看Demo的点击响应。 -// convenientBanner.setManualPageable(false);//设置不能手动影响 - -public class LocalImageHolderView implements CBPageAdapter.Holder{ + //����������ͼƬ��Ϊ��ҳָʾ������������û��ָʾ�������Ը����Լ�������������Լ���ָʾ��,����ҪԲ��ָʾ�����ò��� +// .setPageIndicator(new int[]{R.drawable.ic_page_indicator, R.drawable.ic_page_indicator_focused}) + .setOnItemClickListener(this); + //����ָʾ���ķ��� +// .setPageIndicatorAlign(ConvenientBanner.PageIndicatorAlign.ALIGN_PARENT_RIGHT) +// .setOnPageChangeListener(this)//������ҳ�¼� + ; + +public class LocalImageHolderView implements Holder{ private ImageView imageView; @Override public View createView(Context context) { @@ -70,39 +79,40 @@ public class LocalImageHolderView implements CBPageAdapter.Holder{ - [ViewPagerTransforms](https://github.com/ToxicBakery/ViewPagerTransforms) - [salvage](https://github.com/JakeWharton/salvage) - [LoopingViewPager](https://github.com/imbryk/LoopingViewPager) +- [RecyclerViewCardGallery](https://github.com/zjw-swun/RecyclerViewCardGallery) + +>## ����˵�� + +>v2.1.5 + - androidx
+ +>v2.1.4 + - ����Ϊ�յ�ʱ���쳣������
+ +>v2.1.3 + - notifyDataSetChange��ʱ�򣬻ص�0��λ�á�
+ + +>v2.1.2 + - ����setlayoutManager�ˡ�
+ +>v2.1.1 + - �ڲ�ʵ�ָ�Ϊ���Զ����LinearSnapHelper��ΪPagerSnapHelper��
+ +>v2.1.0 + - �޸�������ָʾ���ͱ�������
+ +>v2.0.9 + - ��¶canLoop��API��̬����
+ +>v2.0.8 + - ������Ϊ�б�����header demo���޸�loopģʽ�µ�һ�ε�ָʾ��ͼ�겻ѡ������
+ +>v2.0.7 + - ������PhotoView��Fresco��ϱ�Ϊ����ͼƬԤ���ؼ����ӣ�������ȡ�����õ�ǰposition api
+ +>v2.0.6 + - ʹ��RecycleView��������ʵ�֣�api�������ı䣬����xml���÷�ҳʱ��
->## 更新说明 ->v1.1.0 修复了往前滑动最后一页会变空白页的BUG
->v1.1.1 修复第三方图库下载setTag出错的BUG
- ->v1.1.2 - - 修复下拉刷新自动翻页偶尔失效停止BUG
- - 提供onPageChangeListener的API调用
- ->v1.1.3 - - 循环控制,可以设置为不循环模式
- - 加入OnItemClcikListener监听器,修复原先点击图片position失准BUG
- - 调整notifyDataSetChanged函数,并加入notifyDataSetAdd函数
- ->v1.1.4 - - getCurrentPageIndex函数改为getCurrentItem
- - 加入setcurrentitem函数
- ->v2.0.0 - - 重新修改循环逻辑
- - 解决卡顿和白屏现象
- - Demo中加入下拉刷新和控件左右拨动冲突方案
- ->v2.0.1 - - 回滚到1.1.4的循环逻辑
- - 分离特效代码
- ->v2.0.2 - - 调整setOnItemClickListener
- - 加入代码New 控件和 add ListView的HeaderView效果例子
- ->v2.0.3 - - 逻辑由 301230 改为 012301230123—》当第一个0的时候变为第二个0,最后一个3的时候变为第二个3
- ->v2.0.4 - - 修复添加动画效果后点击无效问题
+>v2.0.5 + - ViewPagerʵ�ַ�ʽ
diff --git a/app/build.gradle b/app/build.gradle index bdc67e1..08bf387 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -1,30 +1,30 @@ apply plugin: 'com.android.application' android { - compileSdkVersion 21 - buildToolsVersion "20.0.0" - + compileSdkVersion 28 defaultConfig { applicationId "com.bigkoo.convenientbannerdemo" - minSdkVersion 14 + minSdkVersion 15 + targetSdkVersion 28 versionCode 1 versionName "1.0" } buildTypes { release { minifyEnabled false - proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } } } dependencies { - compile fileTree(dir: 'libs', include: ['*.jar']) -// compile 'com.android.support:appcompat-v7:21.0.3' -// compile 'com.bigkoo:convenientbanner:2.0.4' - compile files('libs/universal-image-loader-1.9.4.jar') - compile 'com.android.support:recyclerview-v7:21.0.3' - compile 'com.ToxicBakery.viewpager.transforms:view-pager-transforms:1.2.32@aar' - compile 'in.srain.cube:grid-view-with-header-footer:1.0.12' - compile project(':convenientbanner') + implementation 'androidx.appcompat:appcompat:1.1.0+' + implementation 'androidx.legacy:legacy-support-v4:1.0.0+' + implementation 'com.bigkoo:convenientbanner:2.1.5' + api 'com.facebook.fresco:fresco:1.3.0' + api 'me.relex:photodraweeview:1.1.3' + implementation 'com.github.CymChad:BaseRecyclerViewAdapterHelper:2.9.46' + // implementation project(':convenientbanner') + implementation 'androidx.recyclerview:recyclerview:1.0.0+' + implementation 'in.srain.cube:ultra-ptr:1.0.11' } diff --git a/app/libs/universal-image-loader-1.9.4.jar b/app/libs/universal-image-loader-1.9.4.jar deleted file mode 100644 index 871d0e8..0000000 Binary files a/app/libs/universal-image-loader-1.9.4.jar and /dev/null differ diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro index 71a43e0..f1b4245 100644 --- a/app/proguard-rules.pro +++ b/app/proguard-rules.pro @@ -1,17 +1,21 @@ # Add project specific ProGuard rules here. -# By default, the flags in this file are appended to flags specified -# in /Users/Sai/Documents/software/sdk/tools/proguard/proguard-android.txt -# You can edit the include path and order by changing the proguardFiles -# directive in build.gradle. +# You can control the set of applied configuration files using the +# proguardFiles setting 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 *; #} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile diff --git a/app/src/androidTest/java/com/bigkoo/convenientbannerdemo/ApplicationTest.java b/app/src/androidTest/java/com/bigkoo/convenientbannerdemo/ApplicationTest.java deleted file mode 100755 index d243ad5..0000000 --- a/app/src/androidTest/java/com/bigkoo/convenientbannerdemo/ApplicationTest.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.bigkoo.convenientbannerdemo; - -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/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index d288191..1e87bf7 100755 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -1,8 +1,7 @@ - + package="com.bigkoo.convenientbannerdemo"> - + + + - diff --git a/app/src/main/java/com/bigkoo/PtrFrameLayoutCompat.java b/app/src/main/java/com/bigkoo/PtrFrameLayoutCompat.java new file mode 100644 index 0000000..df45ce0 --- /dev/null +++ b/app/src/main/java/com/bigkoo/PtrFrameLayoutCompat.java @@ -0,0 +1,39 @@ +package com.bigkoo; + +import android.content.Context; +import android.util.AttributeSet; +import android.view.MotionEvent; + +import in.srain.cube.views.ptr.PtrFrameLayout; + +/** + * 2019/4/27 create by sai + **/ +public class PtrFrameLayoutCompat extends PtrFrameLayout { + private float mDownX; + private float mDownY; + + public PtrFrameLayoutCompat(Context context, AttributeSet attrs) { + super(context, attrs); + } + @Override + public boolean dispatchTouchEvent(MotionEvent ev) { + switch (ev.getAction()) { + case MotionEvent.ACTION_DOWN: + mDownX = ev.getRawX(); + mDownY = ev.getRawY(); + break; + case MotionEvent.ACTION_MOVE: + float moveX = ev.getRawX(); + float moveY = ev.getRawY(); + float diffX = Math.abs(moveX - mDownX); + float diffY = Math.abs(moveY - mDownY); + boolean isHorizon = Math.tan(diffY / diffX) < Math.tan(45.0); + if (isHorizon) { + return dispatchTouchEventSupper(ev); + } + break; + } + return super.dispatchTouchEvent(ev); + } +} diff --git a/app/src/main/java/com/bigkoo/convenientbannerdemo/AlbumActivity.java b/app/src/main/java/com/bigkoo/convenientbannerdemo/AlbumActivity.java new file mode 100644 index 0000000..009a218 --- /dev/null +++ b/app/src/main/java/com/bigkoo/convenientbannerdemo/AlbumActivity.java @@ -0,0 +1,75 @@ +package com.bigkoo.convenientbannerdemo; + +import android.app.Activity; +import android.os.Bundle; +import android.view.View; + +import com.bigkoo.convenientbanner.ConvenientBanner; +import com.bigkoo.convenientbanner.holder.CBViewHolderCreator; +import com.facebook.drawee.backends.pipeline.Fresco; + +import java.util.ArrayList; + +import me.relex.photodraweeview.OnViewTapListener; + +/** + * Created by Sai on 2018/4/26. + */ + +public class AlbumActivity extends Activity implements OnViewTapListener { + private ConvenientBanner convenientBanner; + private ArrayList images = new ArrayList<>(); + + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + //下面fresco初始化偷懒写在这了 + Fresco.initialize(getApplicationContext()); + setContentView(R.layout.activity_album); + initViews(); + init(); + } + + private void initViews() { + convenientBanner = (ConvenientBanner) findViewById(R.id.convenientBanner); + } + + private void init(){ + loadTestDatas(); + //图片例子 + convenientBanner.setPages( + new CBViewHolderCreator() { + @Override + public NetWorkImageHolderView createHolder(View itemView) { + return new NetWorkImageHolderView(itemView, AlbumActivity.this); + } + + @Override + public int getLayoutId() { + return R.layout.item_photoview; + } + }, images) + //设置两个点图片作为翻页指示器,不设置则没有指示器,可以根据自己需求自行配合自己的指示器,不需要圆点指示器可用不设 + .setPageIndicator(new int[]{R.drawable.ic_page_indicator, R.drawable.ic_page_indicator_focused}); + + } + + /* + 加入测试Views + * */ + private void loadTestDatas() { + //图片可能过期哦,自己换来测试吧 + images.add("https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1525319864&di=87f476652c96678547ccabbf112076be&imgtype=jpg&er=1&src=http%3A%2F%2Fimg.pconline.com.cn%2Fimages%2Fupload%2Fupc%2Ftx%2Fgamephotolib%2F1410%2F27%2Fc0%2F40170771_1414341013392.jpg"); + images.add("https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1524714908870&di=9d43d35cefbabacdc879733aa7ddc82b&imgtype=0&src=http%3A%2F%2Fimgsrc.baidu.com%2Fimage%2Fc0%253Dshijue1%252C0%252C0%252C294%252C40%2Fsign%3D46de93bfc711728b24208461a095a9bb%2F4610b912c8fcc3ce5423d51d9845d688d43f2038.jpg"); + images.add("https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1524714935901&di=052557513540f3d740eeeb2439c585bb&imgtype=0&src=http%3A%2F%2Fwww.gzlco.com%2Fimggzl%2F214%2F1b6e6520ca474fe4bd3ff728817950717651.jpeg"); + } + + + + @Override + public void onViewTap(View view, float x, float y) { + //单击关闭 + finish(); + } +} diff --git a/app/src/main/java/com/bigkoo/convenientbannerdemo/HeaderActivity.java b/app/src/main/java/com/bigkoo/convenientbannerdemo/HeaderActivity.java new file mode 100644 index 0000000..5fe71ff --- /dev/null +++ b/app/src/main/java/com/bigkoo/convenientbannerdemo/HeaderActivity.java @@ -0,0 +1,188 @@ +package com.bigkoo.convenientbannerdemo; + +import android.content.Intent; +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.View; +import android.widget.Toast; + +import com.bigkoo.PtrFrameLayoutCompat; +import com.bigkoo.convenientbanner.ConvenientBanner; +import com.bigkoo.convenientbanner.holder.CBViewHolderCreator; +import com.bigkoo.convenientbanner.listener.OnItemClickListener; +import com.chad.library.adapter.base.BaseQuickAdapter; +import com.chad.library.adapter.base.BaseViewHolder; + +import java.lang.reflect.Field; +import java.util.ArrayList; +import java.util.List; + +import androidx.annotation.Nullable; +import androidx.appcompat.app.AppCompatActivity; +import androidx.core.content.ContextCompat; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; +import in.srain.cube.views.ptr.PtrDefaultHandler; +import in.srain.cube.views.ptr.PtrFrameLayout; +import in.srain.cube.views.ptr.PtrHandler; +import in.srain.cube.views.ptr.header.MaterialHeader; + +/** + * Created by Sai on 2018/4/28. + */ + +public class HeaderActivity extends AppCompatActivity implements OnItemClickListener, BaseQuickAdapter.OnItemClickListener { + RecyclerView recyclerView; + MyAdapter adapter; + protected PtrFrameLayoutCompat ptrFrameLayout; + + ArrayList datas = new ArrayList<>(); + ConvenientBanner convenientBanner; + private ArrayList localImages = new ArrayList(); + + @Override + protected void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + init(); + } + + public void init() { + setContentView(R.layout.activity_header); + recyclerView = findViewById(R.id.recyclerView); + for(int i = 0; i< 100; i++) + datas.add("测试"+ i); + adapter = new MyAdapter(R.layout.item_header_text,datas ); + recyclerView.setLayoutManager(new LinearLayoutManager(this)); + recyclerView.setAdapter(adapter); + View header = initHeader(); + adapter.addHeaderView(header); + + adapter.setOnItemClickListener(this); + + + ptrFrameLayout = findViewById(R.id.ptrFrameLayout); + ptrFrameLayout.setKeepHeaderWhenRefresh(true); + ptrFrameLayout.disableWhenHorizontalMove(true); + + MaterialHeader headerView = new MaterialHeader(this); + headerView.setColorSchemeColors(new int[]{ContextCompat.getColor(getApplicationContext(),R.color.colorAccent)}); + headerView.setPadding(0, 50, 0, 50); + + ptrFrameLayout.setHeaderView(headerView); + ptrFrameLayout.setRatioOfHeaderHeightToRefresh(0.7f); + ptrFrameLayout.addPtrUIHandler(headerView); + PtrHandler ptrHandler = getPtrHandler(); + if (ptrHandler != null) { + ptrFrameLayout.setPtrHandler(ptrHandler); + } + + + } + + private View initHeader() { + + View header =LayoutInflater.from(this).inflate(R.layout.item_covenientbanner_header,null); + convenientBanner = (ConvenientBanner)header.findViewById(R.id.convenientBanner) ; + + loadTestDatas(); + //本地图片例子 + convenientBanner.setPages( + new CBViewHolderCreator() { + @Override + public LocalImageHolderView createHolder(View itemView) { + return new LocalImageHolderView(itemView); + } + + @Override + public int getLayoutId() { + return R.layout.item_localimage; + } + }, localImages) + //设置两个点图片作为翻页指示器,不设置则没有指示器,可以根据自己需求自行配合自己的指示器,不需要圆点指示器可用不设 + .setPageIndicator(new int[]{R.drawable.ic_page_indicator, R.drawable.ic_page_indicator_focused}) + .setOnItemClickListener(this); + + return header; + } + + private void loadTestDatas() { + //本地图片集合 + for (int position = 0; position < 7; position++) + localImages.add(getResId("ic_test_" + position, R.drawable.class)); + + } + /** + * 通过文件名获取资源id 例子:getResId("icon", R.drawable.class); + * + * @param variableName + * @param c + * @return + */ + public static int getResId(String variableName, Class c) { + try { + Field idField = c.getDeclaredField(variableName); + return idField.getInt(idField); + } catch (Exception e) { + e.printStackTrace(); + return -1; + } + } + + // 开始自动翻页 + @Override + protected void onResume() { + super.onResume(); +// //开始自动翻页 + convenientBanner.startTurning(); + } + + // 停止自动翻页 + @Override + protected void onPause() { + super.onPause(); +// //停止翻页 + convenientBanner.stopTurning(); + } + + @Override + public void onItemClick(int position) { + Toast.makeText(this,"点击了Banner第"+position+"个",Toast.LENGTH_SHORT).show(); + startActivity(new Intent(this, AlbumActivity.class)); + + } + + @Override + public void onItemClick(BaseQuickAdapter adapter, View view, int position) { + Toast.makeText(this,"点击了List第"+position+"个",Toast.LENGTH_SHORT).show(); + } + + public class MyAdapter extends BaseQuickAdapter { + public MyAdapter(int layoutResId, List data) { + super(layoutResId, data); + } + + @Override + protected void convert(BaseViewHolder helper, String item) { + helper.setText(R.id.tvText, item); + } + } + + PtrDefaultHandler ptrHandler; + public PtrHandler getPtrHandler() { + if(ptrHandler == null){ + ptrHandler = new PtrDefaultHandler() { + @Override + public boolean checkCanDoRefresh(PtrFrameLayout frame, View content, View header) { + return PtrDefaultHandler.checkContentCanBePulledDown(frame, content, header); + } + + @Override + public void onRefreshBegin(PtrFrameLayout frame) { + ptrFrameLayout.refreshComplete(); + } + }; + } + return ptrHandler; + } + +} diff --git a/app/src/main/java/com/bigkoo/convenientbannerdemo/LocalImageHolderView.java b/app/src/main/java/com/bigkoo/convenientbannerdemo/LocalImageHolderView.java index ea23dd9..1c586fb 100755 --- a/app/src/main/java/com/bigkoo/convenientbannerdemo/LocalImageHolderView.java +++ b/app/src/main/java/com/bigkoo/convenientbannerdemo/LocalImageHolderView.java @@ -1,6 +1,5 @@ package com.bigkoo.convenientbannerdemo; -import android.content.Context; import android.view.View; import android.widget.ImageView; @@ -10,17 +9,20 @@ * Created by Sai on 15/8/4. * 本地图片Holder例子 */ -public class LocalImageHolderView implements Holder { +public class LocalImageHolderView extends Holder { private ImageView imageView; + + public LocalImageHolderView(View itemView) { + super(itemView); + } + @Override - public View createView(Context context) { - imageView = new ImageView(context); - imageView.setScaleType(ImageView.ScaleType.FIT_XY); - return imageView; + protected void initView(View itemView) { + imageView =itemView.findViewById(R.id.ivPost); } @Override - public void UpdateUI(Context context, int position, Integer data) { + public void updateUI(Integer data) { imageView.setImageResource(data); } } diff --git a/app/src/main/java/com/bigkoo/convenientbannerdemo/MainActivity.java b/app/src/main/java/com/bigkoo/convenientbannerdemo/MainActivity.java index 01fb9e7..ffb7b22 100755 --- a/app/src/main/java/com/bigkoo/convenientbannerdemo/MainActivity.java +++ b/app/src/main/java/com/bigkoo/convenientbannerdemo/MainActivity.java @@ -1,33 +1,26 @@ package com.bigkoo.convenientbannerdemo; -import android.support.v4.view.ViewPager; -import android.support.v7.app.ActionBarActivity; +import android.content.Intent; import android.os.Bundle; import android.view.View; -import android.widget.AdapterView; -import android.widget.ArrayAdapter; import android.widget.ListView; import android.widget.Toast; -import com.ToxicBakery.viewpager.transforms.*; import com.bigkoo.convenientbanner.holder.CBViewHolderCreator; import com.bigkoo.convenientbanner.ConvenientBanner; import com.bigkoo.convenientbanner.listener.OnItemClickListener; -import com.nostra13.universalimageloader.cache.disc.naming.Md5FileNameGenerator; -import com.nostra13.universalimageloader.core.DisplayImageOptions; -import com.nostra13.universalimageloader.core.ImageLoader; -import com.nostra13.universalimageloader.core.ImageLoaderConfiguration; -import com.nostra13.universalimageloader.core.assist.QueueProcessingType; import java.lang.reflect.Field; import java.util.ArrayList; import java.util.List; +import androidx.appcompat.app.AppCompatActivity; + /** * Created by Sai on 15/7/30. * convenientbanner 控件 的 demo */ -public class MainActivity extends ActionBarActivity implements AdapterView.OnItemClickListener, ViewPager.OnPageChangeListener, OnItemClickListener { +public class MainActivity extends AppCompatActivity implements OnItemClickListener { private ConvenientBanner convenientBanner;//顶部广告栏控件 private ArrayList localImages = new ArrayList(); private List networkImages; @@ -41,8 +34,6 @@ public class MainActivity extends ActionBarActivity implements AdapterView.OnIte }; private ListView listView; - private ArrayAdapter transformerArrayAdapter; - private ArrayList transformerList = new ArrayList(); @Override protected void onCreate(Bundle savedInstanceState) { @@ -54,29 +45,31 @@ protected void onCreate(Bundle savedInstanceState) { private void initViews() { convenientBanner = (ConvenientBanner) findViewById(R.id.convenientBanner); - listView = (ListView) findViewById(R.id.listView); - transformerArrayAdapter = new ArrayAdapter(this,R.layout.adapter_transformer,transformerList); - listView.setAdapter(transformerArrayAdapter); - listView.setOnItemClickListener(this); } private void init(){ - initImageLoader(); +// initImageLoader(); loadTestDatas(); //本地图片例子 convenientBanner.setPages( - new CBViewHolderCreator() { + new CBViewHolderCreator() { @Override - public LocalImageHolderView createHolder() { - return new LocalImageHolderView(); + public LocalImageHolderView createHolder(View itemView) { + return new LocalImageHolderView(itemView); + } + + @Override + public int getLayoutId() { + return R.layout.item_localimage; } }, localImages) //设置两个点图片作为翻页指示器,不设置则没有指示器,可以根据自己需求自行配合自己的指示器,不需要圆点指示器可用不设 - .setPageIndicator(new int[]{R.drawable.ic_page_indicator, R.drawable.ic_page_indicator_focused}) +// .setPageIndicator(new int[]{R.drawable.ic_page_indicator, R.drawable.ic_page_indicator_focused}) + .setOnItemClickListener(this); //设置指示器的方向 // .setPageIndicatorAlign(ConvenientBanner.PageIndicatorAlign.ALIGN_PARENT_RIGHT) // .setOnPageChangeListener(this)//监听翻页事件 - .setOnItemClickListener(this); + ; // convenientBanner.setManualPageable(false);//设置不能手动影响 @@ -109,21 +102,21 @@ public LocalImageHolderView createHolder() { // listView.addHeaderView(mConvenientBanner); } - //初始化网络图片缓存库 - private void initImageLoader(){ - //网络图片例子,结合常用的图片缓存库UIL,你可以根据自己需求自己换其他网络图片库 - DisplayImageOptions defaultOptions = new DisplayImageOptions.Builder(). - showImageForEmptyUri(R.drawable.ic_default_adimage) - .cacheInMemory(true).cacheOnDisk(true).build(); - - ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder( - getApplicationContext()).defaultDisplayImageOptions(defaultOptions) - .threadPriority(Thread.NORM_PRIORITY - 2) - .denyCacheImageMultipleSizesInMemory() - .diskCacheFileNameGenerator(new Md5FileNameGenerator()) - .tasksProcessingOrder(QueueProcessingType.LIFO).build(); - ImageLoader.getInstance().init(config); - } +// //初始化网络图片缓存库 +// private void initImageLoader(){ +// //网络图片例子,结合常用的图片缓存库UIL,你可以根据自己需求自己换其他网络图片库 +// DisplayImageOptions defaultOptions = new DisplayImageOptions.Builder(). +// showImageForEmptyUri(R.drawable.ic_default_adimage) +// .cacheInMemory(true).cacheOnDisk(true).build(); +// +// ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder( +// getApplicationContext()).defaultDisplayImageOptions(defaultOptions) +// .threadPriority(Thread.NORM_PRIORITY - 2) +// .denyCacheImageMultipleSizesInMemory() +// .diskCacheFileNameGenerator(new Md5FileNameGenerator()) +// .tasksProcessingOrder(QueueProcessingType.LIFO).build(); +// ImageLoader.getInstance().init(config); +// } /* 加入测试Views * */ @@ -133,23 +126,23 @@ private void loadTestDatas() { localImages.add(getResId("ic_test_" + position, R.drawable.class)); -// //各种翻页效果 - transformerList.add(DefaultTransformer.class.getSimpleName()); - transformerList.add(AccordionTransformer.class.getSimpleName()); - transformerList.add(BackgroundToForegroundTransformer.class.getSimpleName()); - transformerList.add(CubeInTransformer.class.getSimpleName()); - transformerList.add(CubeOutTransformer.class.getSimpleName()); - transformerList.add(DepthPageTransformer.class.getSimpleName()); - transformerList.add(FlipHorizontalTransformer.class.getSimpleName()); - transformerList.add(FlipVerticalTransformer.class.getSimpleName()); - transformerList.add(ForegroundToBackgroundTransformer.class.getSimpleName()); - transformerList.add(RotateDownTransformer.class.getSimpleName()); - transformerList.add(RotateUpTransformer.class.getSimpleName()); - transformerList.add(StackTransformer.class.getSimpleName()); - transformerList.add(ZoomInTransformer.class.getSimpleName()); - transformerList.add(ZoomOutTranformer.class.getSimpleName()); - - transformerArrayAdapter.notifyDataSetChanged(); +//// //各种翻页效果 +// transformerList.add(DefaultTransformer.class.getSimpleName()); +// transformerList.add(AccordionTransformer.class.getSimpleName()); +// transformerList.add(BackgroundToForegroundTransformer.class.getSimpleName()); +// transformerList.add(CubeInTransformer.class.getSimpleName()); +// transformerList.add(CubeOutTransformer.class.getSimpleName()); +// transformerList.add(DepthPageTransformer.class.getSimpleName()); +// transformerList.add(FlipHorizontalTransformer.class.getSimpleName()); +// transformerList.add(FlipVerticalTransformer.class.getSimpleName()); +// transformerList.add(ForegroundToBackgroundTransformer.class.getSimpleName()); +// transformerList.add(RotateDownTransformer.class.getSimpleName()); +// transformerList.add(RotateUpTransformer.class.getSimpleName()); +// transformerList.add(StackTransformer.class.getSimpleName()); +// transformerList.add(ZoomInTransformer.class.getSimpleName()); +// transformerList.add(ZoomOutTranformer.class.getSimpleName()); + +// transformerArrayAdapter.notifyDataSetChanged(); } /** @@ -173,69 +166,23 @@ public static int getResId(String variableName, Class c) { @Override protected void onResume() { super.onResume(); - //开始自动翻页 - convenientBanner.startTurning(5000); +// //开始自动翻页 + convenientBanner.startTurning(); } // 停止自动翻页 @Override protected void onPause() { super.onPause(); - //停止翻页 +// //停止翻页 convenientBanner.stopTurning(); } - //点击切换效果 - @Override - public void onItemClick(AdapterView adapterView, View view, int position, long id) { - -// 点击后加入两个内容 -// localImages.clear(); -// localImages.add(R.drawable.ic_test_2); -// localImages.add(R.drawable.ic_test_4); -// convenientBanner.notifyDataSetChanged(); - - //控制是否循环 -// convenientBanner.setCanLoop(!convenientBanner.isCanLoop()); - - - String transforemerName = transformerList.get(position); - try { - Class cls = Class.forName("com.ToxicBakery.viewpager.transforms." + transforemerName); - ABaseTransformer transforemer= (ABaseTransformer)cls.newInstance(); - convenientBanner.getViewPager().setPageTransformer(true,transforemer); - - //部分3D特效需要调整滑动速度 - if(transforemerName.equals("StackTransformer")){ - convenientBanner.setScrollDuration(1200); - } - - } catch (ClassNotFoundException e) { - e.printStackTrace(); - } catch (InstantiationException e) { - e.printStackTrace(); - } catch (IllegalAccessException e) { - e.printStackTrace(); - } - - } - - @Override - public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { - - } - - @Override - public void onPageSelected(int position) { - Toast.makeText(this,"监听到翻到第"+position+"了",Toast.LENGTH_SHORT).show(); - } - - @Override - public void onPageScrollStateChanged(int state) { - } @Override public void onItemClick(int position) { Toast.makeText(this,"点击了第"+position+"个",Toast.LENGTH_SHORT).show(); + startActivity(new Intent(this, HeaderActivity.class)); +// convenientBanner.setCanLoop(!convenientBanner.isCanLoop()); } } diff --git a/app/src/main/java/com/bigkoo/convenientbannerdemo/NetWorkImageHolderView.java b/app/src/main/java/com/bigkoo/convenientbannerdemo/NetWorkImageHolderView.java new file mode 100644 index 0000000..c85baa2 --- /dev/null +++ b/app/src/main/java/com/bigkoo/convenientbannerdemo/NetWorkImageHolderView.java @@ -0,0 +1,49 @@ +package com.bigkoo.convenientbannerdemo; + +import android.graphics.drawable.Animatable; +import android.view.View; + +import com.bigkoo.convenientbanner.holder.Holder; +import com.facebook.drawee.backends.pipeline.Fresco; +import com.facebook.drawee.backends.pipeline.PipelineDraweeControllerBuilder; +import com.facebook.drawee.controller.BaseControllerListener; +import com.facebook.imagepipeline.image.ImageInfo; + +import me.relex.photodraweeview.OnViewTapListener; +import me.relex.photodraweeview.PhotoDraweeView; + +/** + * Created by Sai on 15/8/4. + * 网络图片加载例子 + */ +public class NetWorkImageHolderView extends Holder{ + private PhotoDraweeView ivPost; + + public NetWorkImageHolderView(View itemView, OnViewTapListener onViewTapListener) { + super(itemView); + ivPost.setOnViewTapListener(onViewTapListener); + } + + @Override + protected void initView(View itemView) { + ivPost =itemView.findViewById(R.id.ivPost); + } + + @Override + public void updateUI(String data) { + PipelineDraweeControllerBuilder controller = Fresco.newDraweeControllerBuilder(); + controller.setUri(data); + controller.setOldController(ivPost.getController()); + controller.setControllerListener(new BaseControllerListener() { + @Override + public void onFinalImageSet(String id, ImageInfo imageInfo, Animatable animatable) { + super.onFinalImageSet(id, imageInfo, animatable); + if (imageInfo == null) { + return; + } + ivPost.update(imageInfo.getWidth(), imageInfo.getHeight()); + } + }); + ivPost.setController(controller.build()); + } +} diff --git a/app/src/main/java/com/bigkoo/convenientbannerdemo/NetworkImageHolderView.java b/app/src/main/java/com/bigkoo/convenientbannerdemo/NetworkImageHolderView.java deleted file mode 100755 index f69980f..0000000 --- a/app/src/main/java/com/bigkoo/convenientbannerdemo/NetworkImageHolderView.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.bigkoo.convenientbannerdemo; - -import android.content.Context; -import android.view.View; -import android.widget.ImageView; - -import com.bigkoo.convenientbanner.holder.Holder; -import com.nostra13.universalimageloader.core.ImageLoader; - -/** - * Created by Sai on 15/8/4. - * 网络图片加载例子 - */ -public class NetworkImageHolderView implements Holder { - private ImageView imageView; - @Override - public View createView(Context context) { - //你可以通过layout文件来创建,也可以像我一样用代码创建,不一定是Image,任何控件都可以进行翻页 - imageView = new ImageView(context); - imageView.setScaleType(ImageView.ScaleType.FIT_XY); - return imageView; - } - - @Override - public void UpdateUI(Context context,int position, String data) { - imageView.setImageResource(R.drawable.ic_default_adimage); - ImageLoader.getInstance().displayImage(data,imageView); - } -} diff --git a/app/src/main/java/com/bigkoo/convenientbannerdemo/recyclerviewdemo/ADRecyclerViewDemo.java b/app/src/main/java/com/bigkoo/convenientbannerdemo/recyclerviewdemo/ADRecyclerViewDemo.java deleted file mode 100755 index eb5cf78..0000000 --- a/app/src/main/java/com/bigkoo/convenientbannerdemo/recyclerviewdemo/ADRecyclerViewDemo.java +++ /dev/null @@ -1,234 +0,0 @@ -package com.bigkoo.convenientbannerdemo.recyclerviewdemo; - -import android.app.Activity; -import android.os.Bundle; -import android.support.v4.widget.SwipeRefreshLayout; -import android.support.v7.widget.LinearLayoutManager; -import android.support.v7.widget.RecyclerView; -import android.view.LayoutInflater; -import android.view.ViewGroup; - -import com.bigkoo.convenientbanner.holder.CBViewHolderCreator; -import com.bigkoo.convenientbanner.ConvenientBanner; -import com.bigkoo.convenientbannerdemo.NetworkImageHolderView; -import com.bigkoo.convenientbannerdemo.R; -import com.nostra13.universalimageloader.cache.disc.naming.Md5FileNameGenerator; -import com.nostra13.universalimageloader.core.DisplayImageOptions; -import com.nostra13.universalimageloader.core.ImageLoader; -import com.nostra13.universalimageloader.core.ImageLoaderConfiguration; -import com.nostra13.universalimageloader.core.assist.QueueProcessingType; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; - -/** - * Created by Sai on 15/8/13. - * 这个是RecyclerView配合ConvenientBanner作为header的例子 - * 有issue反馈说RecyclerView刷新会出现空白图片,于是写了这个例子进行测试,也提供给对RecyclerView使用不熟悉的开发者进行参考吧。 - */ -public class ADRecyclerViewDemo extends Activity implements SwipeRefreshLayout.OnRefreshListener { - private SwipeRefreshLayout refreshLayout; - private RecyclerView listView; - private ArrayList mDatas = new ArrayList(); - private RecyclerViewHFAdapter adapter; - private ConvenientBanner convenientBanner; - - private List networkImages; - private String[] images = {"http://img2.imgtn.bdimg.com/it/u=3093785514,1341050958&fm=21&gp=0.jpg", - "http://img2.3lian.com/2014/f2/37/d/40.jpg", - "http://d.3987.com/sqmy_131219/001.jpg", - "http://img2.3lian.com/2014/f2/37/d/39.jpg", - "http://www.8kmm.com/UploadFiles/2012/8/201208140920132659.jpg", - "http://f.hiphotos.baidu.com/image/h%3D200/sign=1478eb74d5a20cf45990f9df460b4b0c/d058ccbf6c81800a5422e5fdb43533fa838b4779.jpg", - "http://f.hiphotos.baidu.com/image/pic/item/09fa513d269759ee50f1971ab6fb43166c22dfba.jpg" - }; - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - initViews(); - init(); - initEvents(); - } - - private void initViews() { - setContentView(R.layout.acitvity_adrecyclerviewdemo); - refreshLayout = (SwipeRefreshLayout) findViewById(R.id.refreshLayout); - convenientBanner = (ConvenientBanner) LayoutInflater.from(this).inflate(R.layout.adapter_header_cb,null); - convenientBanner.setLayoutParams(new RecyclerView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,600)); - listView = (RecyclerView) findViewById(R.id.recyclerView); - } - - private void init(){ - initImageLoader(); - - listView.setHasFixedSize(true); - LinearLayoutManager layoutManager = new LinearLayoutManager(this); - listView.setLayoutManager(layoutManager); - adapter = new RecyclerViewHFAdapter(mDatas); - listView.setAdapter(adapter); - - networkImages= Arrays.asList(images); - convenientBanner.setPages(new CBViewHolderCreator() { - @Override - public NetworkImageHolderView createHolder() { - return new NetworkImageHolderView(); - } - },networkImages) - .setPageIndicator(new int[]{R.drawable.ic_page_indicator, R.drawable.ic_page_indicator_focused}); - - adapter.addHeader(convenientBanner); - loadTestDatas(); - } - private void initEvents() { - refreshLayout.setOnRefreshListener(this); - } - //初始化网络图片缓存库 - private void initImageLoader(){ - //网络图片例子,结合常用的图片缓存库UIL,你可以根据自己需求自己换其他网络图片库 - DisplayImageOptions defaultOptions = new DisplayImageOptions.Builder(). - showImageForEmptyUri(R.drawable.ic_default_adimage) - .cacheInMemory(true).cacheOnDisk(true).build(); - - ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder( - getApplicationContext()).defaultDisplayImageOptions(defaultOptions) - .threadPriority(Thread.NORM_PRIORITY - 2) - .denyCacheImageMultipleSizesInMemory() - .diskCacheFileNameGenerator(new Md5FileNameGenerator()) - .tasksProcessingOrder(QueueProcessingType.LIFO).build(); - ImageLoader.getInstance().init(config); - } - /* - 加入测试Views - * */ - private void loadTestDatas() { - - mDatas.add("test==========="); - adapter.notifyDataSetChanged(); - } - // 开始自动翻页 - @Override - protected void onResume() { - super.onResume(); - //开始自动翻页 - convenientBanner.startTurning(5000); - } - - // 停止自动翻页 - @Override - protected void onPause() { - super.onPause(); - //停止翻页 - convenientBanner.stopTurning(); - } - - @Override - public void onRefresh() { - -// mDatas.add("dsafdsf"); -// adapter.notifyDataSetChanged(); - //跟上面注释的效果一样 - adapter.addData("onRefresh ===test========"); - adapter.addData("onRefresh ===test========"); - adapter.addData("onRefresh ===test========"); - adapter.addData("onRefresh ===test========"); - adapter.addData("onRefresh ===test========"); - adapter.addData("onRefresh ===test========"); - adapter.addData("onRefresh ===test========"); - adapter.addData("onRefresh ===test========"); - adapter.addData("onRefresh ===test========"); - adapter.addData("onRefresh ===test========"); - adapter.addData("onRefresh ===test========"); - adapter.addData("onRefresh ===test========"); - adapter.addData("onRefresh ===test========"); - adapter.addData("onRefresh ===test========"); - adapter.addData("onRefresh ===test========"); - adapter.addData("onRefresh ===test========"); - adapter.addData("onRefresh ===test========"); - adapter.addData("onRefresh ===test========"); - adapter.addData("onRefresh ===test========"); - adapter.addData("onRefresh ===test========"); - adapter.addData("onRefresh ===test========"); - adapter.addData("onRefresh ===test========"); - adapter.addData("onRefresh ===test========"); - adapter.addData("onRefresh ===test========"); - adapter.addData("onRefresh ===test========"); - adapter.addData("onRefresh ===test========"); - adapter.addData("onRefresh ===test========"); - adapter.addData("onRefresh ===test========"); - adapter.addData("onRefresh ===test========"); - adapter.addData("onRefresh ===test========"); - adapter.addData("onRefresh ===test========"); - adapter.addData("onRefresh ===test========"); - adapter.addData("onRefresh ===test========"); - adapter.addData("onRefresh ===test========"); - adapter.addData("onRefresh ===test========"); - adapter.addData("onRefresh ===test========"); - adapter.addData("onRefresh ===test========"); - adapter.addData("onRefresh ===test========"); - adapter.addData("onRefresh ===test========"); - adapter.addData("onRefresh ===test========"); - adapter.addData("onRefresh ===test========"); - adapter.addData("onRefresh ===test========"); - adapter.addData("onRefresh ===test========"); - adapter.addData("onRefresh ===test========"); - adapter.addData("onRefresh ===test========"); - adapter.addData("onRefresh ===test========"); - adapter.addData("onRefresh ===test========"); - adapter.addData("onRefresh ===test========"); - adapter.addData("onRefresh ===test========"); - adapter.addData("onRefresh ===test========"); - adapter.addData("onRefresh ===test========"); - adapter.addData("onRefresh ===test========"); - adapter.addData("onRefresh ===test========"); - adapter.addData("onRefresh ===test========"); - adapter.addData("onRefresh ===test========"); - adapter.addData("onRefresh ===test========"); - adapter.addData("onRefresh ===test========"); - adapter.addData("onRefresh ===test========"); - adapter.addData("onRefresh ===test========"); - adapter.addData("onRefresh ===test========"); - adapter.addData("onRefresh ===test========"); - adapter.addData("onRefresh ===test========"); - adapter.addData("onRefresh ===test========"); - adapter.addData("onRefresh ===test========"); - adapter.addData("onRefresh ===test========"); - adapter.addData("onRefresh ===test========"); - adapter.addData("onRefresh ===test========"); - adapter.addData("onRefresh ===test========"); - adapter.addData("onRefresh ===test========"); - adapter.addData("onRefresh ===test========"); - adapter.addData("onRefresh ===test========"); - adapter.addData("onRefresh ===test========"); - adapter.addData("onRefresh ===test========"); - adapter.addData("onRefresh ===test========"); - adapter.addData("onRefresh ===test========"); - adapter.addData("onRefresh ===test========"); - adapter.addData("onRefresh ===test========"); - adapter.addData("onRefresh ===test========"); - adapter.addData("onRefresh ===test========"); - adapter.addData("onRefresh ===test========"); - adapter.addData("onRefresh ===test========"); - adapter.addData("onRefresh ===test========"); - adapter.addData("onRefresh ===test========"); - adapter.addData("onRefresh ===test========"); - adapter.addData("onRefresh ===test========"); - adapter.addData("onRefresh ===test========"); - adapter.addData("onRefresh ===test========"); - adapter.addData("onRefresh ===test========"); - adapter.addData("onRefresh ===test========"); - adapter.addData("onRefresh ===test========"); - adapter.addData("onRefresh ===test========"); - adapter.addData("onRefresh ===test========"); - adapter.addData("onRefresh ===test========"); - adapter.addData("onRefresh ===test========"); - adapter.addData("onRefresh ===test========"); - adapter.addData("onRefresh ===test========"); - adapter.addData("onRefresh ===test========"); - adapter.addData("onRefresh ===test========"); - adapter.addData("onRefresh ===test========"); - adapter.addData("onRefresh ===test========"); - refreshLayout.setRefreshing(false); - } -} diff --git a/app/src/main/java/com/bigkoo/convenientbannerdemo/recyclerviewdemo/CustomSwipeToRefresh.java b/app/src/main/java/com/bigkoo/convenientbannerdemo/recyclerviewdemo/CustomSwipeToRefresh.java deleted file mode 100644 index 1121cd7..0000000 --- a/app/src/main/java/com/bigkoo/convenientbannerdemo/recyclerviewdemo/CustomSwipeToRefresh.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.bigkoo.convenientbannerdemo.recyclerviewdemo; - -import android.content.Context; -import android.support.v4.widget.SwipeRefreshLayout; -import android.util.AttributeSet; -import android.view.MotionEvent; -import android.view.ViewConfiguration; - -/** - * 解决ViewPager左右滑动和下拉刷新冲突的方案 - * Created by Sai on 15/12/7. - */ -public class CustomSwipeToRefresh extends SwipeRefreshLayout { - - private int mTouchSlop; - private float mPrevX; - - public CustomSwipeToRefresh(Context context, AttributeSet attrs) { - super(context, attrs); - - mTouchSlop = ViewConfiguration.get(context).getScaledTouchSlop(); - } - - @Override - public boolean onInterceptTouchEvent(MotionEvent event) { - - switch (event.getAction()) { - case MotionEvent.ACTION_DOWN: - mPrevX = MotionEvent.obtain(event).getX(); - break; - - case MotionEvent.ACTION_MOVE: - final float eventX = event.getX(); - float xDiff = Math.abs(eventX - mPrevX); - - if (xDiff > mTouchSlop) { - return false; - } - } - - return super.onInterceptTouchEvent(event); - } -} \ No newline at end of file diff --git a/app/src/main/java/com/bigkoo/convenientbannerdemo/recyclerviewdemo/RecyclerViewHFAdapter.java b/app/src/main/java/com/bigkoo/convenientbannerdemo/recyclerviewdemo/RecyclerViewHFAdapter.java deleted file mode 100755 index 1e03a35..0000000 --- a/app/src/main/java/com/bigkoo/convenientbannerdemo/recyclerviewdemo/RecyclerViewHFAdapter.java +++ /dev/null @@ -1,186 +0,0 @@ -package com.bigkoo.convenientbannerdemo.recyclerviewdemo; - -import android.support.v7.widget.RecyclerView; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.TextView; - -import com.bigkoo.convenientbannerdemo.R; - -import java.util.List; - -/** - * Created by Sai on 15/8/13. - */ -public class RecyclerViewHFAdapter extends RecyclerView.Adapter { - - private static final int TYPE_HEADER = 0; - - private static final int TYPE_FOOTER = 1; - - private static final int TYPE_ITEM = 2; - - private static final int TYPE_EMPTY = 3; - - private View mHeaderView; - - private View mFooterView; - - private View mEmptyView; - - private List items; - - public RecyclerViewHFAdapter(List data) { - this.items = data; - } - - @Override - public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { - if (viewType == TYPE_ITEM) { - View v = LayoutInflater.from(parent.getContext()) - .inflate(R.layout.adapter_transformer, parent, false); - return new ItemHolder(v); - } else if (viewType == TYPE_HEADER) { - View v = mHeaderView; - return new HeaderHolder(v); - } else if (viewType == TYPE_FOOTER) { - View v = mFooterView; - return new FooterHolder(v); - } else if (viewType == TYPE_EMPTY) { - View v = mEmptyView; - return new EmptyHolder(v); - } - throw new RuntimeException("there is no type that matches the type " + viewType + " + make sure your using types correctly"); - } - - @Override - public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { - if (holder instanceof ItemHolder) { - String dataItem = getItem(position); - ((ItemHolder) holder).mTextView.setText(dataItem); - } else if (holder instanceof HeaderHolder) { - - } else if (holder instanceof FooterHolder) { - - } else if (holder instanceof EmptyHolder) { - - } - } - - @Override - public int getItemCount() { - - int count; - int size = items.size(); - if (size == 0 && null != mEmptyView) { - count = 1; - } else { - count = getHeadViewSize() + size + getFooterViewSize(); - } - return count; - - } - - @Override - public int getItemViewType(int position) { - int size = items.size(); - if (size == 0 && null != mEmptyView) { - return TYPE_EMPTY; - } else if (position < getHeadViewSize()) { - return TYPE_HEADER; - } else if (position >= getHeadViewSize() + items.size()) { - return TYPE_FOOTER; - } - return TYPE_ITEM; - } - - private int getHeadViewSize() { - return mHeaderView == null ? 0 : 1; - } - - private int getFooterViewSize() { - return mFooterView == null ? 0 : 1; - } - - private String getItem(int position) { - return items.get(position - getHeadViewSize()); - } - - - //add a header to the adapter - public void addHeader(View header) { - mHeaderView = header; - notifyItemInserted(0); - } - - //remove a header from the adapter - public void removeHeader(View header) { - notifyItemRemoved(0); - mHeaderView = null; - } - - //add a footer to the adapter - public void addFooter(View footer) { - mFooterView = footer; - notifyItemInserted(getHeadViewSize() + items.size()); - } - - //remove a footer from the adapter - public void removeFooter(View footer) { - notifyItemRemoved(getHeadViewSize() + items.size()); - mFooterView = null; - } - - //add data - public void addDatas(List data) { - items.addAll(data); - notifyItemInserted(getHeadViewSize() + items.size() - 1); - } - - //add data - public void addData(String data) { - items.add(data); - notifyItemInserted(getHeadViewSize() + items.size() - 1); - } - - //refresh data - public void refreshData(List datas){ - items.clear(); - addDatas(datas); - } - - public void setEmptyView(View emptyView) { - mEmptyView = emptyView; - notifyItemInserted(0); - } - - - class ItemHolder extends RecyclerView.ViewHolder { - TextView mTextView; - - public ItemHolder(View itemView) { - super(itemView); - mTextView = (TextView) itemView; - } - } - - class HeaderHolder extends RecyclerView.ViewHolder { - - public HeaderHolder(View itemView) { - super(itemView); - } - } - - class FooterHolder extends RecyclerView.ViewHolder { - public FooterHolder(View itemView) { - super(itemView); - } - } - - class EmptyHolder extends RecyclerView.ViewHolder { - public EmptyHolder(View itemView) { - super(itemView); - } - } -} diff --git a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml new file mode 100644 index 0000000..c7bd21d --- /dev/null +++ b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + diff --git a/app/src/main/res/drawable/ic_launcher_background.xml b/app/src/main/res/drawable/ic_launcher_background.xml new file mode 100644 index 0000000..d5fccc5 --- /dev/null +++ b/app/src/main/res/drawable/ic_launcher_background.xml @@ -0,0 +1,170 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/acitvity_adrecyclerviewdemo.xml b/app/src/main/res/layout/acitvity_adrecyclerviewdemo.xml index 9183774..80e5eaf 100755 --- a/app/src/main/res/layout/acitvity_adrecyclerviewdemo.xml +++ b/app/src/main/res/layout/acitvity_adrecyclerviewdemo.xml @@ -8,7 +8,7 @@ android:id="@+id/refreshLayout" android:layout_width="match_parent" android:layout_height="match_parent"> - diff --git a/app/src/main/res/layout/activity_album.xml b/app/src/main/res/layout/activity_album.xml new file mode 100644 index 0000000..fd658c7 --- /dev/null +++ b/app/src/main/res/layout/activity_album.xml @@ -0,0 +1,13 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_header.xml b/app/src/main/res/layout/activity_header.xml new file mode 100644 index 0000000..4458bd6 --- /dev/null +++ b/app/src/main/res/layout/activity_header.xml @@ -0,0 +1,16 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index d77efcd..1b23a85 100755 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -9,10 +9,7 @@ android:id="@+id/convenientBanner" android:layout_width="match_parent" android:layout_height="200dp" - app:canLoop="true"/> - + app:canLoop="true" + app:autoTurningTime="3000"/> diff --git a/app/src/main/res/layout/item_covenientbanner_header.xml b/app/src/main/res/layout/item_covenientbanner_header.xml new file mode 100644 index 0000000..b9e4708 --- /dev/null +++ b/app/src/main/res/layout/item_covenientbanner_header.xml @@ -0,0 +1,13 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_header_text.xml b/app/src/main/res/layout/item_header_text.xml new file mode 100644 index 0000000..e4ce8c8 --- /dev/null +++ b/app/src/main/res/layout/item_header_text.xml @@ -0,0 +1,13 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_localimage.xml b/app/src/main/res/layout/item_localimage.xml new file mode 100644 index 0000000..109b940 --- /dev/null +++ b/app/src/main/res/layout/item_localimage.xml @@ -0,0 +1,11 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_photoview.xml b/app/src/main/res/layout/item_photoview.xml new file mode 100644 index 0000000..f1ceaf9 --- /dev/null +++ b/app/src/main/res/layout/item_photoview.xml @@ -0,0 +1,8 @@ + + diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml new file mode 100644 index 0000000..eca70cf --- /dev/null +++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml new file mode 100644 index 0000000..eca70cf --- /dev/null +++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher.png b/app/src/main/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000..a2f5908 Binary files /dev/null and b/app/src/main/res/mipmap-hdpi/ic_launcher.png differ diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_round.png b/app/src/main/res/mipmap-hdpi/ic_launcher_round.png new file mode 100644 index 0000000..1b52399 Binary files /dev/null and b/app/src/main/res/mipmap-hdpi/ic_launcher_round.png differ diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher.png b/app/src/main/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 0000000..ff10afd Binary files /dev/null and b/app/src/main/res/mipmap-mdpi/ic_launcher.png differ diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_round.png b/app/src/main/res/mipmap-mdpi/ic_launcher_round.png new file mode 100644 index 0000000..115a4c7 Binary files /dev/null and b/app/src/main/res/mipmap-mdpi/ic_launcher_round.png differ diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/app/src/main/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 0000000..dcd3cd8 Binary files /dev/null and b/app/src/main/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png b/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png new file mode 100644 index 0000000..459ca60 Binary files /dev/null and b/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 0000000..8ca12fe Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png new file mode 100644 index 0000000..8e19b41 Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png differ diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 0000000..b824ebd Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png new file mode 100644 index 0000000..4c19a13 Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png differ diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml new file mode 100644 index 0000000..3ab3e9c --- /dev/null +++ b/app/src/main/res/values/colors.xml @@ -0,0 +1,6 @@ + + + #3F51B5 + #303F9F + #FF4081 + diff --git a/build.gradle b/build.gradle index ba4f65c..590a26a 100644 --- a/build.gradle +++ b/build.gradle @@ -2,12 +2,16 @@ buildscript { repositories { + google() jcenter() + } dependencies { - classpath 'com.android.tools.build:gradle:1.3.0' - classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.0' - classpath 'com.github.dcendents:android-maven-plugin:1.2' + classpath 'com.android.tools.build:gradle:3.3.2' +// 添加上传到jcenter所需的插件 + classpath 'com.github.dcendents:android-maven-gradle-plugin:1.5' + classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.7.1' + // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files } @@ -15,6 +19,17 @@ buildscript { allprojects { repositories { + google() jcenter() + maven { url 'https://jitpack.io' } + } + gradle.projectsEvaluated { + tasks.withType(JavaCompile) { + options.compilerArgs << "-Xlint:unchecked" << "-Xlint:deprecation" + } } } + +task clean(type: Delete) { + delete rootProject.buildDir +} diff --git a/convenientbanner.zip b/convenientbanner.zip deleted file mode 100644 index f2755a5..0000000 Binary files a/convenientbanner.zip and /dev/null differ diff --git a/convenientbanner/build.gradle b/convenientbanner/build.gradle index 11d00b6..6709089 100644 --- a/convenientbanner/build.gradle +++ b/convenientbanner/build.gradle @@ -2,16 +2,16 @@ apply plugin: 'com.android.library' apply plugin: 'com.github.dcendents.android-maven' apply plugin: 'com.jfrog.bintray' -version = "2.0.4"//aar的版本 +version = "2.1.5" android { - compileSdkVersion 21 - buildToolsVersion "20.0.0" + compileSdkVersion 28 defaultConfig { - minSdkVersion 10 - versionCode 1 - versionName "1.0" + minSdkVersion 14 + targetSdkVersion 28 + versionCode 9 + versionName "2.1.5" } buildTypes { release { @@ -19,25 +19,31 @@ android { proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } -} -dependencies { - compile fileTree(dir: 'libs', include: ['*.jar']) - compile ('com.android.support:appcompat-v7:21.0.3') + lintOptions { + abortOnError false + ignoreWarnings true + + } + tasks.withType(Javadoc) { + options.addStringOption('Xdoclint:none', '-quiet') + options.addStringOption('encoding', 'UTF-8') + options.addStringOption('charSet', 'UTF-8') + } + } -def siteUrl = 'https://github.com/saiwu-bigkoo/Android-ConvenientBanner' // #CONFIG# // project homepage -def gitUrl = 'https://github.com/saiwu-bigkoo/Android-ConvenientBanner.git' // #CONFIG# // project git +def siteUrl = 'https://github.com/Bigkoo/Android-ConvenientBanner' // #CONFIG# // project homepage +def gitUrl = 'https://github.com/Bigkoo/Android-ConvenientBanner.git' // #CONFIG# // project git group = "com.bigkoo" -//通过./gradlew install命令生成pom-default.xml 在 moudle库目录/build/poms/pom-default.xml install { repositories.mavenInstaller { // This generates POM.xml with proper parameters pom { project { packaging 'aar' - name 'Convenient Banner For Android' // #CONFIG# // project title + name 'ConvenientBanner' // #CONFIG# // project title url siteUrl // Set your license licenses { @@ -97,4 +103,8 @@ bintray { licenses = ["Apache-2.0"] publish = true } -} \ No newline at end of file +} + +dependencies { + implementation 'androidx.recyclerview:recyclerview:1.0.0+' +} diff --git a/convenientbanner/proguard-rules.pro b/convenientbanner/proguard-rules.pro index 71a43e0..f1b4245 100644 --- a/convenientbanner/proguard-rules.pro +++ b/convenientbanner/proguard-rules.pro @@ -1,17 +1,21 @@ # Add project specific ProGuard rules here. -# By default, the flags in this file are appended to flags specified -# in /Users/Sai/Documents/software/sdk/tools/proguard/proguard-android.txt -# You can edit the include path and order by changing the proguardFiles -# directive in build.gradle. +# You can control the set of applied configuration files using the +# proguardFiles setting 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 *; #} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile diff --git a/convenientbanner/src/main/AndroidManifest.xml b/convenientbanner/src/main/AndroidManifest.xml index f13d536..b2f26ec 100755 --- a/convenientbanner/src/main/AndroidManifest.xml +++ b/convenientbanner/src/main/AndroidManifest.xml @@ -1,5 +1,2 @@ - - - + package="com.bigkoo.convenientbanner" /> diff --git a/convenientbanner/src/main/java/com/bigkoo/convenientbanner/ConvenientBanner.java b/convenientbanner/src/main/java/com/bigkoo/convenientbanner/ConvenientBanner.java index 4c56ce8..1284533 100755 --- a/convenientbanner/src/main/java/com/bigkoo/convenientbanner/ConvenientBanner.java +++ b/convenientbanner/src/main/java/com/bigkoo/convenientbanner/ConvenientBanner.java @@ -2,101 +2,125 @@ import android.content.Context; import android.content.res.TypedArray; -import android.support.v4.view.ViewPager; -import android.support.v4.view.ViewPager.PageTransformer; import android.util.AttributeSet; import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; -import android.widget.LinearLayout; import android.widget.RelativeLayout; + import com.bigkoo.convenientbanner.adapter.CBPageAdapter; +import com.bigkoo.convenientbanner.helper.CBLoopScaleHelper; import com.bigkoo.convenientbanner.holder.CBViewHolderCreator; import com.bigkoo.convenientbanner.listener.CBPageChangeListener; import com.bigkoo.convenientbanner.listener.OnItemClickListener; +import com.bigkoo.convenientbanner.listener.OnPageChangeListener; import com.bigkoo.convenientbanner.view.CBLoopViewPager; -import java.lang.reflect.Field; +import java.lang.ref.WeakReference; import java.util.ArrayList; import java.util.List; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + /** * 页面翻转控件,极方便的广告栏 * 支持无限循环,自动翻页,翻页特效 + * * @author Sai 支持自动翻页 */ -public class ConvenientBanner extends LinearLayout { +public class ConvenientBanner extends RelativeLayout { private List mDatas; private int[] page_indicatorId; private ArrayList mPointViews = new ArrayList(); - private CBPageChangeListener pageChangeListener; - private ViewPager.OnPageChangeListener onPageChangeListener; private CBPageAdapter pageAdapter; private CBLoopViewPager viewPager; - private ViewPagerScroller scroller; private ViewGroup loPageTurningPoint; - private long autoTurningTime; + private long autoTurningTime = -1; private boolean turning; private boolean canTurn = false; - private boolean manualPageable = true; private boolean canLoop = true; - public enum PageIndicatorAlign{ - ALIGN_PARENT_LEFT,ALIGN_PARENT_RIGHT,CENTER_HORIZONTAL - } - - + private CBLoopScaleHelper cbLoopScaleHelper; + private CBPageChangeListener pageChangeListener; + private OnPageChangeListener onPageChangeListener; + private AdSwitchTask adSwitchTask; + private boolean isVertical = false; - private Runnable adSwitchTask = new Runnable() { - @Override - public void run() { - if (viewPager != null && turning) { - int page = viewPager.getCurrentItem() + 1; - viewPager.setCurrentItem(page); - postDelayed(adSwitchTask, autoTurningTime); - } - } - }; + public enum PageIndicatorAlign { + ALIGN_PARENT_LEFT, ALIGN_PARENT_RIGHT, CENTER_HORIZONTAL + } - public ConvenientBanner(Context context,boolean canLoop) { - this(context, null); - this.canLoop = canLoop; + public ConvenientBanner(Context context) { + super(context); + init(context); } + public ConvenientBanner(Context context, AttributeSet attrs) { super(context, attrs); - TypedArray a = context.obtainStyledAttributes(attrs,R.styleable.ConvenientBanner); - canLoop = a.getBoolean(R.styleable.ConvenientBanner_canLoop,true); + TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.ConvenientBanner); + canLoop = a.getBoolean(R.styleable.ConvenientBanner_canLoop, true); + autoTurningTime = a.getInteger(R.styleable.ConvenientBanner_autoTurningTime, -1); + a.recycle(); init(context); } private void init(Context context) { View hView = LayoutInflater.from(context).inflate( R.layout.include_viewpager, this, true); - viewPager = (CBLoopViewPager) hView.findViewById(R.id.cbLoopViewPager); - loPageTurningPoint = (ViewGroup) hView + viewPager = (CBLoopViewPager)hView.findViewById(R.id.cbLoopViewPager); + loPageTurningPoint = (ViewGroup)hView .findViewById(R.id.loPageTurningPoint); - initViewPagerScroll(); + + final LinearLayoutManager linearLayoutManager = new LinearLayoutManager(context, LinearLayoutManager.HORIZONTAL, false); + viewPager.setLayoutManager(linearLayoutManager); + + cbLoopScaleHelper = new CBLoopScaleHelper(); + + adSwitchTask = new AdSwitchTask(this); } - public ConvenientBanner setPages(CBViewHolderCreator holderCreator,List datas){ + public ConvenientBanner setLayoutManager(RecyclerView.LayoutManager layoutManager) { + viewPager.setLayoutManager(layoutManager); + return this; + } + public ConvenientBanner setPages(CBViewHolderCreator holderCreator, List datas) { this.mDatas = datas; - pageAdapter = new CBPageAdapter(holderCreator,mDatas); - viewPager.setAdapter(pageAdapter,canLoop); + pageAdapter = new CBPageAdapter(holderCreator, mDatas, canLoop); + viewPager.setAdapter(pageAdapter); if (page_indicatorId != null) setPageIndicator(page_indicatorId); + + cbLoopScaleHelper.setFirstItemPos(canLoop ? mDatas.size() : 0); + cbLoopScaleHelper.attachToRecyclerView(viewPager); + + return this; + } + + public ConvenientBanner setCanLoop(boolean canLoop){ + this.canLoop = canLoop; + pageAdapter.setCanLoop(canLoop); + notifyDataSetChanged(); return this; } + public boolean isCanLoop(){ + return canLoop; + } + + + + /** * 通知数据变化 - * 如果只是增加数据建议使用 notifyDataSetAdd() */ - public void notifyDataSetChanged(){ + public void notifyDataSetChanged() { viewPager.getAdapter().notifyDataSetChanged(); if (page_indicatorId != null) setPageIndicator(page_indicatorId); + cbLoopScaleHelper.setCurrentItem(canLoop ? mDatas.size() : 0); } /** @@ -118,12 +142,12 @@ public ConvenientBanner setPageIndicator(int[] page_indicatorId) { loPageTurningPoint.removeAllViews(); mPointViews.clear(); this.page_indicatorId = page_indicatorId; - if(mDatas==null)return this; + if (mDatas == null) return this; for (int count = 0; count < mDatas.size(); count++) { // 翻页指示的点 ImageView pointView = new ImageView(getContext()); pointView.setPadding(5, 0, 5, 0); - if (mPointViews.isEmpty()) + if (cbLoopScaleHelper.getFirstItemPos()%mDatas.size()==count) pointView.setImageResource(page_indicatorId[1]); else pointView.setImageResource(page_indicatorId[0]); @@ -132,16 +156,75 @@ public ConvenientBanner setPageIndicator(int[] page_indicatorId) { } pageChangeListener = new CBPageChangeListener(mPointViews, page_indicatorId); - viewPager.setOnPageChangeListener(pageChangeListener); - pageChangeListener.onPageSelected(viewPager.getRealItem()); - if(onPageChangeListener != null)pageChangeListener.setOnPageChangeListener(onPageChangeListener); + cbLoopScaleHelper.setOnPageChangeListener(pageChangeListener); + if (onPageChangeListener != null) + pageChangeListener.setOnPageChangeListener(onPageChangeListener); return this; } + public OnPageChangeListener getOnPageChangeListener() { + return onPageChangeListener; + } + + /** + * 设置翻页监听器 + * + * @param onPageChangeListener + * @return + */ + public ConvenientBanner setOnPageChangeListener(OnPageChangeListener onPageChangeListener) { + this.onPageChangeListener = onPageChangeListener; + //如果有默认的监听器(即是使用了默认的翻页指示器)则把用户设置的依附到默认的上面,否则就直接设置 + if (pageChangeListener != null) + pageChangeListener.setOnPageChangeListener(onPageChangeListener); + else cbLoopScaleHelper.setOnPageChangeListener(onPageChangeListener); + return this; + } + + /** + * 监听item点击 + * + * @param onItemClickListener + */ + public ConvenientBanner setOnItemClickListener(final OnItemClickListener onItemClickListener) { + if (onItemClickListener == null) { + pageAdapter.setOnItemClickListener(null); + return this; + } + pageAdapter.setOnItemClickListener(onItemClickListener); + return this; + } + + /** + * 获取当前页对应的position + * @return + */ + public int getCurrentItem() { + return cbLoopScaleHelper.getRealCurrentItem(); + } + /** + * 设置当前页对应的position + * @return + */ + public ConvenientBanner setCurrentItem(int position, boolean smoothScroll) { + cbLoopScaleHelper.setCurrentItem(canLoop ? mDatas.size()+position : position, smoothScroll); + return this; + } + + /** + * 设置第一次加载当前页对应的position + * setPageIndicator之前使用 + * @return + */ + public ConvenientBanner setFirstItemPos(int position) { + cbLoopScaleHelper.setFirstItemPos(canLoop ? mDatas.size()+position : position); + return this; + } /** * 指示器的方向 - * @param align 三个方向:居左 (RelativeLayout.ALIGN_PARENT_LEFT),居中 (RelativeLayout.CENTER_HORIZONTAL),居右 (RelativeLayout.ALIGN_PARENT_RIGHT) + * + * @param align 三个方向:居左 (RelativeLayout.ALIGN_PARENT_LEFT),居中 (RelativeLayout.CENTER_HORIZONTAL),居右 (RelativeLayout.ALIGN_PARENT_RIGHT) * @return */ public ConvenientBanner setPageIndicatorAlign(PageIndicatorAlign align) { @@ -167,8 +250,9 @@ public boolean isTurning() { * @return */ public ConvenientBanner startTurning(long autoTurningTime) { + if (autoTurningTime < 0) return this; //如果是正在翻页的话先停掉 - if(turning){ + if (turning) { stopTurning(); } //设置可以翻页并开启翻页 @@ -179,133 +263,55 @@ public ConvenientBanner startTurning(long autoTurningTime) { return this; } - public void stopTurning() { - turning = false; - removeCallbacks(adSwitchTask); - } - - /** - * 自定义翻页动画效果 - * - * @param transformer - * @return - */ - public ConvenientBanner setPageTransformer(PageTransformer transformer) { - viewPager.setPageTransformer(true, transformer); + public ConvenientBanner startTurning() { + startTurning(autoTurningTime); return this; } - /** - * 设置ViewPager的滑动速度 - * */ - private void initViewPagerScroll() { - try { - Field mScroller = null; - mScroller = ViewPager.class.getDeclaredField("mScroller"); - mScroller.setAccessible(true); - scroller = new ViewPagerScroller( - viewPager.getContext()); - mScroller.set(viewPager, scroller); - - } catch (NoSuchFieldException e) { - e.printStackTrace(); - } catch (IllegalArgumentException e) { - e.printStackTrace(); - } catch (IllegalAccessException e) { - e.printStackTrace(); - } - } - - public boolean isManualPageable() { - return viewPager.isCanScroll(); - } - - public void setManualPageable(boolean manualPageable) { - viewPager.setCanScroll(manualPageable); + public void stopTurning() { + turning = false; + removeCallbacks(adSwitchTask); } //触碰控件的时候,翻页应该停止,离开的时候如果之前是开启了翻页的话则重新启动翻页 + + float startX , startY; @Override public boolean dispatchTouchEvent(MotionEvent ev) { int action = ev.getAction(); - if (action == MotionEvent.ACTION_UP||action == MotionEvent.ACTION_CANCEL||action == MotionEvent.ACTION_OUTSIDE) { + if (action == MotionEvent.ACTION_UP || action == MotionEvent.ACTION_CANCEL || action == MotionEvent.ACTION_OUTSIDE) { // 开始翻页 - if (canTurn)startTurning(autoTurningTime); + if (canTurn) startTurning(autoTurningTime); } else if (action == MotionEvent.ACTION_DOWN) { // 停止翻页 - if (canTurn)stopTurning(); - } - return super.dispatchTouchEvent(ev); - } - - //获取当前的页面index - public int getCurrentItem(){ - if (viewPager!=null) { - return viewPager.getRealItem(); - } - return -1; - } - //设置当前的页面index - public void setcurrentitem(int index){ - if (viewPager!=null) { - viewPager.setCurrentItem(index); + if (canTurn) stopTurning(); } - } - public ViewPager.OnPageChangeListener getOnPageChangeListener() { - return onPageChangeListener; + return super.dispatchTouchEvent(ev); } - /** - * 设置翻页监听器 - * @param onPageChangeListener - * @return - */ - public ConvenientBanner setOnPageChangeListener(ViewPager.OnPageChangeListener onPageChangeListener) { - this.onPageChangeListener = onPageChangeListener; - //如果有默认的监听器(即是使用了默认的翻页指示器)则把用户设置的依附到默认的上面,否则就直接设置 - if(pageChangeListener != null)pageChangeListener.setOnPageChangeListener(onPageChangeListener); - else viewPager.setOnPageChangeListener(onPageChangeListener); - return this; - } + static class AdSwitchTask implements Runnable { - public boolean isCanLoop() { - return viewPager.isCanLoop(); - } + private final WeakReference reference; - /** - * 监听item点击 - * @param onItemClickListener - */ - public ConvenientBanner setOnItemClickListener(OnItemClickListener onItemClickListener) { - if (onItemClickListener == null) { - viewPager.setOnItemClickListener(null); - return this; + AdSwitchTask(ConvenientBanner convenientBanner) { + this.reference = new WeakReference(convenientBanner); } - viewPager.setOnItemClickListener(onItemClickListener); - return this; - } - - /** - * 设置ViewPager的滚动速度 - * @param scrollDuration - */ - public void setScrollDuration(int scrollDuration){ - scroller.setScrollDuration(scrollDuration); - } - public int getScrollDuration() { - return scroller.getScrollDuration(); - } - - public CBLoopViewPager getViewPager() { - return viewPager; + @Override + public void run() { + ConvenientBanner convenientBanner = reference.get(); + + if (convenientBanner != null) { + if (convenientBanner.viewPager != null && convenientBanner.turning) { + int page = convenientBanner.cbLoopScaleHelper.getCurrentItem() + 1; + convenientBanner.cbLoopScaleHelper.setCurrentItem(page, true); + convenientBanner.postDelayed(convenientBanner.adSwitchTask, convenientBanner.autoTurningTime); + } + } + } } - public void setCanLoop(boolean canLoop) { - this.canLoop = canLoop; - viewPager.setCanLoop(canLoop); - } } diff --git a/convenientbanner/src/main/java/com/bigkoo/convenientbanner/ViewPagerScroller.java b/convenientbanner/src/main/java/com/bigkoo/convenientbanner/ViewPagerScroller.java deleted file mode 100755 index f42c398..0000000 --- a/convenientbanner/src/main/java/com/bigkoo/convenientbanner/ViewPagerScroller.java +++ /dev/null @@ -1,49 +0,0 @@ -package com.bigkoo.convenientbanner; - -import android.content.Context; -import android.view.animation.Interpolator; -import android.widget.Scroller; - -public class ViewPagerScroller extends Scroller { - private int mScrollDuration = 800;// 滑动速度,值越大滑动越慢,滑动太快会使3d效果不明显 - private boolean zero; - - public ViewPagerScroller(Context context) { - super(context); - } - - public ViewPagerScroller(Context context, Interpolator interpolator) { - super(context, interpolator); - } - - public ViewPagerScroller(Context context, Interpolator interpolator, - boolean flywheel) { - super(context, interpolator, flywheel); - } - - @Override - public void startScroll(int startX, int startY, int dx, int dy, int duration) { - super.startScroll(startX, startY, dx, dy, zero ? 0 : mScrollDuration); - } - - @Override - public void startScroll(int startX, int startY, int dx, int dy) { - super.startScroll(startX, startY, dx, dy, zero ? 0 : mScrollDuration); - } - - public int getScrollDuration() { - return mScrollDuration; - } - - public void setScrollDuration(int scrollDuration) { - this.mScrollDuration = scrollDuration; - } - - public boolean isZero() { - return zero; - } - - public void setZero(boolean zero) { - this.zero = zero; - } -} \ No newline at end of file diff --git a/convenientbanner/src/main/java/com/bigkoo/convenientbanner/adapter/CBPageAdapter.java b/convenientbanner/src/main/java/com/bigkoo/convenientbanner/adapter/CBPageAdapter.java index d9571d9..3fe8cec 100755 --- a/convenientbanner/src/main/java/com/bigkoo/convenientbanner/adapter/CBPageAdapter.java +++ b/convenientbanner/src/main/java/com/bigkoo/convenientbanner/adapter/CBPageAdapter.java @@ -1,106 +1,94 @@ package com.bigkoo.convenientbanner.adapter; -import android.support.v4.view.PagerAdapter; +import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; -import com.bigkoo.convenientbanner.R; import com.bigkoo.convenientbanner.holder.CBViewHolderCreator; import com.bigkoo.convenientbanner.holder.Holder; -import com.bigkoo.convenientbanner.view.CBLoopViewPager; +import com.bigkoo.convenientbanner.listener.OnItemClickListener; import java.util.List; +import androidx.recyclerview.widget.RecyclerView; + /** * Created by Sai on 15/7/29. */ -public class CBPageAdapter extends PagerAdapter { - protected List mDatas; - protected CBViewHolderCreator holderCreator; -// private View.OnClickListener onItemClickListener; - private boolean canLoop = true; - private CBLoopViewPager viewPager; - private final int MULTIPLE_COUNT = 300; - - public int toRealPosition(int position) { - int realCount = getRealCount(); - if (realCount == 0) - return 0; - int realPosition = position % realCount; - return realPosition; +public class CBPageAdapter extends RecyclerView.Adapter{ + protected List datas; + private CBViewHolderCreator creator; + private CBPageAdapterHelper helper; + private boolean canLoop; + private OnItemClickListener onItemClickListener; + + public CBPageAdapter(CBViewHolderCreator creator, List datas, boolean canLoop) { + this.creator = creator; + this.datas = datas; + this.canLoop = canLoop; + helper = new CBPageAdapterHelper(); } - @Override - public int getCount() { - return canLoop ? getRealCount()*MULTIPLE_COUNT : getRealCount(); - } - - public int getRealCount() { - return mDatas == null ? 0 : mDatas.size(); - } @Override - public Object instantiateItem(ViewGroup container, int position) { - int realPosition = toRealPosition(position); - - View view = getView(realPosition, null, container); -// if(onItemClickListener != null) view.setOnClickListener(onItemClickListener); - container.addView(view); - return view; + public Holder onCreateViewHolder(ViewGroup parent, int viewType) { + int layoutId = creator.getLayoutId(); + View itemView = LayoutInflater.from(parent.getContext()).inflate(layoutId, parent, false); + helper.onCreateViewHolder(parent,itemView); + return creator.createHolder(itemView); } @Override - public void destroyItem(ViewGroup container, int position, Object object) { - View view = (View) object; - container.removeView(view); - } + public void onBindViewHolder(Holder holder, int position) { + helper.onBindViewHolder(holder.itemView, position, getItemCount()); + int realPosition = position%datas.size(); + holder.updateUI(datas.get(realPosition)); - @Override - public void finishUpdate(ViewGroup container) { - int position = viewPager.getCurrentItem(); - if (position == 0) { - position = viewPager.getFristItem(); - } else if (position == getCount() - 1) { - position = viewPager.getLastItem(); + if(onItemClickListener != null){ + holder.itemView.setOnClickListener(new OnPageClickListener(realPosition)); } - try { - viewPager.setCurrentItem(position, false); - }catch (IllegalStateException e){} } @Override - public boolean isViewFromObject(View view, Object object) { - return view == object; + public int getItemCount() { + //根据模式决定长度 + if(datas.size() == 0) return 0; + return canLoop ? 3*datas.size() : datas.size(); } - public void setCanLoop(boolean canLoop) { + public void setCanLoop(boolean canLoop){ this.canLoop = canLoop; } - public void setViewPager(CBLoopViewPager viewPager) { - this.viewPager = viewPager; + public int getRealItemCount(){ + return datas!=null?datas.size():0; } - public CBPageAdapter(CBViewHolderCreator holderCreator, List datas) { - this.holderCreator = holderCreator; - this.mDatas = datas; + public boolean isCanLoop() { + return canLoop; } - public View getView(int position, View view, ViewGroup container) { - Holder holder = null; - if (view == null) { - holder = (Holder) holderCreator.createHolder(); - view = holder.createView(container.getContext()); - view.setTag(R.id.cb_item_tag, holder); - } else { - holder = (Holder) view.getTag(R.id.cb_item_tag); - } - if (mDatas != null && !mDatas.isEmpty()) - holder.UpdateUI(container.getContext(), position, mDatas.get(position)); - return view; + public void setOnItemClickListener(OnItemClickListener onItemClickListener) { + this.onItemClickListener = onItemClickListener; } -// public void setOnItemClickListener(View.OnClickListener onItemClickListener) { -// this.onItemClickListener = onItemClickListener; -// } + class OnPageClickListener implements View.OnClickListener { + private int position; + public OnPageClickListener(int position){ + this.position = position; + } + @Override + public void onClick(View v) { + if(onItemClickListener != null) + onItemClickListener.onItemClick(position); + } + + public int getPosition() { + return position; + } + + public void setPosition(int position) { + this.position = position; + } + } } diff --git a/convenientbanner/src/main/java/com/bigkoo/convenientbanner/adapter/CBPageAdapterHelper.java b/convenientbanner/src/main/java/com/bigkoo/convenientbanner/adapter/CBPageAdapterHelper.java new file mode 100644 index 0000000..10d1fd8 --- /dev/null +++ b/convenientbanner/src/main/java/com/bigkoo/convenientbanner/adapter/CBPageAdapterHelper.java @@ -0,0 +1,49 @@ +package com.bigkoo.convenientbanner.adapter; + +import android.view.View; +import android.view.ViewGroup; + +import com.bigkoo.convenientbanner.utils.ScreenUtil; + +import androidx.recyclerview.widget.RecyclerView; + +/** + * adapter中调用onCreateViewHolder, onBindViewHolder + * Created by jameson on 9/1/16. + * changed by 二精-霁雪清虹 on 2017/11/19 + * changed by Sai on 2018/04/25 + */ +public class CBPageAdapterHelper { + public static int sPagePadding = 0; + public static int sShowLeftCardWidth = 0; + + public void onCreateViewHolder(ViewGroup parent, View itemView) { + RecyclerView.LayoutParams lp = (RecyclerView.LayoutParams) itemView.getLayoutParams(); + lp.width = parent.getWidth() - ScreenUtil.dip2px(itemView.getContext(), 2 * (sPagePadding + sShowLeftCardWidth)); + itemView.setLayoutParams(lp); + } + + public void onBindViewHolder(View itemView, final int position, int itemCount) { + int padding = ScreenUtil.dip2px(itemView.getContext(), sPagePadding); + itemView.setPadding(padding, 0, padding, 0); + int leftMarin = position == 0 ? padding + ScreenUtil.dip2px(itemView.getContext(), sShowLeftCardWidth) : 0; + int rightMarin = position == itemCount - 1 ? padding + ScreenUtil.dip2px(itemView.getContext(), sShowLeftCardWidth) : 0; + setViewMargin(itemView, leftMarin, 0, rightMarin, 0); + } + + private void setViewMargin(View view, int left, int top, int right, int bottom) { + ViewGroup.MarginLayoutParams lp = (ViewGroup.MarginLayoutParams) view.getLayoutParams(); + if (lp.leftMargin != left || lp.topMargin != top || lp.rightMargin != right || lp.bottomMargin != bottom) { + lp.setMargins(left, top, right, bottom); + view.setLayoutParams(lp); + } + } + + public void setPagePadding(int pagePadding) { + sPagePadding = pagePadding; + } + + public void setShowLeftCardWidth(int showLeftCardWidth) { + sShowLeftCardWidth = showLeftCardWidth; + } +} diff --git a/convenientbanner/src/main/java/com/bigkoo/convenientbanner/helper/CBLoopScaleHelper.java b/convenientbanner/src/main/java/com/bigkoo/convenientbanner/helper/CBLoopScaleHelper.java new file mode 100644 index 0000000..5073014 --- /dev/null +++ b/convenientbanner/src/main/java/com/bigkoo/convenientbanner/helper/CBLoopScaleHelper.java @@ -0,0 +1,164 @@ +package com.bigkoo.convenientbanner.helper; + +import android.view.View; +import android.view.ViewTreeObserver; + +import com.bigkoo.convenientbanner.adapter.CBPageAdapter; +import com.bigkoo.convenientbanner.listener.OnPageChangeListener; +import com.bigkoo.convenientbanner.view.CBLoopViewPager; + +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.PagerSnapHelper; +import androidx.recyclerview.widget.RecyclerView; + + +/** + * Created by jameson on 8/30/16. + * changed by 二精-霁雪清虹 on 2017/11/19 + * changed by Sai on 2018/04/25 + */ +public class CBLoopScaleHelper { + private CBLoopViewPager mRecyclerView; + + private int mPagePadding = 0; // 卡片的padding, 卡片间的距离等于2倍的mPagePadding + private int mShowLeftCardWidth = 0; // 左边卡片显示大小 + + private int mFirstItemPos; + + private PagerSnapHelper mPagerSnapHelper = new PagerSnapHelper(); + private OnPageChangeListener onPageChangeListener; + + public void attachToRecyclerView(final CBLoopViewPager mRecyclerView) { + if (mRecyclerView == null) { + return; + } + this.mRecyclerView = mRecyclerView; + mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() { + @Override + public void onScrollStateChanged(RecyclerView recyclerView, int newState) { + super.onScrollStateChanged(recyclerView, newState); + int position = getCurrentItem(); + //这里变换位置实现循环 + CBPageAdapter adapter = (CBPageAdapter) mRecyclerView.getAdapter(); + int count = adapter.getRealItemCount(); + if(adapter.isCanLoop()) { + if (position < count) { + position = count + position; + setCurrentItem(position); + } else if (position >= 2 * count) { + position = position - count; + setCurrentItem(position); + } + } + if(onPageChangeListener != null) { + onPageChangeListener.onScrollStateChanged(recyclerView, newState); + if(count != 0) + onPageChangeListener.onPageSelected(position % count); + } + } + + @Override + public void onScrolled(RecyclerView recyclerView, int dx, int dy) { + //Log.e("TAG", String.format("onScrolled dx=%s, dy=%s", dx, dy)); + super.onScrolled(recyclerView, dx, dy); + if(onPageChangeListener != null) + onPageChangeListener.onScrolled(recyclerView, dx, dy); + onScrolledChangedCallback(); + } + }); + initWidth(); + mPagerSnapHelper.attachToRecyclerView(mRecyclerView); + } + + /** + * 初始化卡片宽度 + */ + private void initWidth() { + mRecyclerView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { + @Override + public void onGlobalLayout() { + mRecyclerView.getViewTreeObserver().removeGlobalOnLayoutListener(this); + scrollToPosition(mFirstItemPos); + } + }); + } + + public void setCurrentItem(int item) { + setCurrentItem(item,false); + } + + public void setCurrentItem(int item, boolean smoothScroll) { + if (mRecyclerView == null) { + return; + } + if (smoothScroll) { + mRecyclerView.smoothScrollToPosition(item); + }else { + scrollToPosition(item); + } + } + + public void scrollToPosition(int pos) { + if (mRecyclerView == null) { + return; + } + ((LinearLayoutManager) mRecyclerView.getLayoutManager()). + scrollToPositionWithOffset(pos, + (mPagePadding + mShowLeftCardWidth)); + mRecyclerView.post(new Runnable() { + @Override + public void run() { + onScrolledChangedCallback(); + } + }); + } + + public void setFirstItemPos(int firstItemPos) { + this.mFirstItemPos = firstItemPos; + } + + + /** + * RecyclerView位移事件监听, view大小随位移事件变化 + */ + private void onScrolledChangedCallback() { + + } + + public int getCurrentItem() { + try { + RecyclerView.LayoutManager layoutManager = mRecyclerView.getLayoutManager(); + View view = mPagerSnapHelper.findSnapView(layoutManager); + if (view != null) + return layoutManager.getPosition(view); + }catch (NullPointerException e){e.printStackTrace();} + return 0; + } + public int getRealCurrentItem() { + CBPageAdapter adapter = (CBPageAdapter) mRecyclerView.getAdapter(); + int count = adapter.getRealItemCount(); + return getCurrentItem()%count; + } + + public void setPagePadding(int pagePadding) { + mPagePadding = pagePadding; + } + + public void setShowLeftCardWidth(int showLeftCardWidth) { + mShowLeftCardWidth = showLeftCardWidth; + } + + public int getFirstItemPos() { + return mFirstItemPos; + } + + public int getRealItemCount(){ + CBPageAdapter adapter = (CBPageAdapter) mRecyclerView.getAdapter(); + int count = adapter.getRealItemCount(); + return count; + } + + public void setOnPageChangeListener(OnPageChangeListener onPageChangeListener) { + this.onPageChangeListener = onPageChangeListener; + } +} diff --git a/convenientbanner/src/main/java/com/bigkoo/convenientbanner/holder/CBViewHolderCreator.java b/convenientbanner/src/main/java/com/bigkoo/convenientbanner/holder/CBViewHolderCreator.java index acdb192..9063499 100755 --- a/convenientbanner/src/main/java/com/bigkoo/convenientbanner/holder/CBViewHolderCreator.java +++ b/convenientbanner/src/main/java/com/bigkoo/convenientbanner/holder/CBViewHolderCreator.java @@ -1,10 +1,14 @@ package com.bigkoo.convenientbanner.holder; + +import android.view.View; + /** * @ClassName : ViewHolderCreator * @Description : * @Author Sai * @Date 2014年11月30日 下午3:29:34 */ -public interface CBViewHolderCreator { - public Holder createHolder(); +public interface CBViewHolderCreator { + Holder createHolder(View itemView); + int getLayoutId(); } diff --git a/convenientbanner/src/main/java/com/bigkoo/convenientbanner/holder/Holder.java b/convenientbanner/src/main/java/com/bigkoo/convenientbanner/holder/Holder.java index e0d1bde..b74b69c 100644 --- a/convenientbanner/src/main/java/com/bigkoo/convenientbanner/holder/Holder.java +++ b/convenientbanner/src/main/java/com/bigkoo/convenientbanner/holder/Holder.java @@ -2,13 +2,21 @@ /** * Created by Sai on 15/12/14. + * * @param 任何你指定的对象 */ -import android.content.Context; import android.view.View; -public interface Holder{ - View createView(Context context); - void UpdateUI(Context context,int position,T data); -} \ No newline at end of file +import androidx.recyclerview.widget.RecyclerView; + +public abstract class Holder extends RecyclerView.ViewHolder { + public Holder(View itemView) { + super(itemView); + initView(itemView); + } + + protected abstract void initView(View itemView); + + public abstract void updateUI(T data); +} diff --git a/convenientbanner/src/main/java/com/bigkoo/convenientbanner/listener/CBPageChangeListener.java b/convenientbanner/src/main/java/com/bigkoo/convenientbanner/listener/CBPageChangeListener.java index 7979f02..5f72ea8 100755 --- a/convenientbanner/src/main/java/com/bigkoo/convenientbanner/listener/CBPageChangeListener.java +++ b/convenientbanner/src/main/java/com/bigkoo/convenientbanner/listener/CBPageChangeListener.java @@ -1,6 +1,6 @@ package com.bigkoo.convenientbanner.listener; -import android.support.v4.view.ViewPager; +import androidx.recyclerview.widget.RecyclerView; import android.widget.ImageView; import java.util.ArrayList; @@ -9,25 +9,23 @@ * Created by Sai on 15/7/29. * 翻页指示器适配器 */ -public class CBPageChangeListener implements ViewPager.OnPageChangeListener { +public class CBPageChangeListener implements OnPageChangeListener{ private ArrayList pointViews; private int[] page_indicatorId; - private ViewPager.OnPageChangeListener onPageChangeListener; + private OnPageChangeListener onPageChangeListener; public CBPageChangeListener(ArrayList pointViews,int page_indicatorId[]){ this.pointViews=pointViews; this.page_indicatorId = page_indicatorId; } - @Override - public void onPageScrollStateChanged(int state) { - if(onPageChangeListener != null)onPageChangeListener.onPageScrollStateChanged(state); + + public void onScrollStateChanged(RecyclerView recyclerView, int newState) { + if(onPageChangeListener != null)onPageChangeListener.onScrollStateChanged(recyclerView, newState); } - @Override - public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { - if(onPageChangeListener != null)onPageChangeListener.onPageScrolled(position,positionOffset,positionOffsetPixels); + public void onScrolled(RecyclerView recyclerView, int dx, int dy) { + if(onPageChangeListener != null)onPageChangeListener.onScrolled(recyclerView,dx,dy); } - @Override public void onPageSelected(int index) { for (int i = 0; i < pointViews.size(); i++) { pointViews.get(index).setImageResource(page_indicatorId[1]); @@ -39,7 +37,7 @@ public void onPageSelected(int index) { } - public void setOnPageChangeListener(ViewPager.OnPageChangeListener onPageChangeListener) { + public void setOnPageChangeListener(OnPageChangeListener onPageChangeListener) { this.onPageChangeListener = onPageChangeListener; } } diff --git a/convenientbanner/src/main/java/com/bigkoo/convenientbanner/listener/OnItemClickListener.java b/convenientbanner/src/main/java/com/bigkoo/convenientbanner/listener/OnItemClickListener.java index 7d72506..6e453e4 100755 --- a/convenientbanner/src/main/java/com/bigkoo/convenientbanner/listener/OnItemClickListener.java +++ b/convenientbanner/src/main/java/com/bigkoo/convenientbanner/listener/OnItemClickListener.java @@ -4,5 +4,5 @@ * Created by Sai on 15/11/13. */ public interface OnItemClickListener { - public void onItemClick(int position); + void onItemClick(int position); } diff --git a/convenientbanner/src/main/java/com/bigkoo/convenientbanner/listener/OnPageChangeListener.java b/convenientbanner/src/main/java/com/bigkoo/convenientbanner/listener/OnPageChangeListener.java new file mode 100644 index 0000000..2973d6e --- /dev/null +++ b/convenientbanner/src/main/java/com/bigkoo/convenientbanner/listener/OnPageChangeListener.java @@ -0,0 +1,14 @@ +package com.bigkoo.convenientbanner.listener; + + +import androidx.recyclerview.widget.RecyclerView; + +/** + * Created by Sai on 2018/4/25. + */ + +public interface OnPageChangeListener { + void onScrollStateChanged(RecyclerView recyclerView, int newState); + void onScrolled(RecyclerView recyclerView, int dx, int dy); + void onPageSelected(int index); +} diff --git a/convenientbanner/src/main/java/com/bigkoo/convenientbanner/utils/ScreenUtil.java b/convenientbanner/src/main/java/com/bigkoo/convenientbanner/utils/ScreenUtil.java new file mode 100644 index 0000000..09019d4 --- /dev/null +++ b/convenientbanner/src/main/java/com/bigkoo/convenientbanner/utils/ScreenUtil.java @@ -0,0 +1,40 @@ +package com.bigkoo.convenientbanner.utils; + +import android.annotation.TargetApi; +import android.content.Context; +import android.graphics.Point; +import android.os.Build; +import android.view.WindowManager; + +/** + * Created by Sai on 2018/4/25. + */ + +public class ScreenUtil { + @TargetApi(Build.VERSION_CODES.HONEYCOMB_MR2) + public static int getScreenWidth(Context context) { + WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); + Point p = new Point(); + wm.getDefaultDisplay().getSize(p); + return p.x; + } + + @TargetApi(Build.VERSION_CODES.HONEYCOMB_MR2) + public static int getScreenHeight(Context context) { + WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); + Point p = new Point(); + wm.getDefaultDisplay().getSize(p); + return p.y; + } + + public static int dip2px(Context context, float dpValue) { + final float scale = context.getResources().getDisplayMetrics().density; + return (int) (dpValue * scale + 0.5f); + } + + public static int px2dip(Context context, float pxValue) { + final float scale = context.getResources().getDisplayMetrics().density; + return (int) (pxValue / scale + 0.5f); + } + +} diff --git a/convenientbanner/src/main/java/com/bigkoo/convenientbanner/view/CBLoopViewPager.java b/convenientbanner/src/main/java/com/bigkoo/convenientbanner/view/CBLoopViewPager.java index a22c5cd..3cf3fd4 100755 --- a/convenientbanner/src/main/java/com/bigkoo/convenientbanner/view/CBLoopViewPager.java +++ b/convenientbanner/src/main/java/com/bigkoo/convenientbanner/view/CBLoopViewPager.java @@ -1,168 +1,46 @@ package com.bigkoo.convenientbanner.view; import android.content.Context; -import android.support.v4.view.PagerAdapter; -import android.support.v4.view.ViewPager; import android.util.AttributeSet; -import android.view.MotionEvent; -import com.bigkoo.convenientbanner.adapter.CBPageAdapter; -import com.bigkoo.convenientbanner.listener.OnItemClickListener; +import androidx.recyclerview.widget.RecyclerView; -public class CBLoopViewPager extends ViewPager { - OnPageChangeListener mOuterPageChangeListener; - private OnItemClickListener onItemClickListener; - private CBPageAdapter mAdapter; - - private boolean isCanScroll = true; - private boolean canLoop = true; - - public void setAdapter(PagerAdapter adapter, boolean canLoop) { - mAdapter = (CBPageAdapter) adapter; - mAdapter.setCanLoop(canLoop); - mAdapter.setViewPager(this); - super.setAdapter(mAdapter); - - setCurrentItem(getFristItem(), false); - } - - public int getFristItem() { - return canLoop ? mAdapter.getRealCount() : 0; - } - - public int getLastItem() { - return mAdapter.getRealCount() - 1; - } - - public boolean isCanScroll() { - return isCanScroll; - } - - public void setCanScroll(boolean isCanScroll) { - this.isCanScroll = isCanScroll; - } - - private float oldX = 0, newX = 0; - private static final float sens = 5; - - @Override - public boolean onTouchEvent(MotionEvent ev) { - if (isCanScroll) { - if (onItemClickListener != null) { - switch (ev.getAction()) { - case MotionEvent.ACTION_DOWN: - oldX = ev.getX(); - break; - - case MotionEvent.ACTION_UP: - newX = ev.getX(); - if (Math.abs(oldX - newX) < sens) { - onItemClickListener.onItemClick((getRealItem())); - } - oldX = 0; - newX = 0; - break; - } - } - return super.onTouchEvent(ev); - } else - return false; - } - - @Override - public boolean onInterceptTouchEvent(MotionEvent ev) { - if (isCanScroll) - return super.onInterceptTouchEvent(ev); - else - return false; - } - - public CBPageAdapter getAdapter() { - return mAdapter; - } - - public int getRealItem() { - return mAdapter != null ? mAdapter.toRealPosition(super.getCurrentItem()) : 0; - } - - @Override - public void setOnPageChangeListener(OnPageChangeListener listener) { - mOuterPageChangeListener = listener; - } +public class CBLoopViewPager extends RecyclerView { + private static final float FLING_SCALE_DOWN_FACTOR = 0.5f; // 减速因子 + private static final int FLING_MAX_VELOCITY = 3000; // 最大顺时滑动速度 + private static boolean mEnableLimitVelocity = true; // 最大顺时滑动速度 public CBLoopViewPager(Context context) { super(context); - init(); } - public CBLoopViewPager(Context context, AttributeSet attrs) { + public CBLoopViewPager(Context context,AttributeSet attrs) { super(context, attrs); - init(); } - private void init() { - super.setOnPageChangeListener(onPageChangeListener); + public CBLoopViewPager(Context context,AttributeSet attrs, int defStyle) { + super(context, attrs, defStyle); } - private OnPageChangeListener onPageChangeListener = new OnPageChangeListener() { - private float mPreviousPosition = -1; - @Override - public void onPageSelected(int position) { - int realPosition = mAdapter.toRealPosition(position); - if (mPreviousPosition != realPosition) { - mPreviousPosition = realPosition; - if (mOuterPageChangeListener != null) { - mOuterPageChangeListener.onPageSelected(realPosition); - } - } - } - - @Override - public void onPageScrolled(int position, float positionOffset, - int positionOffsetPixels) { - int realPosition = position; - - if (mOuterPageChangeListener != null) { - if (realPosition != mAdapter.getRealCount() - 1) { - mOuterPageChangeListener.onPageScrolled(realPosition, - positionOffset, positionOffsetPixels); - } else { - if (positionOffset > .5) { - mOuterPageChangeListener.onPageScrolled(0, 0, 0); - } else { - mOuterPageChangeListener.onPageScrolled(realPosition, - 0, 0); - } - } - } - } - - @Override - public void onPageScrollStateChanged(int state) { - if (mOuterPageChangeListener != null) { - mOuterPageChangeListener.onPageScrollStateChanged(state); - } + @Override + public boolean fling(int velocityX, int velocityY) { + if (mEnableLimitVelocity) { + velocityX = solveVelocity(velocityX); + velocityY = solveVelocity(velocityY); } - }; - - public boolean isCanLoop() { - return canLoop; + return super.fling(velocityX, velocityY); } - public void setCanLoop(boolean canLoop) { - this.canLoop = canLoop; - if (canLoop == false) { - setCurrentItem(getRealItem(), false); + private int solveVelocity(int velocity) { + if (velocity > 0) { + return Math.min(velocity, FLING_MAX_VELOCITY); + } else { + return Math.max(velocity, -FLING_MAX_VELOCITY); } - if (mAdapter == null) return; - mAdapter.setCanLoop(canLoop); - mAdapter.notifyDataSetChanged(); } - public void setOnItemClickListener(OnItemClickListener onItemClickListener) { - this.onItemClickListener = onItemClickListener; - } + } diff --git a/convenientbanner/src/main/res/layout/include_viewpager.xml b/convenientbanner/src/main/res/layout/include_viewpager.xml index ac27ef8..39f599c 100755 --- a/convenientbanner/src/main/res/layout/include_viewpager.xml +++ b/convenientbanner/src/main/res/layout/include_viewpager.xml @@ -1,12 +1,7 @@ - - - + android:layout_height="match_parent" > - - \ No newline at end of file + \ No newline at end of file diff --git a/convenientbanner/src/main/res/values/attrs.xml b/convenientbanner/src/main/res/values/attrs.xml index 0735e34..4173864 100755 --- a/convenientbanner/src/main/res/values/attrs.xml +++ b/convenientbanner/src/main/res/values/attrs.xml @@ -2,5 +2,6 @@ + \ No newline at end of file diff --git a/convenientbanner/src/main/res/values/dimens.xml b/convenientbanner/src/main/res/values/dimens.xml new file mode 100644 index 0000000..9f18a2e --- /dev/null +++ b/convenientbanner/src/main/res/values/dimens.xml @@ -0,0 +1,4 @@ + + + 10dp + \ No newline at end of file diff --git a/convenientbanner/src/main/res/values/strings.xml b/convenientbanner/src/main/res/values/strings.xml new file mode 100644 index 0000000..29db4f2 --- /dev/null +++ b/convenientbanner/src/main/res/values/strings.xml @@ -0,0 +1,3 @@ + + ConvenientBanner + diff --git a/gradle.properties b/gradle.properties index e42e991..9e6fce1 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,15 +1,19 @@ -## Project-wide Gradle settings. -# +# Project-wide Gradle settings. + +# IDE (e.g. Android Studio) users: +# Gradle settings configured through the IDE *will override* +# any settings specified in this file. + # For more details on how to configure your build environment visit # http://www.gradle.org/docs/current/userguide/build_environment.html -# + # Specifies the JVM arguments used for the daemon process. # The setting is particularly useful for tweaking memory settings. -# Default value: -Xmx10248m -XX:MaxPermSize=256m -# org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8 -# +android.enableJetifier=true +android.useAndroidX=true +org.gradle.jvmargs=-Xmx1536m + # When configured, Gradle will run in incubating parallel mode. # This option should only be used with decoupled projects. More details, visit # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects # org.gradle.parallel=true -#Thu Nov 05 14:58:48 CST 2015 diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index 8c0fb64..13372ae 100644 Binary files a/gradle/wrapper/gradle-wrapper.jar and b/gradle/wrapper/gradle-wrapper.jar differ diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 0c71e76..719b9ba 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ -#Wed Apr 10 15:27:10 PDT 2013 +#Fri Apr 05 12:08:21 CST 2019 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-2.2.1-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-4.10.1-all.zip diff --git a/gradlew b/gradlew index 91a7e26..9d82f78 100755 --- a/gradlew +++ b/gradlew @@ -42,11 +42,6 @@ case "`uname`" in ;; esac -# For Cygwin, ensure paths are in UNIX format before anything is touched. -if $cygwin ; then - [ -n "$JAVA_HOME" ] && JAVA_HOME=`cygpath --unix "$JAVA_HOME"` -fi - # Attempt to set APP_HOME # Resolve links: $0 may be a link PRG="$0" @@ -61,9 +56,9 @@ while [ -h "$PRG" ] ; do fi done SAVED="`pwd`" -cd "`dirname \"$PRG\"`/" >&- +cd "`dirname \"$PRG\"`/" >/dev/null APP_HOME="`pwd -P`" -cd "$SAVED" >&- +cd "$SAVED" >/dev/null CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar @@ -114,6 +109,7 @@ fi if $cygwin ; then APP_HOME=`cygpath --path --mixed "$APP_HOME"` CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + JAVACMD=`cygpath --unix "$JAVACMD"` # We build the pattern for arguments to be converted via cygpath ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`