先扯兩句
??先很負(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_king的Android獲取圖片的寬度和高度中使用的方法是:
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)測量圖片原始寬高的功能的。