您当前的位置: 首页 > 

xiangzhihong8

暂无认证

  • 1浏览

    0关注

    1324博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

开源组件photoView学习

xiangzhihong8 发布时间:2016-02-24 11:17:38 ,浏览量:1

功能特性

 支持放缩超出边界,多点触控和双击事件

 滚动和滑动

 和ViewPager等能完美兼容

 矩阵变化等有回调,方便前台其他展示的改变

 单击,长按都有回调提醒

源码剖析 那么怎么来学习他的源码呢,我们从以下几个部分来说吧

 代码目录结构

 

 

从上面结构图中我们能知道他的功能总体划分,有了一个总体的认识啦。

 

 样例

 下面我们再来梳理一下他的调用流程,以一个简单的例子开始吧。

第一个是指定图片旋转90°

[java]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. photo.setRotationTo(90);  
第二个是拖拽移动

[java]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. ImageView mImageView = (ImageView) findViewById(R.id.iv_photo);  
  2. mCurrMatrixTv = (TextView) findViewById(R.id.tv_current_matrix);  
  3.   
  4. Drawable bitmap = getResources().getDrawable(R.drawable.wallpaper);  
  5. mImageView.setImageDrawable(bitmap);  
  6.   
  7. // The MAGIC happens here!  
  8. mAttacher = new PhotoViewAttacher(mImageView);  
  9.   
  10. // Lets attach some listeners, not required though!  
  11. mAttacher.setOnMatrixChangeListener(new MatrixChangeListener());  
  12. mAttacher.setOnPhotoTapListener(new PhotoTapListener());  

然后我们一步一步的跟踪,流程也清晰起来,来我们一起看看

 

 时序图

 好了,说了那么多,我们还没真正的开始看功能点的代码,下面呢,我们从代码级来分析一个个问题。我觉得根据问题来看代码,我们的主意力就会非常集中,在项目代码极其庞大的时候,是非常有效的办法,当然在像这样的小项目中呢,我们把问题铺的很多,问题解决了,代码其实也看的差不多了,好了,废话不多说了,先来第一个问题吧。

 

 1.图片的继承关系,是View还是ImageView,怎么改变图片的效果的?

结论:图片是继承了ImageView,根据Matrix矩阵改变显示drawable的显示效果的,我们都知道ImageView的展示模式有好几种分别是

[java]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. private static final ScaleType[] sScaleTypeArray = {  
  2.     ScaleType.MATRIX,  
  3.     ScaleType.FIT_XY,  
  4.     ScaleType.FIT_START,  
  5.     ScaleType.FIT_CENTER,  
  6.     ScaleType.FIT_END,  
  7.     ScaleType.CENTER,  
  8.     ScaleType.CENTER_CROP,  
  9.     ScaleType.CENTER_INSIDE  
  10. };  
我们把它设置为矩阵模式,那其他模式是不是不支持了呢,当然不是了,牛逼的地方就在他使用这几种模式,而把这几种模式在程序中模拟换算出来,设置还是矩阵模式。

 

 2.是怎么进行缩小放大操作?

还记得在结构图里面的标注吗,有个手势的,对的就是她了,放大的话,他有个最大比例的,缩小呢,也有个最小比例的,当放手的时候,会有个动画效果。

具体看

[java]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. // If the user has zoomed less than min scale, zoom back  
  2. // to min scale  
  3. if (getScale() = mMinimumVelocity) {  
  4.     mListener.onFling(mLastTouchX, mLastTouchY, -vX,  
  5.             -vY);  
  6. }  
正如我们所说的那样吧。

 

 8.好吧继续,放缩是在哪处理的呢?

 好吧,又有新姿势了,ScaleGestureDetector,可以接收MotionEvent,来检测放缩的发生, 有个回调监听器ScaleGestureDetector.OnScaleGestureListener,看看程序中怎么实现的他的回调方法

[java]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. @Override  
  2. public boolean onScale(ScaleGestureDetector detector) {  
  3.     float scaleFactor = detector.getScaleFactor();  
  4.   
  5.     if (Float.isNaN(scaleFactor) || Float.isInfinite(scaleFactor))  
  6.         return false;  
  7.   
  8.     mListener.onScale(scaleFactor,  
  9.             detector.getFocusX(), detector.getFocusY());  
  10.     return true;  
  11. }  
看到这是不是一切明了啊。呵呵。

 

 9.最后一个了,双击时间,长按事件呢?

 这个就简单些了, 因为我们经常会用到的GestureDetector,添加一个监听器就好了,来看看代码实现

[java]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. mGestureDetector = new GestureDetector(imageView.getContext(),  
  2.         new GestureDetector.SimpleOnGestureListener() {  
  3.   
  4.             // forward long click listener  
  5.             @Override  
  6.             public void onLongPress(MotionEvent e) {  
  7.                 if (null != mLongClickListener) {  
  8.                     mLongClickListener.onLongClick(getImageView());  
  9.                 }  
  10.             }  
  11.         });  
  12.   
  13. mGestureDetector.setOnDoubleTapListener(new DefaultOnDoubleTapListener(this));  
结语

好了,PhotoView这个开源项目,我们就剖析到这了, 牵涉到的东西还是蛮多的, 可以说是小巧精悍,很多知识点对我们都有很大的启发,后续大家如果还有什么问题,或者有不正确的地方, 可以提出来,共同探讨。

 

 Github地址

https://github.com/chrisbanes/PhotoView

关注
打赏
1482932726
查看更多评论
立即登录/注册

微信扫码登录

0.0471s