FitScreen-Android屏幕适配的另一种方案

FitScreen

本文从 CSDN 迁移过来。
原地址

Android屏幕适配的一种方案,包含自动生成xml文件jar包,自动替换dp、sp的jar包。顺便附带上源码。

GitHub链接 FitScreen

更新说明:
2017.12.03:在GitHub工程上面添加个一个demo,包含 README.md 说明文件


背景说明

最开始使用dp设置控件尺寸,在hornor v8 1440x2560的手机显示正常,到了samsung Galaxy On7 1080x1920的手机上显示爆炸。。。(左hornor v8 1440x2560, 右samsung Galaxy On7 1080x1920)

2k.jpg

1080p.jpg

在尝试了N久还是没得结果的情况下,看到一个GitHub上面有一个shell写的脚本可以生成这些文件,奈何拉下来跑了一下没成功,向author发了封邮件也没有结果,自己看了看源码也搞不明白(没学过shell...而且很慢)。想想之前看了鸿洋大神的一篇博客准备自己来搞事情。

本方案在参考多位前人的适配方案下,自己对android屏幕适配做了一些总结。

适配方式

最小宽度(values-swxxxdp)形式。不同于生成不同分辨率对应px值,这个方案通过生成对应的dp、sp值来进行适配。

  • 根据公式dp= 160*屏幕宽度px/dpi,得到的就是上面xxx的值。

    dpi可以通过代码获取

DisplayMetrics displayMetrics = getResources().getDisplayMetrics();
Log.d(TAG," densityDpi is "+displayMetrics.densityDpi);
  • 安卓手机dpi,分为 120(ldpi)、160(mdpi)、213、240(hdpi)、280、320(xhdpi)、360、400、 420、480(xxhdpi)、560、640(xxxhdpi);

  • 一般为以上值。比如我的honor手机计算得到dp是360,Samsung计算得到dp是411,所以我创建了两个values文件夹,values-sw360dp、values-sw411dp,手机会自动找到与其对应的values文件夹。

  • 如需了解更多,请自行google。

适配后

last-2k.jpg

last-1080.jpg

使用姿势

我已经将jar文件(jar包下)以及java文件放入仓库中,提供源码进行查看(src包下)。具体请进GitHub查看。

生成对应的文件夹

  • 将GenerateFile.jar下载下来放入某个目录下,cmd输入java -jar GenerateFile.jar xxx w1_w2...
  • xxx为基础宽度,必须为整数。w1 w2为需要其他的宽度值,同样需要整数。
  • 默认基础宽度360,还有另外两个320、411。如果不需要设置,忽略xxx以及w1、w2,直接输java -jar GenerateFile.jar 回车即ok。
  • 说明:为什么要基础宽度?举个栗子,UI美眉给你的标注图为750x1334,这个是iOS的标注尺寸,对应Android里面可以看成720x1280,看下图,根据上面的公式计算出来的dp值就是360。如果你将360设置为基础宽度,你就可以正常使用dp值,例如320、411的就会自动进行缩放。

例如:

  1. 我将GenerateFile.jar放入桌面,打开cmd切换到桌面目录,输入命令,回车即可生成res文件夹。


    GenerateFile.jar

    cmd命令
  2. res文件夹里面包含了三个文件夹(默认不设置为3个,默认根据720*1280的ui图来进行适配1dp=2px),里面就是熟悉的dimens.xml文件了,使用姿势我就不多说了。


    res文件夹
    res内部
    这里写图片描述

生成代码如下:
values-sw360dp:

<dimen name="xdp_0">.0dp</dimen>
<dimen name="xdp_1">1.0dp</dimen>
<dimen name="xdp_2">2.0dp</dimen>
...
<dimen name="xsp_1">1.0sp</dimen>
<dimen name="xsp_2">2.0sp</dimen>
<dimen name="xsp_3">3.0sp</dimen>

values-sw320dp

<dimen name="xdp_0">.0dp</dimen>
<dimen name="xdp_1">.9dp</dimen>
<dimen name="xdp_2">1.8dp</dimen>
...
<dimen name="xsp_1">.9sp</dimen>
<dimen name="xsp_2">1.8sp</dimen>
<dimen name="xsp_3">2.7sp</dimen>

values-sw411dp

<dimen name="xdp_0">.0dp</dimen>
<dimen name="xdp_1">1.1dp</dimen>
<dimen name="xdp_2">2.3dp</dimen>
...
<dimen name="xsp_1">1.1sp</dimen>
<dimen name="xsp_2">2.3sp</dimen>
<dimen name="xsp_3">3.4sp</dimen>
px_dpi.png

配上自己在xml中的使用

<Button
    android:id="@+id/btn_login"
    android:layout_width="@dimen/xdp_270"
    android:layout_height="@dimen/xdp_30"
    android:layout_marginLeft="@dimen/xdp_45"
    android:layout_marginRight="@dimen/xdp_45"
    android:layout_marginTop="@dimen/xdp_30"
    android:background="@drawable/login_btn_selector"
    android:text="@string/login_btn_text"
    android:textColor="@color/c_ffba00"
    android:textStyle="normal"
    android:textSize="@dimen/xsp_16"
    app:layout_constraintLeft_toLeftOf="parent"
    app:layout_constraintRight_toRightOf="parent"
    app:layout_constraintTop_toBottomOf="@+id/passwordLine" />

如果已经使用了dp、sp,要一个一个改?

  • 不需要,本方案已经提供一个自动替换的jar文件ReplaceDpAndSp.jar。
  • 下载下来后,cmd输入java -jar ReplaceDpAndSp.jar 需要修改的绝对路径
  • 需要修改的绝对路径可以是layout、drawable目录,前提是xml文件。
  • 路径格式:1. D:/test/test/... 2. D:\\test\\test\\... 。路径格式请勿使用单反斜杠\,否则无法识别。
  • 只输入java -jar ReplaceDpAndSp.jar ,默认会在当前jar包所在路径进行替换操作。
  • 如果不满足你的需求,可以自己修改源码,源码已提供。
  • 注意:
    • id命名请不要以数字+dp 或者 数字+sp结尾,出现误伤请自行解决。
    • 在使用本工具之前请将你的代码备份,避免不可挽回的损失!!!

例如:

我将ReplaceDpAndSp.jar文件放到桌面,在cmd里面输入命令,回车替换了路径下的所有xml文件的dp、sp。

cmd替换

替换前


替换前

替换后


替换后

图片问题

在这里说一下我的图片问题,同样是wrap_content的情况下, honor v8可以正常显示,Samsung测试机还是老样子,至于后来怎么调整到差不多效果,我将宽高全部使用dp表示。
我觉得这有些欠妥,毕竟是对图片进行了缩放。如果你有更好的方法,你可以在GitHub的issue上面提出来,或者直接发邮件给我。

我的图片尺寸适配如下(尺寸也是根据图片分辨率计算得到)

<ImageView
    android:id="@+id/imageView"
    android:layout_width="@dimen/xdp_58"
    android:layout_height="@dimen/xdp_90"
    app:srcCompat="@mipmap/logo"
    app:layout_constraintTop_toTopOf="parent"
    android:layout_marginTop="@dimen/xdp_83"
    app:layout_constraintLeft_toLeftOf="parent"
    app:layout_constraintRight_toRightOf="parent"/>

代码适配

如果在xml上面不能满足你的需求,你也可以在代码中完成适配,只要拿到对应dimen的值。

例如:

CommonUtils.setTextTopImgSize(getContext(), mTvFollowup, R.mipmap.tag_followup, R.dimen.xdp_56, R.dimen.xdp_53);
...
/**
 * 设置TextView顶部图片的大小
 */
public static void setTextTopImgSize(Context context, TextView tv, @DrawableRes int imgId,
                                         @DimenRes int widthId, @DimenRes int heightId) {
    //调整图片大小
    int width = context.getResources().getDimensionPixelSize(widthId);
    int height = context.getResources().getDimensionPixelSize(heightId);
    Drawable drawable1 = context.getResources().getDrawable(imgId);
    drawable1.setBounds(0, 0, width, height);//第一0是距左边距离,第二0是距上边距离,40分别是长宽
    tv.setCompoundDrawables(null, drawable1, null, null);//只放上边
}

全都无法满足?

只能出必杀技了,你可以在GitHub上将源码拉下来,对里面一些代码进行修改,适合自己开发就好。

最后

写了这么多,手都酸了,只希望在屏幕适配这块,能与各位小伙伴共同学习,共同进步!
附上GitHub链接 FitScreen
更多详情请看GitHub。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 160,108评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,699评论 1 296
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,812评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,236评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,583评论 3 288
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,739评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,957评论 2 315
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,704评论 0 204
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,447评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,643评论 2 249
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,133评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,486评论 3 256
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,151评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,108评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,889评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,782评论 2 277
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,681评论 2 272

推荐阅读更多精彩内容