先扯兩句
??先很負責任的說一下,這個內容也是百度來的动羽,但是很不負責任的是包帚,當初只記錄解決方案,忘了記錄是查看的哪篇博客了运吓,這里先對不知道借鑒的誰表示感謝渴邦。無法分享鏈接,就厚著臉皮把(轉)字去掉了拘哨,請大家諒解谋梭。
??先提供一下Android知識點——目錄的鏈接,然后讓我們進入正題倦青。
正文
??實際上瓮床,這篇博客所說的內容并不是所有人都可以用到,畢竟大多數時候姨夹,我們只需要展示圖片纤垂,而并不需要知道圖片的寬高;有的時候我們只需要知道展示的寬高(即ImageView)的寬高磷账,不需要知道圖片資源的實際尺寸峭沦。
??但是需求千千萬萬嘛,以程序員的腦洞逃糟,怎么能想到產品的腦洞究竟有多大呢吼鱼?我這里就遇到了一個需求,那就是需要在一個可縮放的圖片上標注icon(類似地圖上的marker)绰咽。這還不算完菇肃,畢竟在找到的圖片縮放控件PhotoView中,我們點擊到圖片上后取募,是有點擊點位在整個圖片上的百分比坐標回調的琐谤。而多端通過百分比是很容易就能在圖片中獲取到相同的點位,并回顯出對應的icon的(沒辦法玩敏,誰讓我找的是方便計算百分比的呢)斗忌,結果Web端優(yōu)先做了這部分功能,使用的是在原圖上的具體坐標旺聚。這樣我百分比的計劃自然就落空了织阳,只能想辦法計算出具體的點位。
??因此獲取圖片的原始尺寸就是一個必不可少的環(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);
??我這里沒有親測過,不過應該是沒有問題,但是很遺憾我們的需求是在網絡圖片上做測量弄痹,所以這個方法也無法使用饭入,不過如果其他有類似本地圖片需求的,不妨嘗試一下肛真。而我之前找到的解決方案為:
photoView.getDrawable().getBounds().width();
photoView.getDrawable().getBounds().height();
??首先說明圣拄,上述的方法是可以實現圖片的尺寸測量的,只是有一個小小的問題毁欣,那就是想要計算出Drawable的寬高,需要必須等到圖片加載完成之后岳掐,嘗試了使用view.post()凭疮,監(jiān)聽組件加載完成,但是并不是每次都能獲取到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 歇万,實現測量圖片原始寬高的功能的。