作者原帖是模仿了QQ音乐的一个功能,我觉得比较有用的是ViewPager的优化。提供了很好的性能优化示例。

转自 http://bxbxbai.gitcafe.io/2015/04/07/swipe-playbar/

可以滑动切歌的播放控制条(模仿QQ音乐)

发表于 Apr 7 2015    |   暂无评论

看了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中ListViewAdapter类似,但是一个主要的不同就是PagerAdapter提供了一个回调方法来让我们处理销毁的Item。

一个ViewPager默认的offScreenPageLimit为1,也就是说当一个ViewPager当前显示页为2,那么PagerAdapter中还存在左右两个Pager,也就是13。此时,如果我们将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为24

从这个思路出发,我也就可以在destroyItem方法中保存这个object,然后在instantiateItem中使用。

###看上面的代码

我写了一个Queue<View> mReusableViews;destroyItem中保存被销毁的Item,然后在instantiateItem方法中首先去mReusableViews中获取。

如果存在可以重用的Item,那么就不用inflate一个View了,直接绑定数据就可以。否则就创建一个新的View来使用

在实验过程中发现,如果ViewPageroffScreenPageLimit为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 优化相关推荐

  1. viewpager初始化fragment没有绘制_Fragment在ViewPager中的正确应用(3)FragmentStatePagerAdapter优化了什么...

    前言 Fragment在ViewPager中的正确应用(2)内存泄漏?内存溢出 错误终结者:Fragment在ViewPager中的正确应用 OK,填坑篇的文章来了. 当我打开官方文档准备开始了解Fr ...

  2. ViewPager -- Fragment 切换卡顿 性能优化

    当ViewPager切换到当前的Fragment时,Fragment会加载布局并显示内容,如果用户这时快速切换ViewPager,即 Fragment需要加载UI内容,而又频繁地切换Fragment, ...

  3. viewpager的优化

    ##优化PagerAdapter PagerAdapter和Android中ListView的Adapter类似,但是一个主要的不同就是PagerAdapter提供了一个回调方法来让我们处理销毁的It ...

  4. ViewPager一屏显示多个item,及边缘滑动事件优化

    关于ViewPager显示两边的item方法,网络上是方法都在ViewPager外包一个Layout, 然后设置ViewPager和外面的Layout的clipChildren="false ...

  5. android viewpager 复杂指示器_View Pager 性能优化之 无限循环

    ViewPager实现无限滑动 方案一:将viewpager上限设置成一个很大的数,第一个页面设置到中间.然后滑动的时候,用当前的序号与viewpager页面数取余得到目标页面的序号,然后显示出来.理 ...

  6. Android_性能优化之ViewPager加载成百上千高清大图oom解决方案

    欢迎加入技术谈论群:714476794 一.背景 最近做项目需要用到选择图片上传,类似于微信.微博那样的图片选择器,ContentResolver读取本地图片资源并用RecyclerView+Glid ...

  7. Android, BaseAdapter 处理大数据量时的优化

    Android优化 最常见的就是ListView, Gallery, GridView, ViewPager 的大数据优化  图片优化  访问网络的优化 优化的原则: 数据延迟加载  分批加载  本地 ...

  8. android 最新框架组合,android 官方mvp框架优化:lifecycle-mvp,像前端那样组合式写页面...

    目录 1 前言 虽然在标题上,自己很随意的起了这么一个名字.其实并不是说它起个英文名就牛逼了.说白了,它其实就是mvp的思想加了lifecycle-component,然后加入了分层的思想,最后用Ty ...

  9. Android性能优化典范笔记(1)-GPU绘制性能优化

    Android性能优化典范笔记(1)-GPU绘制性能优化 你还可以再Github上找到我的这篇文章:https://github.com/onlynight/ReadmeDemo/tree/maste ...

最新文章

  1. 系统科学丨钱学森:我对系统学认识的历程
  2. 如何才能识别市场趋势?[转]
  3. 图像识别落地机会最多 腾讯全面输出视觉AI
  4. MySQL—05—MySQL如何处理SQL语句;MySQL数据库存储引擎介绍;
  5. java工具类去掉字符串String中的.点。android开发java程序员常用工具类
  6. php 获取class id,CSS Class 與 CSS ID
  7. 计算机二级excel13,计算机二级Excel篇-实操真题详解13
  8. 三大主流消息中间件优缺点
  9. vba判断文件是否存在的两种方法
  10. 15款免费的 HTML5/CSS3 响应式网页模板
  11. Git XP 安装图解
  12. google crx Hoxx 下载
  13. Web前端计算FPS:使用原生requestAnimationFrame API
  14. 第二次作业-语言和文法
  15. linux网络协议栈ip_rcv
  16. Echarts Y轴遮挡解决方案
  17. Dubbo源码分析:全集整理
  18. 老股民看不下去了:看完我的经历你们再骂娘
  19. 测试儿童智力软件开发,四种常用儿童智力测试办法介绍
  20. 三款大四学生必备PDF阅读器,国产也可以很牛x

热门文章

  1. C#:实体框架EF(entity framework)
  2. 【学习笔记】《卓有成效的管理者》 第二章 掌握自己的时间
  3. 关于cookie的跨域(一级域)
  4. .gitignore文件作用
  5. android微信群聊功能,Android仿微信群聊头像效果
  6. 二维插值-MATLAB
  7. MFC控件 --- 进度条【案例】
  8. java 历遍 类_[Java] 遍历指定包名下所有的类(支持jar) | 学步园
  9. python的self使用
  10. global mapper裁剪DEM文件的方法