Emotiona

不管这个世界多么黑暗,我都要微笑以对!

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

一、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. });





posted on 2016-03-15 19:21  Emotiona  阅读(523)  评论(0编辑  收藏  举报