Android知識點(diǎn)——Glide獲取圖片寬高

先扯兩句

??先很負(fù)責(zé)任的說一下,這個(gè)內(nèi)容也是百度來的,但是很不負(fù)責(zé)任的是,當(dāng)初只記錄解決方案,忘了記錄是查看的哪篇博客了,這里先對不知道借鑒的誰表示感謝。無法分享鏈接,就厚著臉皮把(轉(zhuǎn))字去掉了,請大家諒解。

??先提供一下Android知識點(diǎn)——目錄的鏈接,然后讓我們進(jìn)入正題。

正文

??實(shí)際上,這篇博客所說的內(nèi)容并不是所有人都可以用到,畢竟大多數(shù)時(shí)候,我們只需要展示圖片,而并不需要知道圖片的寬高;有的時(shí)候我們只需要知道展示的寬高(即ImageView)的寬高,不需要知道圖片資源的實(shí)際尺寸。

??但是需求千千萬萬嘛,以程序員的腦洞,怎么能想到產(chǎn)品的腦洞究竟有多大呢?我這里就遇到了一個(gè)需求,那就是需要在一個(gè)可縮放的圖片上標(biāo)注icon(類似地圖上的marker)。這還不算完,畢竟在找到的圖片縮放控件PhotoView中,我們點(diǎn)擊到圖片上后,是有點(diǎn)擊點(diǎn)位在整個(gè)圖片上的百分比坐標(biāo)回調(diào)的。而多端通過百分比是很容易就能在圖片中獲取到相同的點(diǎn)位,并回顯出對應(yīng)的icon的(沒辦法,誰讓我找的是方便計(jì)算百分比的呢),結(jié)果Web端優(yōu)先做了這部分功能,使用的是在原圖上的具體坐標(biāo)。這樣我百分比的計(jì)劃自然就落空了,只能想辦法計(jì)算出具體的點(diǎn)位。

??因此獲取圖片的原始尺寸就是一個(gè)必不可少的環(huán)節(jié),我剛剛百度了一下,查到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);

??我這里沒有親測過,不過應(yīng)該是沒有問題,但是很遺憾我們的需求是在網(wǎng)絡(luò)圖片上做測量,所以這個(gè)方法也無法使用,不過如果其他有類似本地圖片需求的,不妨嘗試一下。而我之前找到的解決方案為:

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

??首先說明,上述的方法是可以實(shí)現(xiàn)圖片的尺寸測量的,只是有一個(gè)小小的問題,那就是想要計(jì)算出Drawable的寬高,需要必須等到圖片加載完成之后,嘗試了使用view.post(),監(jiān)聽組件加載完成,但是并不是每次都能獲取到Drawable的寬高,因此當(dāng)初的解決方案是寫了個(gè)兩秒鐘的定時(shí)器,每50毫秒測量一次,直到獲取到值為止。這樣的解決方案可謂是相當(dāng)無腦了,而且還要消耗很多不必要的資源。
??還好皇天不負(fù)有心人啊,終于找到了通過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();
    }
});

??這樣我們就可以通過回調(diào),在Glide將網(wǎng)絡(luò)圖片注入到對應(yīng)的圖片組件的時(shí)候,得到圖片的Bitmap,然后在通過Bitmap來獲取圖片的寬高。但是需要注意的一點(diǎn)是,Bitmap的泛型是需要手動去設(shè)置的哦。
??另外SimpleTarget現(xiàn)在已經(jīng)過時(shí),暫時(shí)還沒有查到。我搜索過SimpleTarget過時(shí)使用什么替換,有一些說法是使用BitmapImageViewTarget ,不過下面是實(shí)際測試結(jié)果。
圖片鏈接:
百度圖片-景色

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();
}

測量結(jié)果:

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 ,實(shí)現(xiàn)測量圖片原始寬高的功能的。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容