PhotoView

本文介绍了一个自定义的ImageView组件PhotoView,它支持双击或双指缩放,并且能够很好地与ViewPager、ScrollView等父控件及ImageLoader、Picasso等图片加载框架兼容。文章详细解释了如何使用PhotoView进行图片的放大缩小、旋转以及与ViewPager的配合使用。
摘要由CSDN通过智能技术生成

一、PhotoView的作用

    PhotoView是继承ImageView的自定义控件,支持双击或者双指缩放。不仅支持单个的ImageView,同时也能与ViewPager、ScollView等父控件很好的兼容,亦能与ImageLoader、Picasso等 异步加载网路图片的框架很好的兼容。

二、使用

    PhotoView的使用其实很简单,其关键点就是处理Touch事件和Matrix图形变换。

    1.单张图片的图形变换

         要想处理图片的图形变换,首先要获取 PhotoViewAttacher对象。
 
  
  1. PhotoViewAttacher mAttacher = new PhotoViewAttacher(photoView);
         photoView为findViewById获取到的PhotoView控件或者代码创建的PhotoView对象,也可以是ImageView。
         (1)设置图片能双击或者双指缩放
 
  
  1. mAttacher.setZoomable(!mAttacher.canZoom());
         (2)设置图片在控件中显示的样式
 
   
  1. mAttacher.setScaleType(ScaleType.CENTER_INSIDE);
         与ImageView所支持的样式相同。
         (3)设置图片点击(单击)后的事件,点击图片外的空白处无效。
 
   
  1. mAttacher.setOnPhotoTapListener(new OnPhotoTapListener() {
  2. @Override
  3. public void onPhotoTap(View arg0, float arg1, float arg2) {
  4. getActivity().finish();
  5. }
  6. });
         一般用ViewPager展示一组图片,点击某一张图片之后,可以查看占满屏幕的图片。其实是将ViewPager的点击事件设置为跳转到另外一个Activity中。该Activity中可以使用单个的ImageView(PhotoView),或者用ViewPager+ ImageView(PhotoView)实现所有图片的预览。设置该监听之后,用户点击图片,销毁当前Activity,即可实现图片预览效果。

    2、图片的旋转

         photo必须为PhotoView的实例。
         (1)设置图片旋转多少度
 
   
  1. photo.setRotationBy(10);
         参数是指图片旋转的角度。与Handler搭配使用即可实现图片的旋转动画。
          (2)设置图片旋转到哪个角度
 
   
  1. photo.setRotationTo(0);
         参数是指图片旋转到的角度。

    3、与ViewPager搭配使用

         一般使用ViewPager和PhotoView搭配使用时,都会自定义ViewPager,对ViewPager的拦截事件或者点击事件进行处理。
 
   
  1. public class HackyViewPager extends ViewPager {
  2. private boolean isLocked;//是否锁定ViewPager
  3. public HackyViewPager(Context context) {
  4. super(context);
  5. isLocked = false;
  6. }
  7. public HackyViewPager(Context context, AttributeSet attrs) {
  8. super(context, attrs);
  9. isLocked = false;
  10. }
  11. @Override
  12. public boolean onInterceptTouchEvent(MotionEvent ev) {
  13. if (!isLocked) {
  14. try {
  15. return super.onInterceptTouchEvent(ev);
  16. } catch (IllegalArgumentException e) {
  17. e.printStackTrace();
  18. return false;
  19. }
  20. }
  21. return false;
  22. }
  23. @Override
  24. public boolean onTouchEvent(MotionEvent event) {
  25. return !isLocked && super.onTouchEvent(event);
  26. }
  27. public void toggleLock() {
  28. isLocked = !isLocked;
  29. }
  30. public void setLocked(boolean isLocked) {
  31. this.isLocked = isLocked;
  32. }
  33. public boolean isLocked() {
  34. return isLocked;
  35. }
  36. }
         自定义一个类继承 PagerAdapter, 在该类中的instantiateItem的方法中返回PhotoView的实例或者包含PhotoView的布局填充的View对象,然后将该类的实例设置给ViewPager作为适配器。

    4、与网络图片加载框架继承

         与ImageView的使用方法一样,直接将对象作为参数传入即可。
         如果使用了三个参数的方法,需要在 onLoadingComplete方法中调用 mAttacher .update()方法。
 
   
  1. ImageLoader.getInstance().displayImage(mImageUrl, mImageView, new SimpleImageLoadingListener() {
  2. @Override
  3. public void onLoadingStarted(String imageUri, View view) {
  4. }
  5. @Override
  6. public void onLoadingFailed(String imageUri, View view, FailReason failReason) {
  7. }
  8. @Override
  9. public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {
  10. mAttacher.update();
  11. }
  12. });





转载于:https://www.cnblogs.com/Emotiona/p/5280781.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值