扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
先很负责任的说一下,这个内容也是百度来的,但是很不负责任的是,当初只记录解决方案,忘了记录是查看的哪篇博客了,这里先对不知道借鉴的谁表示感谢。无法分享链接,就厚着脸皮把(转)字去掉了,请大家谅解。
霍城网站建设公司成都创新互联公司,霍城网站设计制作,有大型网站制作公司丰富经验。已为霍城成百上千家提供企业网站建设服务。企业网站搭建\成都外贸网站制作要多少钱,请找那个售后服务好的霍城做网站的公司定做!
先提供一下 Android知识点——目录 的链接,然后让我们进入正题。
实际上,这篇博客所说的内容并不是所有人都可以用到,毕竟大多数时候,我们只需要展示图片,而并不需要知道图片的宽高;有的时候我们只需要知道展示的宽高(即ImageView)的宽高,不需要知道图片资源的实际尺寸。
但是需求千千万万嘛,以程序员的脑洞,怎么能想到产品的脑洞究竟有多大呢?我这里就遇到了一个需求,那就是需要在一个可缩放的图片上标注icon(类似地图上的marker)。这还不算完,毕竟在找到的图片缩放控件 PhotoView 中,我们点击到图片上后,是有点击点位在整个图片上的百分比坐标回调的。而多端通过百分比是很容易就能在图片中获取到相同的点位,并回显出对应的icon的(没办法,谁让我找的是方便计算百分比的呢),结果Web端优先做了这部分功能,使用的是在原图上的具体坐标。这样我百分比的计划自然就落空了,只能想办法计算出具体的点位。
因此获取图片的原始尺寸就是一个必不可少的环节,我刚刚百度了一下,查到 wangke_king 的 Android获取图片的宽度和高度 中使用的方法是:
我这里没有亲测过,不过应该是没有问题,但是很遗憾我们的需求是在网络图片上做测量,所以这个方法也无法使用,不过如果其他有类似本地图片需求的,不妨尝试一下。而我之前找到的解决方案为:
首先说明,上述的方法是可以实现图片的尺寸测量的,只是有一个小小的问题,那就是想要计算出Drawable的宽高,需要必须等到图片加载完成之后,尝试了使用view.post(),监听组件加载完成,但是并不是每次都能获取到Drawable的宽高,因此当初的解决方案是写了个两秒钟的定时器,每50毫秒测量一次,直到获取到值为止。这样的解决方案可谓是相当无脑了,而且还要消耗很多不必要的资源。
还好皇天不负有心人啊,终于找到了通过Glide获取图片宽高的方式:
这样我们就可以通过回调,在Glide将网络图片注入到对应的图片组件的时候,得到图片的Bitmap,然后在通过Bitmap来获取图片的宽高。但是需要注意的一点是,Bitmap的泛型是需要手动去设置的哦。
另外SimpleTarget现在已经过时,暂时还没有查到。我搜索过SimpleTarget过时使用什么替换,有一些说法是使用BitmapImageViewTarget ,不过下面是实际测试结果。
图片链接:
百度图片-景色
测量结果:
图片信息:
如果不是我使用有误的话,BitmapImageViewTarget 是无法替换SimpleTarget ,实现测量图片原始宽高的功能的。
这里的字符或者字符串的宽度,计算的是其像素值。有以下两种方法:方法1:
Paint paint= new Paint();
Rect rect = new Rect();
//返回包围整个字符串的最小的一个Rect区域
paint.getTextBounds(str, 0, 1, rect);
int strwidth = rect.width();
int strheight = rect.height();方法2:
//直接返回参数字符串所占用的宽度
float strwidth = paint.measureText(str);
对于字符而言,可以将字符转换成字符串,然后计算。例如:
char c = 'c';
然后利用上面两种方法即可。
在一个Activity的onCreate方法中,写入如下代码:DisplayMetrics metric = new DisplayMetrics();getWindowManager().getDefaultDisplay().getMetrics(metric);int width = metric.widthPixels; // 屏幕宽度(像素)int height = metric.heightPixels; // 屏幕高度(像素)float density = metric.density; // 屏幕密度(0.75 / 1.0 / 1.5)int densityDpi = metric.densityDpi; // 屏幕密度DPI(120 / 160 / 240) AndroidManifest.xml文件中,加入supports-screens节点,具体的内容如下:supports-screensandroid:smallScreens="true"android:normalScreens="true"android:largeScreens="true"android:resizeable="true"android:anyDensity="true" /这样的话,当前的Android程序就支持了多种分辨率,那么就可以得到正确的物理尺寸了。
用getWidth()方法,可以获取像素单位的宽度。
android的控件一般是继承的android.View这个类,所以可以直接用View#getWidth()方法获取控件宽度。另外这个方法是final方法,无法被子类覆盖,所以可以安心调用
设置问题。根据查询android系统相关设置得知,android系统js获取宽度可以用一下方式:
1、通过WindowManager来获取,
2、另一种通过Resources来获取。获取屏幕高宽方式大同小异,主要是获取到屏幕的DisplayMetrics。
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流