Android知識點——Glide獲取圖片寬高

先扯兩句

  先很負責任的說一下,這個內容也是百度來的,但是很不負責任的是,當初只記錄解決方案,忘了記錄是查看的哪篇博客了,這裏先對不知道借鑑的誰表示感謝。無法分享鏈接,就厚着臉皮把(轉)字去掉了,請大家諒解。

  先提供一下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 ,實現測量圖片原始寬高的功能的。

發佈了41 篇原創文章 · 獲贊 4 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章