企业级app组件化开发2----图片组件开发

在加载图片框架中,我使用最多的是Glide框架,在之前的文章中,也有涉及到,但是使用更多的是基本的链式调用结构

Glide.with(this).load(url).int(ImageView);

如果是开发组件,那么就需要将尽可能多的功能写在组件中,为日后的开发提供帮助,下面就先介绍一些其他用法。

1、transition

transition就是过渡的意思,图片容器从占位符到加载的图片展示,传入的参数为BitmapTransitionOptions,通常有withCrossFade()withWrapped()等;

		   Glide.with(this)
                .asBitmap()
                .load(url)
                .transition(withCrossFade(3000))
                .into(iv_image);

在设置了transition属性之后,会有一个清晰度动画一样的渐变过程

2、RequestOptions

RequestOptions主要是来做一些准备工作,当网络差加载图片慢的情况下,先显示未加载的图片,当网络一样,加载失败的时候,需要显示加载失败的图片;除此之外,还可以设置缓存、加载的优先级等,通过Glide的apply属性设置。

private RequestOptions initRequestOptions() {
        RequestOptions options = new RequestOptions();
        options.placeholder(R.drawable.ic_launcher_background)
                .error(R.mipmap.ic_launcher_round)
                .diskCacheStrategy(DiskCacheStrategy.AUTOMATIC)
                .skipMemoryCache(false)
                .priority(Priority.NORMAL);
        return options;
    }

3、圆角裁剪

在之前进行圆角裁剪的时候,通常使用circleCrop()方法来进行图片的裁剪,然后将图片加载到ImageView当中;下面将会介绍一种新的方式,将ImageView转换为Target。

/**
     * 加载圆形的图片
     * @param imageView  容器
     * @param url  
     */
    public void displayImageForCircle(final ImageView imageView, String url){
        Glide.with(imageView.getContext())
                .asBitmap()
                .load(url)
                .apply(initRequestOptions())
                .into(new BitmapImageViewTarget(imageView){
                    //将ImageView包装成Target
                    @Override
                    protected void setResource(Bitmap resource) {
                        RoundedBitmapDrawable drawable = RoundedBitmapDrawableFactory
                                .create(imageView.getResources(),resource);
                        //设置为圆形
                        drawable.setCircular(true);
                        //设置图片到ImageView
                        imageView.setImageDrawable(drawable);
                    }
                });
    }

4、为ViewGroup设置背景,并模糊处理

/**
     * 为ViewGroup设置背景
     * @param viewGroup
     * @param url
     */
    public void displayImageFroViewGroup(final ViewGroup viewGroup, String url){
        Glide.with(viewGroup.getContext())
                .asBitmap()
                .load(url)
                .apply(initRequestOptions())
                .into(new SimpleTarget<Bitmap>() {
                    @Override
                    public void onResourceReady(@NonNull Bitmap resource, @Nullable Transition<? super Bitmap> transition) {
                        //onResourceReady是在主线程,加载耗时造成主线程阻塞
                        //将Bitmap对象转换为Drawable对象
                        Observable.just(resource).map(new Function<Bitmap, Drawable>() {
                            @Override
                            public Drawable apply(Bitmap bitmap) throws Exception {
                                //将Bitmap模糊处理,转换成Drawable对象
                                Drawable drawable = new BitmapDrawable(Utils.doBlur(bitmap,
                                        100,true));
                                return drawable;
                            }
                        }).subscribeOn(Schedulers.io())
                                .observeOn(AndroidSchedulers.mainThread())
                                .subscribe(new Consumer<Drawable>() {
                                    @Override
                                    public void accept(Drawable drawable) throws Exception {
                                        //将转换得到的Drawable设置在ViewGroup
                                        viewGroup.setBackground(drawable);
                                    }
                                });
                    }
                });
    }

对于Glide的链式API来说,最后into的时候只能是Target或者ImageView,并没有ViewGroup这一项,所以不能直接将ViewGroup into进去。

通常来说,会使用SimpleTarget,调用onResourceReady方法,当onResourceReady方法被调用的时候,意味着图片资源已经加载好了,但是此时线程处于主线程,还需要对图片进行模糊处理,因此要考虑使用RxJava做线程切换,进行类型转换,将Bitmap对象转为Drawable,并进行模糊处理,处理完成之后,在下游将ViewGroup的背景设置。

5、为非View对象加载图片

 /**
     * 为非View对象加载图片
     * @param context
     * @param target
     * @param url
     */
    public void displayImageForTarget(Context context, Target target,String url ){
        Glide.with(context)
                .asBitmap()
                .load(url)
                .transition(withCrossFade())
                .apply(initRequestOptions())
                .fitCenter()
                .into(target);
    }

6、为Notification加载图片

/**
     * 为Notification加载图片
     * @param context  上下文对象
     * @param rv RemoteView
     * @param id 加载图片的控件ID
     * @param notification  Notification对象
     * @param NOTIFICATION_ID  Notification的id
     * @param url  加载图片的url
     */
    public void displayImageForNotification(Context context, RemoteViews rv,
                                            int id, Notification notification,
                                            int NOTIFICATION_ID,String url){
        this.displayImageForTarget(context,
                getNotificationTarget(context,rv,id,notification,NOTIFICATION_ID),url);
    }

    //构建一个NotificationTarget对象
    public NotificationTarget getNotificationTarget(Context context,RemoteViews rv, int id,
                                                    Notification notification,
                                                    int NOTIFICATION_ID){
        NotificationTarget target = new NotificationTarget(context,id,rv,notification,NOTIFICATION_ID);
        return target;
    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Awesome_lay

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值