Giter Site home page Giter Site logo

hpdx / fresco-helper Goto Github PK

View Code? Open in Web Editor NEW
389.0 12.0 76.0 57.27 MB

让使用Fresco就像使用Glide、Picasso一样简洁。 在用户规模千万级别的app中验证过,满足项目开发中遇到的各种应用场景。(这个开源库最初源于我在公司内部做的一次技术分享)

Home Page: http://blog.csdn.net/android_ls/article/details/53137867

Java 100.00%

fresco-helper's Introduction

fresco-helper

Glide的使用示例

https://github.com/hpdx/glide-helper

依赖开源库

fresco v2.6.0:https://github.com/facebook/fresco

subsampling-scale-image-view v3.10.0:https://github.com/davemorrissey/subsampling-scale-image-view

Demo运行后效果图

下载示例Apk

使用

在使用到fresco-helper库的Module中的build.gradle文件里,添加以下依赖:

allprojects {
    repositories {
        ...
        maven { url 'https://jitpack.io' }
    }
}

implementation 'com.github.hpdx:fresco-helper:2.6.0'

初始化

Phoenix.init(this); // Context

图片加载部分

从网络加载一张图片

String url = "http://ww3.sinaimg.cn/large/610dc034jw1f6m4aj83g9j20zk1hcww3.jpg";
SimpleDraweeView simpleDraweeView = (SimpleDraweeView)findViewById(R.id.sdv_1);
Phoenix.with(simpleDraweeView).load(url);

从网络加载一张图片,按原图等比缩放显示

String url = "http://ww3.sinaimg.cn/large/610dc034jw1f6m4aj83g9j20zk1hcww3.jpg";
SimpleDraweeView simpleDraweeView = (SimpleDraweeView)findViewById(R.id.sdv_1);
Phoenix.with(simpleDraweeView)
.setControllerListener(new SingleImageControllerListener(simpleDraweeView))
.load(url);

从网络加载一张图片,按原图等比缩放显示,添加限制最大宽高值(在指定的区域内等比缩放)

String url = "https://ws1.sinaimg.cn/large/0065oQSqly1fymj13tnjmj30r60zf79k.jpg";
SimpleDraweeView simpleDraweeView = (SimpleDraweeView)findViewById(R.id.sdv_1);
Phoenix.with(simpleDraweeView)
       .setControllerListener(new SingleImageControllerListener(simpleDraweeView,
                        DensityUtil.dipToPixels(this, 200), DensityUtil.dipToPixels(this, 200)))
       .load(url);

从网络加载一张图片,想加上自己的后处理

String url = "http://ww3.sinaimg.cn/large/610dc034jw1f6m4aj83g9j20zk1hcww3.jpg";
SimpleDraweeView simpleDraweeView = (SimpleDraweeView)findViewById(R.id.sdv_1);
Phoenix.with(simpleDraweeView)
       .setBasePostprocessor(new BasePostprocessor() {
            @Override
            public void process(Bitmap bitmap) {
                // 后处理,比如做高斯模糊处理
                
            }
        }).load(url);

从本地加载一张图片

String filePath = "/sdcard/image/test.jpg";
SimpleDraweeView simpleDraweeView = (SimpleDraweeView)findViewById(R.id.sdv_1);
Phoenix.with(simpleDraweeView).load(filePath);

从res下面加载一张图片

SimpleDraweeView simpleDraweeView = (SimpleDraweeView)findViewById(R.id.sdv_1);
Phoenix.with(simpleDraweeView).load(R.drawable.meizi);

从assets下面加载一张图片

SimpleDraweeView simpleDraweeView = (SimpleDraweeView)findViewById(R.id.sdv_1);
Phoenix.with(simpleDraweeView)
       .setAssets(true)
       .load("qingchun.jpg");

在写布局文件xml时,我不知道要显示的图片尺寸,需要根据业务逻辑动态的设置要显示的图片的大小,可以像下面这样写:

String url = "http://ww3.sinaimg.cn/large/610dc034jw1f6m4aj83g9j20zk1hcww3.jpg";
SimpleDraweeView simpleDraweeView = (SimpleDraweeView)findViewById(R.id.sdv_1);
Phoenix.with(simpleDraweeView)
       .setWidth(100)
       .setHeight(100)
       .load(url);

只知道要显示图片的高或者宽的值,另一个值可以从设置的比例得出

String url = "http://ww3.sinaimg.cn/large/610dc034jw1f6m4aj83g9j20zk1hcww3.jpg";
SimpleDraweeView simpleDraweeView = (SimpleDraweeView)findViewById(R.id.sdv_1);
Phoenix.with(simpleDraweeView)
       .setWidth(100)
       .setAspectRatio(0.6f) // w/h = 6/10
       .load(url);

图片的高斯模糊处理

String url = "http://ww3.sinaimg.cn/large/610dc034jw1f6m4aj83g9j20zk1hcww3.jpg";
SimpleDraweeView simpleDraweeView = (SimpleDraweeView)findViewById(R.id.sdv_1);
Phoenix.with(simpleDraweeView)
       .setNeedBlur(true)
       .load(url);

加载并显示gif格式的图片

String url = "http://img4.178.com/acg1/201506/227753817857/227754566617.gif";
SimpleDraweeView simpleDraweeView = (SimpleDraweeView)findViewById(R.id.sdv_1);
Phoenix.with(simpleDraweeView)
       .load(url);

加载并显示webp格式的图片

SimpleDraweeView simpleDraweeView = (SimpleDraweeView)findViewById(R.id.sdv_1);
Phoenix.with(simpleDraweeView)
        .load(R.drawable.meizi_webp);

将图片资源预加载到磁盘缓存

String url = "http://ww1.sinaimg.cn/large/610dc034jw1fahy9m7xw0j20u00u042l.jpg";
Phoenix.prefetchToDiskCache(url);

将图片资源预加载到内存缓存

String url = "http://ww1.sinaimg.cn/large/610dc034jw1fahy9m7xw0j20u00u042l.jpg";
Phoenix.prefetchToBitmapCache(url);

从网络下载一张图片,下载完成后把Bitmap给我(返回的结果是在主线程)

String url = "http://feed.chujianapp.com/20161108/452ab5752287a99a1b5387e2cd849006.jpg@1080w";
Phoenix.with(context)
       .setUrl(url)
       .setResult(new IResult<Bitmap>() {
            @Override
            public void onResult(Bitmap result) {
                // 在主线程

            }
        }).load();

从网络下载gif图片,返回Bitmap对象

String url = "http://lh-avatar.liehuozhibo.com/20170911/d7682418510c7877fd4dd6afaa1be460.jpg?x-oss-process=image/resize,w_640,h_640/quality,q_90";
Phoenix.with(GIFFirstFrameActivity.this)
       .setUrl(url)
//     .setWidth(DensityUtil.dipToPixels(GIFFirstFrameActivity.this, 100))
//     .setHeight(DensityUtil.dipToPixels(GIFFirstFrameActivity.this, 100))
       .setResult(new IResult<Bitmap>() {
              @Override
              public void onResult(Bitmap result) {
                  mImageView.setImageBitmap(result);
              }
       }).load();

从网络下载一张图片,下载完成后告诉我下载的图片存在哪里(返回的结果是在工作线程,非主线程)

String url = "http://feed.chujianapp.com/20161108/452ab5752287a99a1b5387e2cd849006.jpg@1080w";
String filePath = "";
Phoenix.with(context)
       .setUrl(url)
       .setResult(new IDownloadResult(filePath) {
           @Override
           public void onResult(String filePath) {
               MLog.i("filePath = " + filePath);
               // 在子线程,要显示到View上,需要切换到主线程

           }
       }).download(); 

从本地磁盘缓存中获取Bitmap

String url = "https://ws1.sinaimg.cn/large/610dc034ly1fgi3vd6irmj20u011i439.jpg";
Phoenix.with(url)
       .setResult(new IResult<Bitmap>() {

           @Override
           public void onResult(Bitmap result) {
              // 在主线程

              }
           }).loadLocalDiskCache();

在列表滚动中暂停加载图片,等滚动停止后再继续加载

mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
    public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
       super.onScrollStateChanged(recyclerView, newState);
       if (newState == RecyclerView.SCROLL_STATE_IDLE) {
           Fresco.getImagePipeline().resume();
       } else {
           Fresco.getImagePipeline().pause();
       }
    }
});

从网络加载一张超大图

大小以M为单位,目标图片宽度大于手机屏幕宽的2倍以上或者高度大于手机屏幕高的2倍以上

xml布局文件

<com.facebook.fresco.helper.photoview.LargePhotoView
    android:id="@+id/image"
    android:layout_width="match_parent"
    android:layout_height="match_parent"/>

从网络加载并显示

String url = "http://img5q.duitang.com/uploads/item/201402/24/20140224212510_eQRG5.thumb.700_0.jpeg";
final LargePhotoView imageView = (LargePhotoView) findViewById(R.id.image);
Phoenix.with(imageView).load(url);

设置缩放参数

imageView.setMinimumScaleType(SubsamplingScaleImageView.SCALE_TYPE_CUSTOM);
imageView.setMinScale(1.0f);
imageView.setMaxScale(2.0f);

禁用缩放功能(你可能会有这个需求)

imageView.setZoomEnabled(false);

添加各种事件处理(单击、双击、长按)

    final GestureDetector gestureDetector = new GestureDetector(this, new GestureDetector.SimpleOnGestureListener() {
            @Override
            public boolean onSingleTapConfirmed(MotionEvent e) {
                if (imageView.isReady()) {
                    PointF sCoord = imageView.viewToSourceCoord(e.getX(), e.getY());
                    MLog.i("单击: " + ((int) sCoord.x) + ", " + ((int) sCoord.y));
                } else {
                    MLog.i("onSingleTapConfirmed onError");
                }

                return false;
            }

            @Override
            public void onLongPress(MotionEvent e) {
                if (imageView.isReady()) {
                    PointF sCoord = imageView.viewToSourceCoord(e.getX(), e.getY());
                    MLog.i("长按: " + ((int) sCoord.x) + ", " + ((int) sCoord.y));
                } else {
                    MLog.i("onLongPress onError");
                }
            }

            @Override
            public boolean onDoubleTap(MotionEvent e) {
                if (imageView.isReady()) {
                    PointF sCoord = imageView.viewToSourceCoord(e.getX(), e.getY());
                    MLog.i("双击: " + ((int) sCoord.x) + ", " + ((int) sCoord.y));
                } else {
                    MLog.i("onDoubleTap onError");
                }
                return false;
            }
        });

        imageView.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View view, MotionEvent motionEvent) {
                return gestureDetector.onTouchEvent(motionEvent);
            }
        });

从网络加载,存放到指定的缓存目录并显示

String fileCacheDir = getCacheDir().getAbsolutePath();
MLog.i("fileCacheDir = " + fileCacheDir);
Phoenix.with(imageView)
       .setDiskCacheDir(fileCacheDir)
       .load(url);     

加载本地资源并显示

imageView.setImage(ImageSource.asset("qmsht.jpg"));
imageView.setImage(ImageSource.resource(R.drawable.monkey));
imageView.setImage(ImageSource.uri("/storage/emulated/0/fresco-helper/Download/Images/20140224212510_eQRG5.thumb.700_0.jpeg"));
imageView.setImage(ImageSource.bitmap(bitmap));    

网络请求库使用OKHttp3

1、可以使用Fresco内置的OKHttp3 v3.6.0

compile 'com.facebook.fresco:imagepipeline-okhttp3:1.3.0'

2、在项目中已经使用OKHttp3作为网络请求库,想让图片加载库网络请求,使用与项目中一致的版本

compile 'com.squareup.okhttp3:okhttp:3.8.0'

3、调整配置参数

 ImagePipelineConfig imagePipelineConfig = new PhoenixConfig.Builder(this) // Context
                .setNetworkFetcher(null)
                .setRequestListeners(null)
                .setBitmapMemoryCacheParamsSupplier(null)
                .setMemoryTrimmableRegistry(null)
                .setMainDiskCacheConfig(null)
                .setSmallImageDiskCacheConfig(null)
                .build();
 Phoenix.init(this, imagePipelineConfig);

设置网络请求库使用OKHttp3的示例

// LOG过滤标签: RequestLoggingListener
Set<RequestListener> requestListeners = new HashSet<>();
requestListeners.add(new RequestLoggingListener());

HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor();
loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);

OkHttpClient okHttpClient = new OkHttpClient.Builder()
        .addInterceptor(loggingInterceptor)
        .build();

ImagePipelineConfig imagePipelineConfig = new PhoenixConfig.Builder(this)
        .setNetworkFetcher(new OkHttpNetworkFetcher(okHttpClient))
        .setRequestListeners(requestListeners)
        .build();

Phoenix.init(this, imagePipelineConfig); // this-->Context

其它

获取已占用磁盘缓存的大小,已B为单位

long cacheSize = Phoenix.getMainDiskStorageCacheSize();
MLog.i("cacheSize = " + cacheSize);

从内存缓存中移除指定图片的缓存

String url = "http://ww1.sinaimg.cn/large/610dc034jw1fahy9m7xw0j20u00u042l.jpg";
Phoenix.evictFromMemoryCache(url);

从磁盘缓存中移除指定图片的缓存

String url = "http://ww1.sinaimg.cn/large/610dc034jw1fahy9m7xw0j20u00u042l.jpg";
Phoenix.evictFromDiskCache(url);

移除指定图片的所有缓存(包括内存+磁盘)

String url = "http://ww1.sinaimg.cn/large/610dc034jw1fahy9m7xw0j20u00u042l.jpg";
Phoenix.evictFromCache(url);

清空所有内存缓存

Phoenix.clearMemoryCaches();

清空所有磁盘缓存

Phoenix.clearDiskCaches();

清除所有缓存(包括内存+磁盘)

Phoenix.clearCaches();

照片墙、浏览大图

  • 支持向下拖动关闭
  • 支持双击放大效果
  • 支持单击关闭大图浏览
  • 支持手势缩放功能
  • 支持屏蔽长按事件
  • 支持扩展,可以自定义浏览大图的UI风格

带动画的效果打开,支持向下拖动关闭

ArrayList<PhotoInfo> photos = null;
PhotoX.with(PhotoWallActivity.this)
             .setLayoutManager(mLayoutManager)
             .setPhotoList(photos)
             .setCurrentPosition(position)
             .enabledAnimation(true)
             .enabledDragClose(true) // true->向下拖动关闭
             .start();

带动画的效果打开方式(多图)

ArrayList<PhotoInfo> photos = null;
PhotoX.with(PhotoWallActivity.this)
             .setLayoutManager(mLayoutManager)
             .setPhotoList(photos)
             .setCurrentPosition(position)
             .enabledAnimation(true)
             .start();

无动画效果的打开方式(多图)

 ArrayList<PhotoInfo> photos = null;
 PhotoX.with(PhotoWallActivity.this)
              .setPhotoList(photos)
              .setCurrentPosition(position)
              .start();

带动画效果的打开方式(只有一张图片)

String originalUrl = photos.get(position).originalUrl;
PhotoX.with(PhotoWallActivity.this)
             .setThumbnailView(view)
             .setOriginalUrl(originalUrl)
             .enabledAnimation(true)
             .start();

无动画效果的打开方式(只有一张图片)

String originalUrl = photos.get(position).originalUrl;
PhotoX.with(PhotoWallActivity.this)
             .setOriginalUrl(originalUrl)
             .start();

屏蔽长按事件

PhotoX.with(PhotoWallActivity.this, PhotoBrowseActivity.class)
             .setLayoutManager(mLayoutManager)
             .setPhotoList(photos)
             .setCurrentPosition(position)
             .enabledAnimation(true)
             .toggleLongClick(false) // 屏蔽长按事件
             .start();

支持扩展,可以自定义浏览大图的UI风格

public class PhotoBrowseActivity extends PictureBrowseActivity {

    @Override
    protected int getLayoutResId() {
        return R.layout.activity_photo_browse;
    }

    @Override
    protected void setupViews() {
        super.setupViews();
        findViewById(R.id.rl_top_deleted).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                MLog.i("用户点击了删除按钮");
                MLog.i("mPhotoIndex = " + mPhotoIndex);

                PhotoInfo photoInfo = mItems.get(mPhotoIndex);
                MLog.i("originalUrl = " + photoInfo.originalUrl);

            }
        });
    }

    @Override
    public boolean onLongClick(View view) {
        MLog.i("currentPosition = " + getCurrentPosition());

        PhotoInfo photoInfo = getCurrentPhotoInfo();
        MLog.i("current originalUrl = " + photoInfo.originalUrl);

        return super.onLongClick(view);
    }

}

查看LOG

 FLog.setMinimumLoggingLevel(FLog.VERBOSE);
  adb logcat -v threadtime | grep -iE 'LoggingListener|AbstractDraweeController|BufferedDiskCache'

附录

在xml布局文件中使用

<com.facebook.drawee.view.SimpleDraweeView
        android:id="@+id/sdv_1"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:actualImageScaleType="centerCrop" />

圆形

app:roundAsCircle="true"     

圆形,添加边框

app:roundAsCircle="true"
app:roundingBorderColor="#fff3cf44"
app:roundingBorderWidth="2dp"   

四个圆角

app:roundAsCircle="false"
app:roundedCornerRadius="10dp"   

上面直角,底部圆角

app:roundAsCircle="false"
app:roundBottomLeft="true"
app:roundBottomRight="true"
app:roundTopLeft="false"
app:roundTopRight="false"
app:roundedCornerRadius="10dp" 

占位图

app:placeholderImage="@mipmap/ic_launcher"
app:placeholderImageScaleType="centerCrop"

加载失败时,显示的图,默认使用占位图

app:failureImage="@mipmap/ic_launcher"
app:failureImageScaleType="centerInside"

加载失败后,重试显示的图,默认使用占位图

app:retryImage="@mipmap/ic_launcher"
app:retryImageScaleType="centerCrop"

更详细的讲解,请查阅我的这篇博客:Android图片加载神器之Fresco,基于各种使用场景的讲解。

在使用过程中有满足不了的使用场景或遇到bug,欢迎提issuse ! 若你觉得还不错,请点Star, 谢谢!

License

Copyright (C) 2019 [email protected]

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

fresco-helper's People

Contributors

hpdx avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

fresco-helper's Issues

ppvProgressFillType

    <attr name="ppvProgressFillType" format="enum" >
        <enum name="radial" value="0"/>
        <enum name="center" value="1"/>
    </attr>

谢谢

Multiple dex files define Landroid/support/media/ExifInterface$1;

好想用啊,一直找不到到底是哪里错了。
咦嘘

Error:Error converting bytecode to dex:
Cause: com.android.dex.DexException: Multiple dex files define Landroid/support/media/ExifInterface$1;
Error:com.android.dex.DexException: Multiple dex files define Landroid/support/media/ExifInterface$1;
Error:	at com.android.dx.merge.DexMerger.readSortableTypes(DexMerger.java:661)
Error:	at com.android.dx.merge.DexMerger.getSortedTypes(DexMerger.java:616)
Error:	at com.android.dx.merge.DexMerger.mergeClassDefs(DexMerger.java:598)
Error:	at com.android.dx.merge.DexMerger.mergeDexes(DexMerger.java:171)
Error:	at com.android.dx.merge.DexMerger.merge(DexMerger.java:198)
Error:	at com.android.builder.dexing.DexArchiveMergerCallable.call(DexArchiveMergerCallable.java:61)
Error:	at com.android.builder.dexing.DexArchiveMergerCallable.call(DexArchiveMergerCallable.java:36)
Error:	at java.util.concurrent.ForkJoinTask$AdaptedCallable.exec(ForkJoinTask.java:1424)
Error:	at java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:289)
Error:	at java.util.concurrent.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1056)
Error:	at java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1689)
Error:	at java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:157)
Error:Execution failed for task ':app:transformDexArchiveWithDexMergerForSmzdkDebug'.
> com.android.build.api.transform.TransformException: com.android.dex.DexException: Multiple dex files define Landroid/support/media/ExifInterface$1;

打包release版本时报UnsatisfiedLinkError异常,debug版本是正常的

如标题所示,使用这个框架主要加载webp动图,两台测试机,系统版本分别为5.0和6.0,打包debug版本的时候都是正常的,不过打包release时,出现异常,希望能解决这个问题,异常如下:

02-14 12:07:42.201 24140-24508/? E/AndroidRuntime: FATAL EXCEPTION: OkHttp Dispatcher
Process: com.smartx.tank, PID: 24140
java.lang.UnsatisfiedLinkError: JNI_ERR returned from JNI_OnLoad in "/data/app/com.smartx.tank-2/lib/arm/libimagepipeline.so"
at java.lang.Runtime.loadLibrary(Runtime.java:372)
at java.lang.System.loadLibrary(System.java:1076)
at com.facebook.d.i.a$a.a(SoLoaderShim.java:32)
at com.facebook.d.i.a.a(SoLoaderShim.java:56)
at com.facebook.imagepipeline.nativecode.a.a(ImagePipelineNativeLoader.java:43)
at com.facebook.imagepipeline.memory.NativeMemoryChunk.(NativeMemoryChunk.java:36)
at com.facebook.imagepipeline.memory.m.i(NativeMemoryChunkPool.java:60)
at com.facebook.imagepipeline.memory.m.b(NativeMemoryChunkPool.java:22)
at com.facebook.imagepipeline.memory.a.a(BasePool.java:259)
at com.facebook.imagepipeline.memory.p.(NativePooledByteBufferOutputStream.java:53)
at com.facebook.imagepipeline.memory.o.a(NativePooledByteBufferFactory.java:141)
at com.facebook.imagepipeline.memory.o.b(NativePooledByteBufferFactory.java:26)
at com.facebook.imagepipeline.l.ad.a(NetworkFetchProducer.java:94)
at com.facebook.imagepipeline.l.ad.a(NetworkFetchProducer.java:37)
at com.facebook.imagepipeline.l.ad$1.a(NetworkFetchProducer.java:72)
at com.facebook.imagepipeline.b.a.b$2.a(OkHttpNetworkFetcher.java:122)
at c.w$b.b(RealCall.java:133)
at c.a.e.run(NamedRunnable.java:33)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
at java.lang.Thread.run(Thread.java:818)

                                               [ 02-14 12:07:42.201 24140:24140 I/         ]
                                               values[0] = 0.08619126

有一个写死的Toast

fresco-helper/src/main/java/com/facebook/fresco/helper/Phoenix.java
506行,有一个写死的toast,对多语言很不友好。
可以不弹,或者改成资源文件让开发者覆盖,或者弄一个回调?

SDK最低版本16

com.facebook.fresco.helper:fresco-helper:1.2.4
要求当前最低为sdk为16,请问一下如何可以降为sdk15
image

占位图展示问题

Androidx最新版本
占位图显示异常

代码如下
<com.facebook.drawee.view.SimpleDraweeView
android:id="@+id/personal_iv_head"
android:layout_width="match_parent"
app:roundAsCircle="true"
app:actualImageScaleType="centerCrop"
app:failureImageScaleType="centerInside"
app:retryImageScaleType="centerCrop"
app:placeholderImageScaleType="centerCrop"
app:placeholderImage="@mipmap/ic_head3"
android:layout_height="match_parent" />

展示效果:
``
微信图片_20191101171020

显示从网络加载照片墙

这个被砍掉了?
我想了解的是列表类型的控件如RecyclerView,去加载图片,图片量很大,且带有加载详图(并且可以缩放)的功能
快速滑动时如何优化?
使用Fresco加载时如何控制内存,列表型控件图片很多
内存持续增加会导致OOM,如何去回收内存?

java.lang.OutOfMemoryError请教一下这个怎么解决

java.lang.OutOfMemoryError: Failed to allocate a 3000012 byte allocation with 874992 free bytes and 854KB until OOM
at dalvik.system.VMRuntime.newNonMovableArray(Native Method)
at android.graphics.Bitmap.nativeCreate(Native Method)
at android.graphics.Bitmap.createBitmap(Bitmap.java:831)
at android.graphics.Bitmap.createBitmap(Bitmap.java:808)
at android.graphics.Bitmap.createBitmap(Bitmap.java:775)
at com.facebook.imagepipeline.memory.BitmapPool.alloc(BitmapPool.java)
at com.facebook.imagepipeline.memory.BitmapPool.alloc(BitmapPool.java)
at com.facebook.imagepipeline.memory.BasePool.get(BasePool.java)
at com.facebook.imagepipeline.platform.ArtDecoder.decodeStaticImageFromStream(ArtDecoder.java)
at com.facebook.imagepipeline.platform.ArtDecoder.decodeJPEGFromEncodedImage(ArtDecoder.java)
at com.facebook.imagepipeline.decoder.DefaultImageDecoder.decodeJpeg(DefaultImageDecoder.java)
at com.facebook.imagepipeline.decoder.DefaultImageDecoder$1.decode(DefaultImageDecoder.java)
at com.facebook.imagepipeline.decoder.DefaultImageDecoder.decode(DefaultImageDecoder.java)
at com.facebook.imagepipeline.producers.DecodeProducer$ProgressiveDecoder.doDecode(DecodeProducer.java)
at com.facebook.imagepipeline.producers.DecodeProducer$ProgressiveDecoder.access$300(DecodeProducer.java)
at com.facebook.imagepipeline.producers.DecodeProducer$ProgressiveDecoder$1.run(DecodeProducer.java)
at com.facebook.imagepipeline.producers.JobScheduler.doJob(JobScheduler.java)
at com.facebook.imagepipeline.producers.JobScheduler.access$000(JobScheduler.java)
at com.facebook.imagepipeline.producers.JobScheduler$1.run(JobScheduler.java)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
at com.facebook.imagepipeline.core.PriorityThreadFactory$1.run(PriorityThreadFactory.java)
at java.lang.Thread.run(Thread.java:818)

图片加载失败会导致点击事件不响应

  1. 若设置不可用url或resid,总之加载失败回导致图片设置的点击事件或者recycleview项的点击事件也无法响应,会在连续点击四五次后才开始响应,我在你的demo源码中也验证了这个问题
    2.页面加载多图时,连续滑动页面会导致部分图片变黑
    3.页面不停的加载时,会导致oom导致dump

图片如果加载失败,此时图片如果设置了点击事件,就无法点击跳转页面了

第2个方法我早试过了不行,用linearlayout framelayout包起来的方式不行, 要点很多次才行,

第1种方法:
//从网络加载一张图片
LinearLayout linear_sdv1 = this.findViewById(R.id.linear_sdv1 );
SimpleDraweeView simpleDraweeView = this.findViewById(R.id.sdv_1);
DraweeController controller = Fresco.newDraweeControllerBuilder()。
setTapToRetryEnabled(false)//禁用点击重试功能
.setOldController(simpleDraweeView.getController())。build
();
simpleDraweeView.setController(控制器);
//模拟加载失败
Phoenix.with(simpleDraweeView).load(url +“21321321321”);
simpleDraweeView.setOnClickListener(new View.OnClickListener(){
@ override
public void onClick(View v){
Log.e(“TAGG”,“点击事件”);
Intent intent = new Intent(FrescoBaseUseActivity.this,GifActivity.class);
startActivity(意向);
}
};;
这样我也试过了用你的DEMO,结果还是不行,要点击很多次;群主最好自己试一下,大概问题就是图片点击事件拦截了

找不到url 怎么弄?

         <com.facebook.drawee.view.SimpleDraweeView
            android:id="@+id/sdv_1"
            android:layout_width="90dp"
            android:layout_height="90dp"
            app:actualImageScaleType="centerCrop"
            app:url="@{url}" />

Error:(23) No resource identifier found for attribute 'url' in package 'cn.com.xxx.xxx'
Error:(30) No resource identifier found for attribute 'url' in package 'cn.com.xxx.xxx'
Error:(39) No resource identifier found for attribute 'url' in package 'cn.com.xxx.xxx'
Error:(50) No resource identifier found for attribute 'url' in package 'cn.com.xxx.xxx'
Error:(60) No resource identifier found for attribute 'url' in package 'cn.com.xxx.xxx'
Error:(74) No resource identifier found for attribute 'url' in package 'cn.com.xxx.xxx'

带动画浏览多张图片闪退

Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.Object android.util.SparseArray.get(int)' on a null object reference
at com.facebook.fresco.helper.photoview.anim.TransitionCompat.startTransition(TransitionCompat.java:42)
at com.facebook.fresco.helper.photoview.PictureBrowseActivity.onCreate(PictureBrowseActivity.java:68)

源码中可能错误调用了Fresco的方法

1,没事看您的源码的时候,看到这里com.facebook.fresco.helper.ImageLoader#loadLocalDiskCache
2.方法是【从本地缓存文件中获取Bitmap】里面调用了com.facebook.imagepipeline.core.ImagePipeline#fetchDecodedImage(ImageRequest imageRequest,
Object callerContext)方法,第二个参数我看您的使用和命名可以肯定应该是 上下文对象,您却将第二个参数传入了 ImageRequest.RequestLevel.DISK_CACHE,这个应该是第三个参数,第二个参数的context上下文是不应该省略的,您或许是手误了吗?
3.我也看了好几天fresco了,如果提的这问题是我的知识浅薄。麻烦您关一下,

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.