美文网首页Android进阶之路
Android知识点——Glide获取图片宽高

Android知识点——Glide获取图片宽高

作者: 半寿翁 | 来源:发表于2019-11-23 23:19 被阅读0次

    先扯两句

      先很负责任的说一下,这个内容也是百度来的,但是很不负责任的是,当初只记录解决方案,忘了记录是查看的哪篇博客了,这里先对不知道借鉴的谁表示感谢。无法分享链接,就厚着脸皮把(转)字去掉了,请大家谅解。

      先提供一下Android知识点——目录的链接,然后让我们进入正题。

    正文

      实际上,这篇博客所说的内容并不是所有人都可以用到,毕竟大多数时候,我们只需要展示图片,而并不需要知道图片的宽高;有的时候我们只需要知道展示的宽高(即ImageView)的宽高,不需要知道图片资源的实际尺寸。

      但是需求千千万万嘛,以程序员的脑洞,怎么能想到产品的脑洞究竟有多大呢?我这里就遇到了一个需求,那就是需要在一个可缩放的图片上标注icon(类似地图上的marker)。这还不算完,毕竟在找到的图片缩放控件PhotoView中,我们点击到图片上后,是有点击点位在整个图片上的百分比坐标回调的。而多端通过百分比是很容易就能在图片中获取到相同的点位,并回显出对应的icon的(没办法,谁让我找的是方便计算百分比的呢),结果Web端优先做了这部分功能,使用的是在原图上的具体坐标。这样我百分比的计划自然就落空了,只能想办法计算出具体的点位。

      因此获取图片的原始尺寸就是一个必不可少的环节,我刚刚百度了一下,查到wangke_kingAndroid获取图片的宽度和高度中使用的方法是:

    BitmapFactory.Options options = new BitmapFactory.Options();
    BitmapFactory.decodeResource(getResources(),R.drawable.ico,options);
    
    //获取图片的宽高
    int height = options.outHeight;
    int width = options.outWidth;
    
    Log.i("wk","图片的宽度:"+width+"图片的高度:"+height);
    

      我这里没有亲测过,不过应该是没有问题,但是很遗憾我们的需求是在网络图片上做测量,所以这个方法也无法使用,不过如果其他有类似本地图片需求的,不妨尝试一下。而我之前找到的解决方案为:

    photoView.getDrawable().getBounds().width();
    photoView.getDrawable().getBounds().height();
    

      首先说明,上述的方法是可以实现图片的尺寸测量的,只是有一个小小的问题,那就是想要计算出Drawable的宽高,需要必须等到图片加载完成之后,尝试了使用view.post(),监听组件加载完成,但是并不是每次都能获取到Drawable的宽高,因此当初的解决方案是写了个两秒钟的定时器,每50毫秒测量一次,直到获取到值为止。这样的解决方案可谓是相当无脑了,而且还要消耗很多不必要的资源。
      还好皇天不负有心人啊,终于找到了通过Glide获取图片宽高的方式:

    Glide.with(inDoorView.getContext())
            .load(bitMapResUrl)
            .asBitmap()
            .skipMemoryCache(true)
            .into(new SimpleTarget<Bitmap>() {
                @Override
                public void onResourceReady(Bitmap resource, GlideAnimation<? super Bitmap> glideAnimation) {
                    maxWidth = resource.getWidth();
                    maxHeight = resource.getHeight();
        }
    });
    

      这样我们就可以通过回调,在Glide将网络图片注入到对应的图片组件的时候,得到图片的Bitmap,然后在通过Bitmap来获取图片的宽高。但是需要注意的一点是,Bitmap的泛型是需要手动去设置的哦。
      另外SimpleTarget现在已经过时,暂时还没有查到。我搜索过SimpleTarget过时使用什么替换,有一些说法是使用BitmapImageViewTarget ,不过下面是实际测试结果。
    图片链接:
    百度图片-景色

    SimpleTarget simpleTarget = new SimpleTarget<Bitmap>(Target.SIZE_ORIGINAL, Target.SIZE_ORIGINAL) {
        @Override
        public void onResourceReady(@NonNull Bitmap resource, @Nullable Transition<? super Bitmap> transition) {
            photoZoom.setImageBitmap(resource);
            rw = resource.getWidth();
            rh = resource.getHeight();
            Logger.i(getName(), "\n******************\nSimpleTarget:\nresource Width : " + resource.getWidth()
                    + "\nresource Width " + resource.getHeight() +
                    "\n******************");
            updateList();
        }
    };
    
    GlideUtils.loadImageView(mContext, bgPath, simpleTarget);
    
    BitmapImageViewTarget viewTarget = new BitmapImageViewTarget(photoZoom) {
        @Override
        public void onResourceReady(@NonNull Bitmap resource, @Nullable Transition<? super Bitmap> transition) {
            super.onResourceReady(resource, transition);
            photoZoom.setImageBitmap(resource);
            rw = resource.getWidth();
            rh = resource.getHeight();
            Logger.i(getName(), "\n******************\nBitmapImageViewTarget:\nresource Width : " + resource.getWidth()
                    + "\nresource Width " + resource.getHeight() +
                    "\n******************");
            updateList();
        }
    };
    GlideUtils.loadImageView(mContext, bgPath, viewTarget);
    
    ...
    
    private String getName() {
        return getClass().getSimpleName();
    }
    

    测量结果:

    2019-11-23 23:12:50.630 1691-1691/com.bsw.mydemo I/BswFloorPointView: 
        ******************
        SimpleTarget:
        resource Width : 500
        resource Width 334
        ******************
    2019-11-23 23:12:50.690 1691-1691/com.bsw.mydemo I/BswFloorPointView: 
        ******************
        BitmapImageViewTarget:
        resource Width : 3234
        resource Width 2160
        ******************
    

    图片信息:


    图片尺寸

    如果不是我使用有误的话,BitmapImageViewTarget 是无法替换SimpleTarget ,实现测量图片原始宽高的功能的。

    相关文章

      网友评论

        本文标题:Android知识点——Glide获取图片宽高

        本文链接:https://www.haomeiwen.com/subject/rblkwctx.html