package com.bzh.mysimplefresco; import android.content.Context; import android.graphics.Bitmap; import android.graphics.drawable.Animatable; import android.graphics.drawable.Drawable; import android.net.Uri; import android.util.AttributeSet; import android.view.MotionEvent; import com.bzh.mysimplefresco.lib.LoadingProgressDrawable; import com.facebook.common.references.CloseableReference; import com.facebook.datasource.DataSource; import com.facebook.drawee.backends.pipeline.Fresco; import com.facebook.drawee.controller.AbstractDraweeController; import com.facebook.drawee.controller.BaseControllerListener; import com.facebook.drawee.generic.GenericDraweeHierarchy; import com.facebook.drawee.generic.GenericDraweeHierarchyBuilder; import com.facebook.drawee.view.DraweeHolder; import com.facebook.imagepipeline.common.ResizeOptions; import com.facebook.imagepipeline.core.ImagePipeline; import com.facebook.imagepipeline.image.CloseableImage; import com.facebook.imagepipeline.image.CloseableStaticBitmap; import com.facebook.imagepipeline.image.ImageInfo; import com.facebook.imagepipeline.request.ImageRequest; import com.facebook.imagepipeline.request.ImageRequestBuilder; import uk.co.senab.photoview.PhotoView; /** * ========================================================== <br> * <b>版权</b>:   别志华 版权所有(c) 2015 <br> * <b>作者</b>:   别志华 biezhihua@163.com<br> * <b>创建日期</b>: 2015/11/16 17:19 <br> * <b>描述</b>:   <br> * <b>版本</b>:  V1.0 <br> * <b>修订历史</b>: <br> * 自定义的View,我们就要处理好下面这几个函数, * 这样才能保证引用计数的正确性,否则可能就会引起内存泄露。 * 其实就是要在View移除屏幕或进入屏幕去维护好引用计数了。 * onAttachedToWindow() * onDetacherFromWindow() * onStartTemporaryDetach() * onFinishTemporaryDetach() * onTouchEvent() * ========================================================== <br> */ public class MyPhotoView extends PhotoView { private DraweeHolder<GenericDraweeHierarchy> mDraweeHolder; public MyPhotoView(Context context) { this(context, null); } public MyPhotoView(Context context, AttributeSet attr) { this(context, attr, 0); } public MyPhotoView(Context context, AttributeSet attr, int defStyle) { super(context, attr, defStyle); selfInit(); } private void selfInit() { if (mDraweeHolder == null) { final GenericDraweeHierarchy hierarchy = new GenericDraweeHierarchyBuilder(getResources()) .setProgressBarImage(new LoadingProgressDrawable(getContext())).build(); mDraweeHolder = DraweeHolder.create(hierarchy, getContext()); } } @Override protected void onDetachedFromWindow() { super.onDetachedFromWindow(); mDraweeHolder.onDetach(); } @Override protected void onAttachedToWindow() { super.onAttachedToWindow(); mDraweeHolder.onAttach(); } @Override protected boolean verifyDrawable(Drawable dr) { super.verifyDrawable(dr); return dr == mDraweeHolder.getHierarchy().getTopLevelDrawable(); } @Override public void onStartTemporaryDetach() { super.onStartTemporaryDetach(); mDraweeHolder.onDetach(); } @Override public void onFinishTemporaryDetach() { super.onFinishTemporaryDetach(); mDraweeHolder.onAttach(); } @Override public boolean onTouchEvent(MotionEvent event) { return mDraweeHolder.onTouchEvent(event) || super.onTouchEvent(event); } public void setImageUri(String uri, ResizeOptions options) { final ImageRequest imageRequest = ImageRequestBuilder.newBuilderWithSource(Uri.parse(uri)) .setResizeOptions(options) .setAutoRotateEnabled(true) .build(); final ImagePipeline imagePipeline = Fresco.getImagePipeline(); final DataSource<CloseableReference<CloseableImage>> dataSource = imagePipeline.fetchDecodedImage(imageRequest, this); final AbstractDraweeController controller = Fresco.newDraweeControllerBuilder() .setOldController(mDraweeHolder.getController()) .setImageRequest(imageRequest) .setControllerListener(new BaseControllerListener<ImageInfo>() { @Override public void onFinalImageSet(String id, ImageInfo imageInfo, Animatable animatable) { super.onFinalImageSet(id, imageInfo, animatable); CloseableReference<CloseableImage> imageCloseableReference = null; try { imageCloseableReference = dataSource.getResult(); if (imageCloseableReference != null) { final CloseableImage image = imageCloseableReference.get(); if (image != null && image instanceof CloseableStaticBitmap) { CloseableStaticBitmap closeableStaticBitmap = (CloseableStaticBitmap) image; final Bitmap bitmap = closeableStaticBitmap.getUnderlyingBitmap(); if (bitmap != null) { setImageBitmap(bitmap); setScaleType(ScaleType.CENTER_CROP); } } } } finally { dataSource.close(); CloseableReference.closeSafely(imageCloseableReference); } } }) .build(); mDraweeHolder.setController(controller); setImageDrawable(mDraweeHolder.getTopLevelDrawable()); } }