一、PhotoView的作用
PhotoView是继承ImageView的自定义控件,支持双击或者双指缩放。不仅支持单个的ImageView,同时也能与ViewPager、ScollView等父控件很好的兼容,亦能与ImageLoader、Picasso等
异步加载网路图片的框架很好的兼容。
二、使用
PhotoView的使用其实很简单,其关键点就是处理Touch事件和Matrix图形变换。
1.单张图片的图形变换
要想处理图片的图形变换,首先要获取
PhotoViewAttacher对象。
PhotoViewAttacher mAttacher = new PhotoViewAttacher(photoView);
photoView为findViewById获取到的PhotoView控件或者代码创建的PhotoView对象,也可以是ImageView。
(1)设置图片能双击或者双指缩放
mAttacher.setZoomable(!mAttacher.canZoom());
(2)设置图片在控件中显示的样式
mAttacher.setScaleType(ScaleType.CENTER_INSIDE);
与ImageView所支持的样式相同。
(3)设置图片点击(单击)后的事件,点击图片外的空白处无效。
mAttacher.setOnPhotoTapListener(new OnPhotoTapListener() {
@Override
public void onPhotoTap(View arg0, float arg1, float arg2) {
getActivity().finish();
}
- });
一般用ViewPager展示一组图片,点击某一张图片之后,可以查看占满屏幕的图片。其实是将ViewPager的点击事件设置为跳转到另外一个Activity中。该Activity中可以使用单个的ImageView(PhotoView),或者用ViewPager+
ImageView(PhotoView)实现所有图片的预览。设置该监听之后,用户点击图片,销毁当前Activity,即可实现图片预览效果。
2、图片的旋转
photo必须为PhotoView的实例。
(1)设置图片旋转多少度
photo.setRotationBy(10);
参数是指图片旋转的角度。与Handler搭配使用即可实现图片的旋转动画。
(2)设置图片旋转到哪个角度
photo.setRotationTo(0);
参数是指图片旋转到的角度。
3、与ViewPager搭配使用
一般使用ViewPager和PhotoView搭配使用时,都会自定义ViewPager,对ViewPager的拦截事件或者点击事件进行处理。
public class HackyViewPager extends ViewPager {
private boolean isLocked;//是否锁定ViewPager
public HackyViewPager(Context context) {
super(context);
isLocked = false;
}
public HackyViewPager(Context context, AttributeSet attrs) {
super(context, attrs);
isLocked = false;
}
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
if (!isLocked) {
try {
return super.onInterceptTouchEvent(ev);
} catch (IllegalArgumentException e) {
e.printStackTrace();
return false;
}
}
return false;
}
@Override
public boolean onTouchEvent(MotionEvent event) {
return !isLocked && super.onTouchEvent(event);
}
public void toggleLock() {
isLocked = !isLocked;
}
public void setLocked(boolean isLocked) {
this.isLocked = isLocked;
}
public boolean isLocked() {
return isLocked;
}
}
自定义一个类继承
PagerAdapter,
在该类中的instantiateItem的方法中返回PhotoView的实例或者包含PhotoView的布局填充的View对象,然后将该类的实例设置给ViewPager作为适配器。
4、与网络图片加载框架继承
与ImageView的使用方法一样,直接将对象作为参数传入即可。
如果使用了三个参数的方法,需要在
onLoadingComplete方法中调用
mAttacher
.update()方法。
ImageLoader.getInstance().displayImage(mImageUrl, mImageView, new SimpleImageLoadingListener() {
@Override
public void onLoadingStarted(String imageUri, View view) {
}
@Override
public void onLoadingFailed(String imageUri, View view, FailReason failReason) {
}
@Override
public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {
mAttacher.update();
}
});