[转帖]一个简单的Android Library Project例子_Android, Python及开发编程讨论区_Weblogic技术|Tuxedo技术|中间件技术|Oracle论坛|JAVA论坛|Linux/Unix技术|hadoop论坛_联动北方技术论坛  
网站首页 | 关于我们 | 服务中心 | 经验交流 | 公司荣誉 | 成功案例 | 合作伙伴 | 联系我们 |
联动北方-国内领先的云技术服务提供商
»  游客             当前位置:  论坛首页 »  自由讨论区 »  Android, Python及开发编程讨论区 »
总帖数
1
每页帖数
101/1页1
返回列表
0
发起投票  发起投票 发新帖子
查看: 3258 | 回复: 0   主题: [转帖]一个简单的Android Library Project例子        下一篇 
huizai
注册用户
等级:少校
经验:933
发帖:83
精华:0
注册:2013-6-18
状态:离线
发送短消息息给huizai 加好友    发送短消息息给huizai 发消息
发表于: IP:您无权察看 2013-6-19 16:04:59 | [全部帖] [楼主帖] 楼主

转自:http://www.mielf.net/featherelf/simple-android-library-project

最近羽毛自己写了一个Android的小控件:签名板,想在这里与大家分享一下Android Library Project的使用心得。先说说项目的内容:简单的说,就是一个不能换颜色的白板,并且能将绘制的内容保存下来,实现“签名笔迹记录”的简单功能。这个项目内容本身是很简单,而且多少有点幼稚,但是透过这个例子,却可以和大家分享下Library Project的使用。为了方便继续下面的解说,感兴趣的可以从CSDN这里下载工程文件,不过这次是要收费咯~o(∩_∩)o

一、何谓Library Project:

关于Library Project的官方详细解释可以参考这里,对英语不感冒的同学,可以参考我的简单解释:如果有一部分代码被多个工程共享了,那么这个时候把它做成库来加载,是最好的选择。在Java中,我们一般采用Jar包的形式提供库文件,但是在Android开发中,官方并不赞成打包为Jar包的方式,虽然在网上可以搜到一些“旁门左道”把资源打包成Jar包。而个人感觉Library Project的一个最大缺点就是库工程文件是展开的,这样工程文件“可以修改而不是只读”。

*说明:本文中的操作均利用Eclipse with ADT实现的。

二、如何创建Library Project:

Library Project和Standard Project的创建方式是一样——均是新建一个Android Project。

北京联动北方科技有限公司

在创建工程的时候,要注意,如果库工程中有 <activity>、<service>、<receiver>或者<provider>等,在用户工程的manifest.xml文件中均需要有专门的声明,详见官方说明

工程创建完毕以后,打开工程的属性配置,并选择到Android一项中,勾选“is library”:

北京联动北方科技有限公司

然后,再创建(或者选中已有的)一个用户工程,同样选择工程属性,然后在Library面板中添加刚才的库工程:

北京联动北方科技有限公司

整个添加过程就结束了。这里有一个疑难杂症提醒一下大家:如果在你完成了上诉步骤以后,发现在用户工程中仍然无法正常索引库工程的内容,Eclipse的自动补全系统也不能帮你添加import,甚至你手动添加了import都还是不能识别,那么,尝试重启一下你的Eclipse吧。

三、针对 Library Project的一些讨论:

1. 库文件需要Activity么?

从功能上讲,Android官方为大家提供了为库工程添加一切类型的可能性,然而这并不意味着我们就一定要这么做。

例如在我这次写的工程中,库工程的主要作用就是提供一个LinearLayout对象,里面躺着我的签名板。于是我有两个选择:1、提供一个LinearLayout对象;2、提供一个Activity对象。

通常情况下,我们会发现,采用前一种方法会令库工程更加灵活,因为如果提供一个Activity,就意味着我们必须提供它一些修饰信息:是否全屏,大小,配色以及Intent的读取和写入。这些都是与用户工程息息相关的,而对于签名板来说,则是多余的。

然而,如果我们提供的功能是类似于“弹出警告框”,那么或许提供一个直接的Activity会比较方便,虽然在配色方面极有可能与用户工程格格不入,但是作为一个简单的弹出框,它的影响是有限的。(想想平时我们用的各种绚丽的桌面应用,它们的报错框往往采用的是window默认提供的样式。)

2、如何让界面大小更加灵活(上)?

在我提供的例子中,需要为WhiteBoard的构造函数提供签名板的长宽。这个细节值得大家注意,它也消耗了我很多时间来研究相关的函数和逻辑。

首先,我们能想到的,这两个长宽的提供一定与承载它的界面大小相关,所以我们需要读取父控件的长宽:

[java]view plaincopyprint?

  1. final LinearLayout layout = (LinearLayout) this.findViewById(R.id.lv_main); 
  2. int width = layout.getWidth(); 


final LinearLayout layout = (LinearLayout) this.findViewById(R.id.lv_main);
int width = layout.getWidth();

;

然而如果getWidth这个函数是在Activity的onResume方法执行完之前调用,得到的仅可能是“0”。一个简单的解决方案就是将getWidth方法搬到其他地方读取——等onResume方法执行完毕以后再调用。否则就只有是读取窗口的大小了——关于在加载初期获取界面大小的方法暂时没有找到。

另外,在获取了父控件的大小以后,下一步需要考虑的就是这个值会不会太小了。这个问题看似简单,解决起来却非常繁琐,就像许多网页开发者常常忘记考虑用户浏览器窗口可能处于任何大小的情况。一个最简单的办法,就是考虑一个“最小长宽”的设计,如果窗口过小,就隐藏部分生成的信息。这点请参考我的WhiteBoard类下的calcHeightOfTopBorder方法。

3、如何让界面大小更加灵活(下)?

接刚才所述,现在介绍calcHeightOfTopBorder方法中的一些技术。

在这个方法中,我的目的是读取图标的大小,并把他最为“最小长宽”的重要参考。正如一开始所讨论的,我们无法在界面加在好之前读取界面长宽,因此我们无法直接读取使用了图标的ImageView控件的大小。于是,我们直接去读取图标的大小。加载图标的办法可以参考官方对BitmapFactory类的介绍,这里我们要与大家分享的则是一个技巧:那就是在我们加载图标的时候,如果提供了一个BitmapFactory.Options,并将其中的属性“inJustDecodeBounds”设置为True,则实际上BitmapFactory类不会真正加载图片,而仅仅是读取长宽保存在BitmapFactory.Options的outWidth和outHeight变量中。这样,我们就节省了很大的内存空间:

[java]view plaincopyprint?

  1. BitmapFactory.decodeResource(this.context.getResources(), R.drawable.whiteboard_cancel, tempImage); 
  2. maxheight = maxheight > tempImage.outHeight ? maxheight : tempImage.outHeight; 





赞(0)    操作        顶端 
总帖数
1
每页帖数
101/1页1
返回列表
发新帖子
请输入验证码: 点击刷新验证码
您需要登录后才可以回帖 登录 | 注册
技术讨论