先扯兩句
先很負責任的說一下,這個內容也是百度來的,但是很不負責任的是,當初只記錄解決方案,忘了記錄是查看的哪篇博客了,這裏先對不知道借鑑的誰表示感謝。無法分享鏈接,就厚着臉皮把(轉)字去掉了,請大家諒解。
先提供一下Android知識點——目錄的鏈接,然後讓我們進入正題。
正文
實際上,這篇博客所說的內容並不是所有人都可以用到,畢竟大多數時候,我們只需要展示圖片,而並不需要知道圖片的寬高;有的時候我們只需要知道展示的寬高(即ImageView)的寬高,不需要知道圖片資源的實際尺寸。
但是需求千千萬萬嘛,以程序員的腦洞,怎麼能想到產品的腦洞究竟有多大呢?我這裏就遇到了一個需求,那就是需要在一個可縮放的圖片上標註icon(類似地圖上的marker)。這還不算完,畢竟在找到的圖片縮放控件PhotoView中,我們點擊到圖片上後,是有點擊點位在整個圖片上的百分比座標回調的。而多端通過百分比是很容易就能在圖片中獲取到相同的點位,並回顯出對應的icon的(沒辦法,誰讓我找的是方便計算百分比的呢),結果Web端優先做了這部分功能,使用的是在原圖上的具體座標。這樣我百分比的計劃自然就落空了,只能想辦法計算出具體的點位。
因此獲取圖片的原始尺寸就是一個必不可少的環節,我剛剛百度了一下,查到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(),監聽組件加載完成,但是並不是每次都能獲取到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 ,實現測量圖片原始寬高的功能的。