ViewPager 优化
作者原帖是模仿了QQ音乐的一个功能,我觉得比较有用的是ViewPager的优化。提供了很好的性能优化示例。
转自 http://bxbxbai.gitcafe.io/2015/04/07/swipe-playbar/
可以滑动切歌的播放控制条(模仿QQ音乐)
看了QQ音乐Android版有这个功能,觉得挺好玩的,就模仿它做了一个demo,可以滑动切歌(转换的gif严重失真,只能截图了 -.-)
项目地址:https://github.com/bxbxbai/SwipePlaybarDemo
下载地址:http://vdisk.weibo.com/s/GGofvp4_QVU/1428410542
底部播放条的歌曲信息可以滑动切换,并且专辑图会转动
##看看截图
这个是4个播放条的截图:
##实现
这个功能就是使用ViewPager
这个组件来实现,然后最主要的就是为这个ViewPager
写一个PagerAapter
。这个PagerAdapter
写起来也容易,但是我在这个类里做了一些优化。
这个PagerAdapter
的全部代码就在下面:
/*** PlayBar ViewPager Adapter * * @author bxbxbai
*/
public class PlayCtrlBarPagerAdapter extends PagerAdapter {private static final int NUM_SONGS = 10;private static final int ANIMATOR_DURATION = 1000 * 10;private LayoutInflater mInflater;private Queue<View> mReusableViews;public PlayCtrlBarPagerAdapter(Context context) {mInflater = LayoutInflater.from(context);mReusableViews = new ArrayDeque<>(NUM_SONGS);}@Overridepublic int getCount() {return NUM_SONGS;}@Overridepublic boolean isViewFromObject(View view, Object object) {return view == object;}@Overridepublic void destroyItem(ViewGroup container, int position, Object object) {if (object instanceof View) {container.removeView((View) object);mReusableViews.add((View) object);}}@Overridepublic Object instantiateItem(ViewGroup container, int position) {View v = mReusableViews.poll();if (v == null) {v = mInflater.inflate(R.layout.layout_music, container, false);setAnimator(v);}bindData(v, position);container.addView(v);return v;}private void bindData(View v, int position) {TextView songName = ButterKnife.findById(v, R.id.tv_song_name);songName.setText("Try - " + position);ImageView artistImage = ButterKnife.findById(v, R.id.iv_artist_cover);if (position % 2 == 1) {artistImage.setImageResource(R.drawable.adele);} else {artistImage.setImageResource(R.drawable.bxbxbai);}}@Overridepublic float getPageWidth(int position) {return 1.0f;}public static void setAnimator(View view) {ObjectAnimator animator = ObjectAnimator.ofFloat(view.findViewById(R.id.iv_artist_cover), "rotation", 0f, 360f);animator.setRepeatCount(Integer.MAX_VALUE);animator.setDuration(ANIMATOR_DURATION);animator.setInterpolator(new LinearInterpolator());view.setTag(R.id.tag_animator, animator);}
}
##优化PagerAdapter
PagerAdapter
和Android中ListView
的Adapter
类似,但是一个主要的不同就是PagerAdapter
提供了一个回调方法来让我们处理销毁的Item。
一个ViewPager
默认的offScreenPageLimit
为1,也就是说当一个ViewPager
当前显示页为2
,那么PagerAdapter
中还存在左右两个Pager,也就是1
和3
。此时,如果我们将ViewPager
滑向3
,那么PagerAdapter
首先会通过public void destroyItem(ViewGroup container, int position, Object object)
方法销毁第1
个Item,然后通过public Object instantiateItem(ViewGroup container, int position)
生成第4
的Item,并且显示当前的Item(为3
)。此时,PagerAdapter
中存在的Item为2
和4
从这个思路出发,我也就可以在destroyItem
方法中保存这个object,然后在instantiateItem
中使用。
###看上面的代码
我写了一个Queue<View> mReusableViews;
在destroyItem
中保存被销毁的Item,然后在instantiateItem
方法中首先去mReusableViews
中获取。
如果存在可以重用的Item,那么就不用inflate一个View了,直接绑定数据就可以。否则就创建一个新的View来使用
在实验过程中发现,如果ViewPager
的offScreenPageLimit
为1,那么只需要创建3个View,其他的View都可以重复使用,这样就可以提升性能了
##如何让ImageView转起来
在View
绑定数据的时候通过一个工具方法,为每个View
都设置一个ObjectAnimator
属性动画。然后我为这个ViewPager
专门写了一个ViewPager.PageTransformer
类
其实代码也很简单,就是当某一个page完全显示的时候(position为0),开始动画,否则停止动画
如果你需要在ViewPager
上添加一些其他特效,那么可以通过addTransformer
方法添加PageTransformer
/*** 播放条的PagerTransformer** @author bxbxbai*/
public class PlaybarPagerTransformer implements ViewPager.PageTransformer {private List<ViewPager.PageTransformer> mTransformers = new ArrayList<>();@Overridepublic void transformPage(View page, float position) {for (ViewPager.PageTransformer transformer : mTransformers) {transformer.transformPage(page, position);}//处理图片旋转StopWatch.log("page: " + page + ", pos: " + position);if (position == 0) {ObjectAnimator animator = (ObjectAnimator) page.getTag(R.id.tag_animator);if (animator != null) {animator.start();}} else if (position == -1 || position == -2 || position == 1) {ObjectAnimator animator = (ObjectAnimator) page.getTag(R.id.tag_animator);if (animator != null) {animator.end();}}}public void addTransformer(ViewPager.PageTransformer transformer) {if (transformer != null) {mTransformers.add(transformer);}}
}
Dependency - 依赖
- Java Development Kit (JDK) 7 +
- com.android.tools.build:gradle:1.0.0
- Android SDK
- Android SDK Build-tools 21.1.2
Build - 构建
git clone https://github.com/bxbxbai/SwipePlaybarDemo.git
用最新的IntelliJ IDE导入工程(Import Project),然后等待IDE下载gradle和依赖包即可
ViewPager 优化相关推荐
- viewpager初始化fragment没有绘制_Fragment在ViewPager中的正确应用(3)FragmentStatePagerAdapter优化了什么...
前言 Fragment在ViewPager中的正确应用(2)内存泄漏?内存溢出 错误终结者:Fragment在ViewPager中的正确应用 OK,填坑篇的文章来了. 当我打开官方文档准备开始了解Fr ...
- ViewPager -- Fragment 切换卡顿 性能优化
当ViewPager切换到当前的Fragment时,Fragment会加载布局并显示内容,如果用户这时快速切换ViewPager,即 Fragment需要加载UI内容,而又频繁地切换Fragment, ...
- viewpager的优化
##优化PagerAdapter PagerAdapter和Android中ListView的Adapter类似,但是一个主要的不同就是PagerAdapter提供了一个回调方法来让我们处理销毁的It ...
- ViewPager一屏显示多个item,及边缘滑动事件优化
关于ViewPager显示两边的item方法,网络上是方法都在ViewPager外包一个Layout, 然后设置ViewPager和外面的Layout的clipChildren="false ...
- android viewpager 复杂指示器_View Pager 性能优化之 无限循环
ViewPager实现无限滑动 方案一:将viewpager上限设置成一个很大的数,第一个页面设置到中间.然后滑动的时候,用当前的序号与viewpager页面数取余得到目标页面的序号,然后显示出来.理 ...
- Android_性能优化之ViewPager加载成百上千高清大图oom解决方案
欢迎加入技术谈论群:714476794 一.背景 最近做项目需要用到选择图片上传,类似于微信.微博那样的图片选择器,ContentResolver读取本地图片资源并用RecyclerView+Glid ...
- Android, BaseAdapter 处理大数据量时的优化
Android优化 最常见的就是ListView, Gallery, GridView, ViewPager 的大数据优化 图片优化 访问网络的优化 优化的原则: 数据延迟加载 分批加载 本地 ...
- android 最新框架组合,android 官方mvp框架优化:lifecycle-mvp,像前端那样组合式写页面...
目录 1 前言 虽然在标题上,自己很随意的起了这么一个名字.其实并不是说它起个英文名就牛逼了.说白了,它其实就是mvp的思想加了lifecycle-component,然后加入了分层的思想,最后用Ty ...
- Android性能优化典范笔记(1)-GPU绘制性能优化
Android性能优化典范笔记(1)-GPU绘制性能优化 你还可以再Github上找到我的这篇文章:https://github.com/onlynight/ReadmeDemo/tree/maste ...
最新文章
- 系统科学丨钱学森:我对系统学认识的历程
- 如何才能识别市场趋势?[转]
- 图像识别落地机会最多 腾讯全面输出视觉AI
- MySQL—05—MySQL如何处理SQL语句;MySQL数据库存储引擎介绍;
- java工具类去掉字符串String中的.点。android开发java程序员常用工具类
- php 获取class id,CSS Class 與 CSS ID
- 计算机二级excel13,计算机二级Excel篇-实操真题详解13
- 三大主流消息中间件优缺点
- vba判断文件是否存在的两种方法
- 15款免费的 HTML5/CSS3 响应式网页模板
- Git XP 安装图解
- google crx Hoxx 下载
- Web前端计算FPS:使用原生requestAnimationFrame API
- 第二次作业-语言和文法
- linux网络协议栈ip_rcv
- Echarts Y轴遮挡解决方案
- Dubbo源码分析:全集整理
- 老股民看不下去了:看完我的经历你们再骂娘
- 测试儿童智力软件开发,四种常用儿童智力测试办法介绍
- 三款大四学生必备PDF阅读器,国产也可以很牛x