转载请注明出处:王亟亟的大牛之路

昨天写了篇基础的View绘制的内容貌似观众老爷们不怎么喜欢。那再这里再安利下自己定义View时。用到Paint Canvas的一些温故。讲讲用路径绘画实现动画效果(基础篇 三)

ViewPager相比大家都用烂了,实现也有多种多样,那为什么我又要贴这篇呢?

第一。表明态度,跟陈旧的universal-image-loader说再见

第二,确实内容写得不错


先来看下效果图:

这是默认的翻转模式,这里不做过多演示了。大家喜欢能够自己去尝试,动画库来源于

  compile 'com.ToxicBakery.viewpager.transforms:view-pager-transforms:1.2.32@aar'

原Demo里面有所有的动画实现,想看的能够下载看下https://github.com/saiwu-bigkoo/Android-ConvenientBanner/archive/master.zip

OH,再补下项目用到的资源

dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
testCompile 'junit:junit:4.12'
compile 'com.android.support:appcompat-v7:23.3.0'
compile 'com.apkfuns.logutils:library:1.2.2'
compile 'com.ToxicBakery.viewpager.transforms:view-pager-transforms:1.2.32@aar'
compile 'com.github.bumptech.glide:glide:3.7.0'
compile 'com.github.mrengineer13:snackbar:1.2.0'
}

重点说下为什么要替换掉universal-image-loader和怎么替换

理由1:维护,老项目在兴许持续更近的不多,最明显的是 volley,如今所比較的二者的优劣我就只是多分析了,别人也有些过很多。我给出传送门就好http://blog.csdn.net/richiezhu/article/details/46968569

理由2 :universal-image-loader配置太麻烦,在使用前必须做Config操作,虽然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);
}

Glide仅仅须要

 Glide.with(context).load(data).placeholder(R.mipmap.ic_default_adimage).into(imageView);

OK。那再来说下我改了些什么。顺便把怎样使用ConvenientBanner一起说了

布局文件中引用和正常使用一样,拽进去即可了

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".activity.MainActivity"> <wjj.com.viewpagerwithglide.lib.ConvenientBanner
android:id="@+id/banner"
android:layout_width="match_parent"
android:layout_height="200dp"
app:canLoop="true" />
</RelativeLayout> //自己定义标签这里是询问是否循环滚动。当然在java代码里也能够做这些事

在接下来就是获取控件对象

private void findID() {
banner = (ConvenientBanner) findViewById(R.id.banner);
}

再接下来就是对控件进行初始化操作。这边是调用public ConvenientBanner setPages(CBViewHolderCreator holderCreator, List<T> datas)来给予我们控件所需的数据源和布局内容

第一个參数就是我们的布局内容他封装成了一个Holder这里先不详解。后面会说的,事实上也就是像item之类的东西

第二个參数就是我们的数据源了。这里事实上就是我们这些图片的URL

 private void init() {
banner.setPages(new CBViewHolderCreator<BannerHolder>() {
@Override
public BannerHolder createHolder() {
return new BannerHolder();
}
}, Arrays.asList(getResources().getStringArray(R.array.imagesArray)))//设置两个点图片作为翻页指示器,不设置则没有指示器,能够依据自己需求自行配合自己的指示器,不须要圆点指示器可用不设
.setPageIndicator(new int[]{R.mipmap.ic_page_indicator, R.mipmap.ic_page_indicator_focused})
//设置指示器的方向
.setPageIndicatorAlign(ConvenientBanner.PageIndicatorAlign.ALIGN_PARENT_RIGHT)
.setOnItemClickListener(this)//点击监听
.setOnPageChangeListener(this);//监听翻页事件
}

这些东西都设置完会有一些对应的回调来处理我们的逻辑,样例里的点击事件就是一个自己定义的回调。使用例如以下

  @Override
public void onItemClick(int position) {
LogUtils.d("--->点击了第 " + position);
showToast(position);
} private void showToast(int position) {
short time = 2000;
new SnackBar.Builder(this)
.withMessage("点击了第" + position + "个页面")
.withActionMessage("确认")
.withDuration(time)
.show();
}

实现例如以下:

public interface OnItemClickListener {
public void onItemClick(int position);
}

实现事实上就是在控件的onTouchEvent事件里触发了这个回调。


使用大致就是如此,不是太麻烦仅仅要熟悉流程就非常清楚了(配置的项还有非常多比如动画效果之类的就没提,我都用的默认的)

OK我们来详细来解释下上面提到的Holder

在这里我们所构建的布局都是活的。都是在Holder里动态创建的我们来看一下,样例中是怎么做的

public class BannerHolder implements Holder<String> {

    private ImageView imageView;

    @Override
public View createView(Context context) {
imageView = new ImageView(context);
imageView.setScaleType(ImageView.ScaleType.FIT_XY);
return imageView; } @Override
public void UpdateUI(Context context, int position, String data) {
// LogUtils.d("UpdateUI --->position" + position + " ---> dataURL: " + data);
Glide.with(context).load(data).placeholder(R.mipmap.ic_default_adimage).into(imageView);
}
}

在createView中我们创建了所需的控件而且返回给了调用他的地方

UpdateUI,看名字就知道。是我们详细操作逻辑和绘制UI的地方

这2个方法看起来非常像adapter里getView里的操作,那我们往上读一读他是怎样实现的

往上一看果然是在adapter的getView里进行了操作,怪不得 用户不须要去重写adapter就能够实现ViewPager填充数据以及绘制UI的操作

 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<T>) view.getTag(R.id.cb_item_tag);
}
if (mDatas != null && !mDatas.isEmpty())
holder.UpdateUI(container.getContext(), position, mDatas.get(position));
return view;
}

大致分析就到这里,详细内容能够看下源代码。我已经把代码拆好了

包地址:https://github.com/ddwhan0123/BlogSample/tree/master/ViewPagerwithGlide

源代码下载地址:https://github.com/ddwhan0123/BlogSample/blob/master/ViewPagerwithGlide/ViewPagerwithGlide.zip

原作者git:https://github.com/saiwu-bigkoo

大字夸奖,我们的UI大美女提供了一系列美美的图,

refer_flag=1005050005_">微博地址

假设有一些生活或者技术上想交流的也能够微信我,扫以下毕竟是活人。所以认为自己会骚扰我的就别来了,谢主隆恩(最好有私活,来点生活费最好,Web or 移动端都行)

翻翻git之---效果鲜明的类ViewPager库 ConvenientBanner(对图片载入部分进行改动)的更多相关文章

  1. 翻翻git之---有用的欢迎页开源库 AppIntro

    转载请注明出处:王亟亟的大牛之路 今天没有P1.直接进入正题 今天上的是一个帅帅的app滑动介绍页 . 为什么说帅? 作者对自己的内容是这么定义的 Make a cool intro for your ...

  2. Android 画廊效果之ViewPager显示多个图片

    首先来看下面的效果: 从上面的图片可以看到,当添加多张图片的时候,能够在下方形成一个画廊的效果,我们左右拉动图片来看我们添加进去的图片,效果是不是好了很多呢?下面来看看怎么实现吧! 上面的效果类似An ...

  3. Android Handler 异步消息处理机制的妙用 创建强大的图片载入类

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/38476887 ,本文出自[张鸿洋的博客] 近期创建了一个群.方便大家交流,群号: ...

  4. Git 实用基础(配置,建库,提交,推送 GitHub)

    Git 实用基础(配置,建库,提交,推送 GitHub) SVN ? Git ? 目前市面上主流的版本控制系统就是 SVN 和 Git . 两者的区别简单通俗地说就是,版本数据是否有在本地. 如果觉得 ...

  5. Git使用简单教程,从建库到远程操作

    本地库初始化 找到项目文件->右键git bash->git init 设置签名 形式: 用户名 邮箱地址 作用: 区分不同开发人员身份 注意:这里设置的签名和登录的远程库的账号密码没有任 ...

  6. git 教程(2)--创建版本库

    什么是版本库呢?版本库又名仓库,英文名repository,你可以简单理解成一个目录,这个目录里面的所有文件都可以被Git管理起来,每个文件的修改.删除,Git都能跟踪,以便任何时刻都可以追踪历史,或 ...

  7. Git常用命令(二)------ 远程库操作

    本文总结自廖雪峰网站. Git支持多种协议,git://使用ssh协议,速度最快,也可使用https等协议. 对远程库操作: 推送: 1.先远程建立一个Repo库,f 2.远程和本地关联: git r ...

  8. git 本地提交代码到 github 远程库,没有弹框 github login

     git 本地提交代码到 github 远程库,没有弹框 github login:  原因: win10 有个凭据管理器,给保存了历史登陆用户名密码,导致无法切换用户. 解决办法: 删除历史登陆用户 ...

  9. 强大的金融类图表库 TradingView 使用分享

    这段时间刚好做币圈交易所,运用到了现在最火的金融类图表库 -- TradingView ,就是强大,基本上现在的火币网(https://www.huobi.com),币安网(https://www.b ...

随机推荐

  1. wepy - 与原生有什么不同(slot插槽)

    wepy官方文档是这样介绍的 简单描述就是: index.wpy:子组件 panel.wpy:父组件 1.slot是内容分发的占位符 2.slot父组件在子组件使用时,名称必须一致 3.slot子组件 ...

  2. HDU1588-Gauss Fibonacci(矩阵高速幂+等比数列二分求和)

    题目链接 题意:g(x) = k * x + b.f(x) 为Fibonacci数列.求f(g(x)),从x = 1到n的数字之和sum.并对m取模. 思路:  设A = |(1, 1),(1, 0) ...

  3. Divisibility by Eight

    把当前数删除几位然后能够整除与8 那么可得知大于3位数的推断能否整除于八的条件是(n%1000)%8==0 能够得出我们的结论:仅仅须要枚举后三位后两位后一位就可以知道是否可整除于8 #include ...

  4. Qt音乐播放器制作(一)Easy Player

    前几天忽然间认为,事到现在Qt的功底也有些基础了,为什么不试着自己做个玩意来玩玩呢?刚好在开源中国逛代码区的时候看到一个QKugou的项目,就想着做一个在线音乐播放器好了. 于是開始着手准备,忙活了一 ...

  5. JSTL不同版本和EL表达式的关联

    JSTL目前有3个版本:JSTL1.0.JSTL1.1.JSTL1.2 JSTL1.0和JSTL1.1包含jstl.jar和standard.jar这2个jar包,在j2ee4的版本中是需要单独引用这 ...

  6. JSTL fmt:formatNumber 数字、货币格式化

    <fmt:formatNumber value="12.34" pattern="#0.00" /> 12.34 保留小数点后两位数 <fmt ...

  7. Java多线程系列目录(转)

    转载方便自己学习,转自:Java多线程系列目录(共43篇) http://www.cnblogs.com/skywang12345/p/java_threads_category.html 最近,在研 ...

  8. java 打包war包

    jar -cvf  news.war news war包放在Tomcat webApp中可以自动解压.

  9. DevExpress.XtraLayout.LayoutControl 动态添加控件

    // Create an item within a specified group,// bound to a specified data field with the specified edi ...

  10. 交叉编译OpenWrt 定制固件

    在Centos7上交叉编译生成OpenWrt固件 安装ss-* 获取最新的ss, 当前是 wget https://github.com/shadowsocks/shadowsocks-libev/a ...