现在的位置: 首页 > 移动开发 > 正文

Android 多平台解决方案

2019年03月06日 移动开发 ⁄ 共 6511字 ⁄ 字号 评论关闭

Android 版本分裂始终是一个头疼的问题,   本月我们将用一种合理的方案,解决不同SDK, 不同版本下匹配的问题。 SDK实际上并不是向下兼容, 我们做产品的时候,是否意味着需要管理多个版本? 这样带来的成本,对于中小团队来说,是一场噩梦。 因此,我们寻求的解决方案是: 同一个版本, 应对多变的外部平台。

我们这边的需求是:

1. 不针对不同的分辨率开发多个版本. 不为Android平板开发新版本====》 目的,方便统一版本管理, 减少后期维护压力。

2. 图片一律不重新设计,  目标版本最佳为: 800 * 480, 避免用户的下载APK包过大. =====》为用户节省流量, 避免吓退用户。

3. 要求对2.2以后的SDK版本的各种分辨率进行适配. 其他版本美观要求可以略微降低, 但不影响客户使用。

因为我们不是游戏产品, 而是应用开发, 所以, 达到这些要求, 已经非常足够。

针对上述需求, 集中解决的问题是: 不同的Android设备, 需要定义view的大小, 以及字体大小. 再无其它. 因此在我们的产品中, 是这样解决问题的。

1. 针对字体. 定义出大、中、小 三种版式, 每种再细分为三种型号, 如下: 

    <resources>  
      
        <dimen name="txsize_large_xxx">45px</dimen>  
        <dimen name="txsize_large_xx">39px</dimen>  
        <dimen name="txsize_large_x">33px</dimen>  
          
        <dimen name="txsize_mid_xxx">30px</dimen>  
        <dimen name="txsize_mid_xx">27px</dimen>  
        <dimen name="txsize_mid_x">24px</dimen>  
          
        <dimen name="txsize_small_xxx">21px</dimen>  
        <dimen name="txsize_small_xx">18px</dimen>  
        <dimen name="txsize_small_x">15px</dimen>  

这九种字形大小, 基本上可以涵盖一个产品的基本字体, 如果您的项目可能还有更多字体, 可以再增加_xxxxx这样的型号.

2.  针对不同的view, 同样整理出大中小三种版式,每种再细分为三种型号.

     <!-- 各种需要适配的宽度值 -->  
    <dimen name="view_large_xxx">160dip</dimen>  
    <dimen name="view_large_xx">140dip</dimen>  
    <dimen name="view_large_x">120dip</dimen>  
      
    <dimen name="view_mid_xxx">100dip</dimen>  
    <dimen name="view_mid_xx">90dip</dimen>  
    <dimen name="view_mid_x">80dip</dimen>  
      
    <dimen name="view_small_xxx">70dip</dimen>  
    <dimen name="view_small_xx">60dip</dimen>  
    <dimen name="view_small_x">50dip</dimen>  

3. 上述是18种长度值, 基本上涵盖了一个产品的全部需求, 将其保存为一个String.xml, 见附件内容

4.为不同的尺寸,建立values文件夹, 文件夹中, 适配该型号的字体或者view的大小string.xml文件

5. 在layout中使用view的大小

    <LinearLayout android: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">  
      
        <Button android:id="@+id/chat_near_me" android:layout_width="@dimen/view_mid_x"  
            <span style="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文件中使用字体大小:

    <style name="dialog_checkbox_txt_font">  
        <item name="android:textSize"><span style="color:#ff0000;">@dimen/txsize_large_x</span></item>  
        <item name="android:textColor">#ffffffff</item>  
    </style>  
      
    <style name="dialog_button_txt_login_font">  
        <item name="android:textSize"><span style="color:#ff0000;">@dimen/txsize_large_x</span></item>  
        <item name="android:textColor">#ffffffff</item>  
    </style>  

6.  AndroidMainfest.xml文件标注需要适配

  1.   
     <uses-permission android:name="android.permission.RESTART_PACKAGES" />  
          
        <supports-screens android:largeScreens="true" android:normalScreens="true" android:anyDensity = "true"/>  
      
    </manifest>  

一切OK!

BTW: 

1. 为每个分辨率建立Layout-xxx*xxx的解决方案. 显然不好, 重复度太高, 维护代价大

2. 有人说仅仅通过dip解决方案, 说这样可以做到设备无关,  放弃吧, 这个绝对不行.

3. 推荐布局文件尽量手写, 别用工具生成, 另外, 注意多用LearLayout, 布局为fill_parent的方式, 这样非常好的将屏幕按照比例划分, 移植能力非常优越, 拿一个我写的为例:

    <?xml version="1.0" encoding="utf-8"?>  
    <!-- 这是一个导航条: 上一层, 主页面, 我的设备 -->  
    <LinearLayout android: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">  
      
      
        <LinearLayout android:layout_width="fill_parent"  
            android:layout_weight="15" android:layout_height="fill_parent"  
            android:orientation="horizontal">  
      
            <LinearLayout android: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的效果 -->  
            <LinearLayout android:layout_width="fill_parent" android:layout_height="fill_parent" android:gravity="center_horizontal|center_vertical"  
                android:layout_weight="1" android:orientation="horizontal">  
      
      
                <LinearLayout android: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">  
      
                    <Button android: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>  
      
                <LinearLayout android: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">  
      
                    <Button android: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>  
      
                <LinearLayout android: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">  
      
                    <Button android: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>  
      
                <LinearLayout android: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">  
                    <Button android: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>  
      
            <LinearLayout android: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, 以满足用户的不同设置模式 -->  
        <LinearLayout android: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底层可配置的. 三星为什么这样做, 估计只有他自己晓得了。

抱歉!评论已关闭.