Android(安卓)多平台解决方案
Android 版本分裂始终是一个头疼的问题, 本月我们将用一种合理的方案,解决不同SDK, 不同版本下匹配的问题。 SDK实际上并不是向下兼容, 我们做产品的时候,是否意味着需要管理多个版本? 这样带来的成本,对于中小团队来说,是一场噩梦。 因此,我们寻求的解决方案是: 同一个版本, 应对多变的外部平台。
我们这边的需求是:
1. 不针对不同的分辨率开发多个版本. 不为Android平板开发新版本====》 目的,方便统一版本管理, 减少后期维护压力。
2. 图片一律不重新设计, 目标版本最佳为: 800 * 480, 避免用户的下载APK包过大. =====》为用户节省流量, 避免吓退用户。
3. 要求对2.2以后的SDK版本的各种分辨率进行适配. 其他版本美观要求可以略微降低, 但不影响客户使用。
因为我们不是游戏产品, 而是应用开发, 所以, 达到这些要求, 已经非常足够。
针对上述需求, 集中解决的问题是: 不同的Android设备, 需要定义view的大小, 以及字体大小. 再无其它. 因此在我们的产品中, 是这样解决问题的。
1. 针对字体. 定义出大、中、小 三种版式, 每种再细分为三种型号, 如下:
[java] view plain copy- <resources>
- <dimenname="txsize_large_xxx">45px</dimen>
- <dimenname="txsize_large_xx">39px</dimen>
- <dimenname="txsize_large_x">33px</dimen>
- <dimenname="txsize_mid_xxx">30px</dimen>
- <dimenname="txsize_mid_xx">27px</dimen>
- <dimenname="txsize_mid_x">24px</dimen>
- <dimenname="txsize_small_xxx">21px</dimen>
- <dimenname="txsize_small_xx">18px</dimen>
- <dimenname="txsize_small_x">15px</dimen>
这九种字形大小, 基本上可以涵盖一个产品的基本字体, 如果您的项目可能还有更多字体, 可以再增加_xxxxx这样的型号.
2. 针对不同的view, 同样整理出大中小三种版式,每种再细分为三种型号.
[java] view plain copy- <!--各种需要适配的宽度值-->
- <dimenname="view_large_xxx">160dip</dimen>
- <dimenname="view_large_xx">140dip</dimen>
- <dimenname="view_large_x">120dip</dimen>
- <dimenname="view_mid_xxx">100dip</dimen>
- <dimenname="view_mid_xx">90dip</dimen>
- <dimenname="view_mid_x">80dip</dimen>
- <dimenname="view_small_xxx">70dip</dimen>
- <dimenname="view_small_xx">60dip</dimen>
- <dimenname="view_small_x">50dip</dimen>
3. 上述是18种长度值, 基本上涵盖了一个产品的全部需求, 将其保存为一个String.xml, 见 附件内容
4.为不同的尺寸,建立values文件夹, 文件夹中, 适配该型号的字体或者view的大小string.xml文件
5. 在layout中使用view的大小
[java] view plain copy- <LinearLayoutandroid:layout_width="fill_parent"android:gravity="center_horizontal|center_vertical"
- android:layout_height="fill_parent"android:background="#263e60"
- android:layout_weight="1"android:orientation="horizontal">
- <Buttonandroid:id="@+id/chat_near_me"android:layout_width="@dimen/view_mid_x"
- <spanstyle="color:rgb(255,0,0);">android:layout_height="@dimen/view_mid_x"</span>android:background="@drawable/chat_near_me_unsel"
- android:gravity="center_horizontal|center_vertical"style="@style/pub_pos_title_font"
- android:orientation="horizontal"/>
- </LinearLayout>
在字体style文件中使用字体大小:
[java] view plain copy
- <stylename="dialog_checkbox_txt_font">
- <itemname="android:textSize"><spanstyle="color:#ff0000;">@dimen/txsize_large_x</span></item>
- <itemname="android:textColor">#ffffffff</item>
- </style>
- <stylename="dialog_button_txt_login_font">
- <itemname="android:textSize"><spanstyle="color:#ff0000;">@dimen/txsize_large_x</span></item>
- <itemname="android:textColor">#ffffffff</item>
- </style>
6. AndroidMainfest.xml文件标注需要适配
[java] view plain copy- <uses-permissionandroid:name="android.permission.RESTART_PACKAGES"/>
- <supports-screensandroid:largeScreens="true"android:normalScreens="true"android:anyDensity="true"/>
- </manifest>
一切OK!
BTW:
1. 为每个分辨率建立Layout-xxx*xxx的解决方案. 显然不好, 重复度太高, 维护代价大
2. 有人说仅仅通过dip解决方案, 说这样可以做到设备无关, 放弃吧, 这个绝对不行.
3. 推荐布局文件尽量手写, 别用工具生成, 另外, 注意多用LearLayout, 布局为fill_parent的方式, 这样非常好的将屏幕按照比例划分, 移植能力非常优越, 拿一个我写的为例:
[html] view plain copy- <?xmlversion="1.0"encoding="utf-8"?>
- <!--这是一个导航条:上一层,主页面,我的设备-->
- <LinearLayoutandroid:id="@+id/parent_layout"
- android:layout_width="fill_parent"android:layout_height="fill_parent"
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:background="#ffffff"android:orientation="vertical">
- <LinearLayoutandroid:layout_width="fill_parent"
- android:layout_weight="15"android:layout_height="fill_parent"
- android:orientation="horizontal">
- <LinearLayoutandroid:layout_width="fill_parent"
- android:layout_weight="5"android:background="@drawable/bg_chat_msg_left"
- android:layout_height="fill_parent"android:orientation="horizontal">
- </LinearLayout>
- <!--最上层,模仿三个Tab的效果-->
- <LinearLayoutandroid:layout_width="fill_parent"android:layout_height="fill_parent"android:gravity="center_horizontal|center_vertical"
- android:layout_weight="1"android:orientation="horizontal">
- <LinearLayoutandroid:layout_width="fill_parent"android:gravity="center_horizontal|center_vertical"
- android:layout_height="fill_parent"android:background="#263e60"
- android:layout_weight="1"android:orientation="horizontal">
- <Buttonandroid:id="@+id/chat_friend"android:layout_width="@dimen/view_mid_x"
- android:layout_height="@dimen/view_mid_x"android:background="@drawable/chat_friend_unsel"
- android:gravity="center_horizontal|center_vertical"style="@style/pub_pos_title_font"
- android:orientation="horizontal"/>
- </LinearLayout>
- <LinearLayoutandroid:layout_width="fill_parent"android:gravity="center_horizontal|center_vertical"
- android:layout_height="fill_parent"android:background="#263e60"
- android:layout_weight="1"android:orientation="horizontal">
- <Buttonandroid:id="@+id/chat_near_me"android:layout_width="@dimen/view_mid_x"
- android:layout_height="@dimen/view_mid_x"android:background="@drawable/chat_near_me_unsel"
- android:gravity="center_horizontal|center_vertical"style="@style/pub_pos_title_font"
- android:orientation="horizontal"/>
- </LinearLayout>
- <LinearLayoutandroid:layout_width="fill_parent"android:gravity="center_horizontal|center_vertical"
- android:layout_height="fill_parent"android:background="#263e60"
- android:layout_weight="1"android:orientation="horizontal">
- <Buttonandroid:id="@+id/chat_find"android:layout_width="@dimen/view_mid_x"
- android:layout_height="@dimen/view_mid_x"android:background="@drawable/chat_find_unsel"
- android:gravity="center_horizontal|center_vertical"style="@style/pub_pos_title_font"
- android:orientation="horizontal"/>
- </LinearLayout>
- <LinearLayoutandroid:layout_width="fill_parent"android:gravity="center_horizontal|center_vertical"
- android:layout_height="fill_parent"android:background="#263e60"
- android:layout_weight="1"android:orientation="horizontal">
- <Buttonandroid:id="@+id/chat_history"android:layout_width="@dimen/view_mid_x"
- android:layout_height="@dimen/view_mid_x"android:background="@drawable/chat_history_unsel"
- android:gravity="center_horizontal|center_vertical"style="@style/pub_pos_title_font"
- android:orientation="horizontal"/>
- </LinearLayout>
- </LinearLayout>
- <LinearLayoutandroid:layout_width="fill_parent"
- android:layout_weight="5"android:background="@drawable/bg_chat_msg_right"
- android:layout_height="fill_parent"android:orientation="horizontal">
- </LinearLayout>
- </LinearLayout>
- <!--特殊的中层,需要经常切换成Map或者List,以满足用户的不同设置模式-->
- <LinearLayoutandroid:layout_width="fill_parent"
- android:layout_weight="2"android:id="@+id/special_content"
- android:layout_height="fill_parent"android:orientation="horizontal">
- </LinearLayout>
- </LinearLayout>
这样,我们适配的时候,只需要将wrapper_content的内容, 由固定的view大小替换, fill_parent的内容, 完全不需要修改的.
附件是一个ui组织结构, 供参考注意没有将Layout内容打包,原因是, 只有一个layout文件夹
有一件诡异的事情公司的P7500升级后, 分辨率版本由原来的1280 * 800 变化为 1232 * 800 这个实在是有点诡异, 这个貌似是Android底层可配置的. 三星为什么这样做, 估计只有他自己晓得了。
更多相关文章
- Android(安卓)WebView漏洞
- [视频]Firefox for Android(安卓)预览版放出
- Android(安卓)Studio中调用高于minSdkVersion版本API, 无提示 (L
- Androids中的System.loadLibrary对于依赖so的加载分析
- Android引入外部自定义特殊字体的方法
- Android(安卓)Git 常用命令和规范
- Android系统字体规范与应用探索
- android 6.0的变化
- Android(安卓)targetSDK升级到28,gradle升级4.6遇到的问题