Android 多平台解决方案

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"
					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>

在字体style文件中使用字体大小:

	<style name="dialog_checkbox_txt_font">
		<item name="android:textSize">@dimen/txsize_large_x</item>
		<item name="android:textColor">#ffffffff</item>
	</style>

	<style name="dialog_button_txt_login_font">
		<item name="android:textSize">@dimen/txsize_large_x</item>
		<item name="android:textColor">#ffffffff</item>
	</style>


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

	<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底层可配置的. 三星为什么这样做, 估计只有他自己晓得了。


  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值