Android屏幕适配实战

来源:互联网 发布:ai软件 编辑:程序博客网 时间:2024/06/14 22:43

说一下在项目里面遇到的一个问题,和解决思路。
需求来源于运营小姐姐,她们希望在App的搜索关键字前面加上图片醒目效果图如下

这里写图片描述

布局很简单左边一个SimpleDraweeView,右边一个TextView,图片来自于服务端。小姐姐们希望活动标高度写死,宽度服务端返多少大小的图片就显示多少大小。然后到了一年一度撕逼的时候,撕逼原因来自与SimpleDraweeView只支持宽度高度都写死。撕逼结果当然是弱势方(可怜的Android开发同学)从了,为什么?因为他们力气大嘛。- -。

当然,解决方案还是有的,就是多写了一些代码,就是在SimpleDraweeView的网络回调上测量到图片的实际宽度,高度,动态设置SimpleDraweeView的属性就可以了,具体实现查看这篇文章 要翻墙才可以看哦。然后就提交代码,干别的事情去了。

过了半天,测试大叔就报BUG过来了,具体看下图。
这里写图片描述
小伙子啊,看一看这个图片显示不全啊,怎么肥四???
当时服务端没给小图,就没看结果嘛。宝宝心里也很委屈。
好吧,那就解决问题吧。到底问题在哪里呢。于是开始打断点一通托马斯回旋操作,发现问题在于我通过SimpleDraweeView的回调拿到的宽高是图片的真是像素值,以这个活动表为例子,真实像素为高32px,宽48px。然而不能直接把这个像素设置给手机,因为手机的屏幕像素不一,产生的dp值是有意义的呢。这里不深入探究dp,就以解决这个问题。那怎么办呢?
问题的核心其实归结一句话就是在一只Android手机上dp和px的比值是一定的。
再回到我们的问题,分析一下。
这是xml代码

<com.facebook.drawee.view.SimpleDraweeView        app:placeholderImage="@drawable/default_cover"        android:layout_gravity="center_vertical"        android:layout_marginLeft="@dimen/dp_10"        android:id="@+id/sdv_tag"        android:layout_width="wrap_content"        android:layout_height="@dimen/dp_16" />

我在这里把高度写死了16dp,但是我调试出来图片的实际设置到手机上的像素是42px,然而图片的实际大小高度是32px,所以可以推断出Android手机在显示图片前会自动得对图片进行放缩,那我们如果要还原为原来的图片只要计算出每台Android的放缩比例就可以了。所以我写了这行代码

 int px = imageInfo.getWidth() * DisplayUtil.dp2px(context, 16) / 32;            simpleDraweeView.getLayoutParams().width = px;            simpleDraweeView.requestLayout();

这里写图片描述
我们来分析一下第一行代码
这里有几个已知量,我得到的图片的实际宽度w,我在xml里面设置的高度dp值d,以及得到的实际高度h, 以及我在手机上实际设置的高度hx
hx = f(d); // 算出设置高度
所以缩放比例 = hx / h //这是缩放的比例
所以实际设置宽度 = w * 缩放比例;

ok,这样就解决这个问题了。所以总结一下。运营是开发最好的老师,致敬所有的运营爸爸们。

原创粉丝点击