1.Universal Image Loader
ImageLoader收到加载及显示图片的任务,并将它交给ImageLoaderEngine,ImageLoaderEngine分发任务到具体线程池去执行,任务通过Cache及ImageDownloader获取图片,最终转换为Bitmap交给BitmapDisplayer在ImageAware中显示。
1.双重检验锁模式(Double CheckLock)
先检查实例是否存在,不存在才进入同步块,优点:需要时才初始化单例和线程安全,避免消耗资源。
2.内存缓存,磁盘缓存,从网络加载
3.ImageLoaderConfiguration.Builder,DisplayImageOptions.Builder初始化配置代码采用Builder模式,将部件与组装过程分离,自由扩展,降低耦合。
4.将ImageView转换成ImageViewAware,ViewAware将ImageView的强引用变成弱引用, 当内存不足的时候,可以更好的回收ImageView对象
5.内存缓存默认使用了LRU算法。 Least Recently Used近期最少使用算法, 选用了基于链表结构的LinkedHashMap作为存储结构。假设内存缓存设置的阈值只够存储两个bitmap对象,当put第三个bitmap对象时,将近期最少使用的bitmap对象移除。
2.下拉刷新ListView
1.通过对ListView添加了一个刷新layout作为header,在滚动中时不断改变header的高度和内容并记录一些状态,在用户手指离开屏幕时根据状态决定进行刷新还是放弃刷新。
2.主要是通过重写ListView的onTouchEvent和OnScrollListener的onScrollStateChanged,onScroll函数实现
3.滑动冲突
1.ViewPager,当水平方向的距离大时则为水平滑动,父容器拦截事件,不拦截则传递给内部的ListView
2.StickyLayout ,事件落在header上父容器,或者竖直距离差小于水平距离差不拦截事件。ListView滑到顶部并向下滑动,header是展开状态并向上滑动父容器拦截事件。(onInterceptTouchEvent(MotionEvent
ev))
4.PagerSlidingTabStrip
pagerSlidingTabStrip
实现联动效果的原理是,它引用了 ViewPager
的OnPageChangeListener
。但是viewpager
注册的 listener
不是自身的OnPageChangeListener
,而是 pagerSlidingTabStrip
内部类PageListener
。 通过PageListener
实现对viewpager
和 tab
的封装。从而实现滑动联动效果。
5.CircleImageView
- 首先通过setImageXxx()方法设置图片Bitmap;
- 进入构造函数CircleImageView()获取自定义参数,以及调用setup()函数;
- 进入setup()函数(非常关键),进行图片画笔边界画笔(Paint)一些重绘参数初始化:构建渲染器BitmapShader用Bitmap来填充绘制区域,设置样式和内外圆半径计算等,以及调用updateShaderMatrix()函数和 invalidate()函数;
- 进入updateShaderMatrix()函数,计算缩放比例和平移,设置BitmapShader的Matrix参数等;
- 触发ondraw()函数完成最终的绘制。使用配置好的Paint先画出绘制内圆形来以后再画边界圆形。
网友评论