Android 桌面应用程序 Home分析.docx
《Android 桌面应用程序 Home分析.docx》由会员分享,可在线阅读,更多相关《Android 桌面应用程序 Home分析.docx(19页珍藏版)》请在冰豆网上搜索。
Android桌面应用程序Home分析
Android桌面应用程序Home分析
目录
一、相关知识补充2
1、AndroidManifest.xml文件说明2
2、Activity2
3、Intent2
4、IntentFiter2
5、应用程序目录结构2
二、Home桌面应用主要完成功能3
三、Home入口(即自定义桌面启动)3
四、Home布局介绍4
五、源代码介绍5
1、Home.jave5
2、applicationInfo.java5
3、applicationStackLayout.java5
4、wallpaper.java5
六、具体实现流程分析5
七、修改实例7
1、修改图标
7
2、修改区域
(1)的动画显示与隐藏效果7
八、所遇到的问题及还未解决的问题8
附件1----androidanimation(动画效果)9
一、相关知识补充
1、AndroidManifest.xml文件说明
AndroidManifest.xml是每个android程序中必须的文件。
它位于application的根目录,描述了package中的全局数据,包括了package中暴露的组件(activities,services,等等),他们各自的实现类,各种能被处理的数据和启动位置。
此文件一个重要的地方就是它所包含的intent-filters。
这些filters描述了activity启动的位置和时间。
2、Activity
应用层的表示层,应用程序中的每个屏幕显示都是通过继承和扩展基类Activity来实现。
Activity窗口内的可见内容通过View提供。
一个Activity代表一个显示给用户的屏幕。
在manifest中定义的activity中,如果该activity的action是MAIN属性,并且category是LAUNCHER属性,那么该activity就是入口程序。
如果manifest中有多个这样情况的activity存在,那么系统会将第一个查找到的符合条件的activity作为入口程序。
manifest中至少应该有一个符合该条件的activity存在。
3、Intent
连接组件的纽带。
在不同组件之间传递消息,将一个组件的请求意图传给另一个组件。
Intent是一个包含具体请求信息的对象。
4、IntentFiter
应用程序可声明一个甚至多个IntentFilter。
每个IntentFilter描述该组件所能响应Intent请求的能力。
5、应用程序目录结构
Android的应用程序目录下主要有3个目录
●src源代码目录
包含应用程序中所需的全部程序代码(JAVA程序)
●gen目录
该目录下面的R.java文件是ADT自动产生的。
其定义了一个R类,包含了与用户界面、图像、文字、字符串等各种资源与相应的编号(id)。
Android应用程序通过R类来实现对资源的应用。
●res资源目录
其目录结构如下:
res
|
|--------------anim:
编译成帧动画的XML文件
|
|--------------drawable:
.png、.9.png、.jpg格式的图片(.9.png是一种特殊的png图,
|在图的四周有黑线条,意义如下:
|上、左黑线表示可拉伸的区域,
|右、下黑线表示可写字的区域)
|--------------layout:
描述屏幕布局的XML文件
|
|--------------value
||------------arrays.xml:
定义数组
||------------colors.xml:
定义显示颜色
||------------dimens.xml:
定义尺寸及大小
||------------string.xml:
定义字符内容
||------------styles.xml:
定义风格
|
|---------------xml:
用于Resouces.getXML()读取的任意XML资源文件
|
|---------------raw:
直接复制到实际设备上的任意Raw文件,比如音频、视频
二、Home桌面应用主要完成功能
1、打开应用程序集
点击下来
将弹出一个包含所有应用程序图标与链接的视图。
2、更换墙纸
按MENU键后会弹出一个选项菜单,其中有墙纸的设置(Wallpaper)。
如图2.1所示。
图2.1
3、将最近使用的应用程序显示在桌面上,如图2.2所示。
图2.2
三、Home入口(即自定义桌面启动)
在AndroidManifest.xml中为Home这个Activity设置一个特定的IntentFilter,其定义为:
android.intent.action.MAIN说明为主程序入口,定义为:
android.intent.category.HOME定,说明此Acitvity为HomeActivity,即开机启动后显示的Activity,或按下HOME键后显示的Activity.具体相关代码如下,
name="android.intent.action.MAIN"/>
name="android.intent.category.HOME"/>
......
所以在系统起来后,接收到相应的系统启动的Intent后就运行该Activity。
这就是为何在那么多的应用程序中为何启动这个应用程序做为桌面应用程序的原因。
四、Home布局介绍
1、总体布局分析
如下图4.2所示,图4.1是实际对照图。
对于用户而言,主要分为三个视图区域,如图中所标识的
(1)、
(2)、(3)。
图4.1
图4.2
●
(1)区域是GridView类型的组件,其中是由很多个TextView来填充这个GridView的每一格,这里的每个TextView又是由应用程序的图标和相应的标题组成。
●
(2)区域是一个LineraLayout布局的视图,该布局中只有一个CheckBox的组件。
●(3)区域也是由一个个TextView组成,其用来显示最近用到的应用程序,每个TextView也是由相应的应用程序的图标和相应的标题组成。
(注意:
其中的
(2)和(3)是在ApplicationsStackLayout这个View中实现的)
五、源代码介绍
应用程序中有4个源代码文件,分别说明如下:
1、Home.jave
通过分析AndroidManifest.xml文件可以确定Home.jave为整个程序的入口,其完成的任务有:
(1)调用设置墙纸的Acitvity;
(2)获取所有应用程序及最近用过的应用程序信息,并分别存放于两个ApplicationInfo类型的链中,其中ApplicationInfo是自定义的一个用来保存应用程序信息的类;
(3)实现GridView的动画显示与隐藏;
(4)实现GridView中应用程序点击事件的监听与执行。
(可认为这就是整个Home与其它应用程序的接口);
(5)选项菜单的创建(即按MENU键后弹出的菜单的实现);
2、applicationInfo.java
自定义的一个用来保存应用程序信息的类;
3、applicationStackLayout.java
自定义的一个用来显示布局的ViewGroup,其中实现了区域
(2)和(3)的显示及布局(3)中相应TextView点击事件的监听;
4、wallpaper.java
选取墙纸的一个Activity实现,名为Wallpaper,在Home中会通过startActivity()来调用这个Activity。
六、具体实现流程分析
应用程序的主要流程可以分为三个阶段:
●做些初始化及布局,设置各个事件监听;
●处于监听状态;
●有监听事件时,调用其相应的回调来进行处理。
图6.1Home.java中onCreat()所完成的工作
图6.2设置墙纸的Activity的调用过程
七、修改实例
1、修改图标
●查找到该资源位置为:
res\drawable中,与其相关的有两个png文件:
ic_launcher_allshow.png和ic_launcher_allhide.png,其分别对应显示区域
(1)时的显示和隐藏区域
(1)时的显示,当调用此资源时,用到了一个xml文件(all_applications.xml)
●all_applications.xml代码分析,原码如下:
android="
state_checked="false"android:
drawable="@drawable/ic_launcher_allshow"/>
state_checked="true"android:
drawable="@drawable/ic_launcher_allhide"/>
state_checked标志当前的组件是否选取中,未选中时则选取用ic_launcher_allshow作为图标,选取中时则选取用ic_launcher_allhide做为图标。
●经分析,若要修改这个图标的显示有两种方法,
第一:
直接用其它图片替代那两个图片,但文件名不变;
第二:
在res\drawable中加入两张新的图片资源,修改all_applications.xml的代码,如下:
android="
state_checked="false"android:
drawable="@drawable/XXXX"/>
state_checked="true"android:
drawable="@drawable/XXXX"/>
其中XXXX表示加入的图片资源名,注意不要后缀。
原因是我们对所有资源的引用都是通过R类来实现的,每个资源都可以在R类中找到相应的标志,相应的在R类中大部分都是使用相应文件的无后缀文件名为其对应的标志的。
1、修改区域
(1)的动画显示与隐藏效果
●与动画效果相关的文件描述资源在rec/ainm目录下,其中与区域
(1)的动画显示与隐藏有关的文件为:
grid_entry.xml和grid_exit.xml,对于动化效果的使用可参考附件1。
其中在grid_exit.xml中加入如下代码(说明:
也可加入grid_entry.xml中),即可实现旋转退出(或显示)。
●代码如下:
android:
interpolator="@android:
anim/accelerate_decelerate_interpolator"
android:
fromDegrees="0"
android:
toDegrees="+720"
android:
pivotX="50%"
android:
pivotY="50%"
android:
duration="1500"
/>
八、所遇到的问题及还未解决的问题
1、当有几个桌面应用程序时,在系统起来后会出现一个选择对话框,让你选择一个桌面应用程序启动,这种情况还出现在通过startActivity()来启动设置墙纸的Activity时。
个人分析,有可能是当多个Activity有相同的intentFilter时,当发送一个Intent,有多个Activity可以响应时就会出现一个选择对话框,至于这个功能的代码还未找到,应当是属于Android内部的实现,无法在应用程序中对其进行控制。
2、整个界面最上部分的那个可以拉动的部分,也还没有找到相应的代码。
3、系统设置、时间设置、日期设置视图的实现也还未找到其实现代码。
4、如在Launcher桌面上可以加入时钟的应用程序、或其他应用程序的快捷方式还未弄清楚,及应用程序图标的拖动也还需要去了解。
(说明:
这部份功能在Home桌面应用程序中没有实现,所说的功能是在Launcher中有实现,还有侍参考)。
附件1----androidanimation(动画效果)
androidanimation(动画效果)
动画效果编程基础--AnimationAndroid
动画类型
Android的animation由四种类型组成
XML中
alpha渐变透明度动画效果
scale渐变尺寸伸缩动画效果
translate画面转换位置移动动画效果
rotate画面转移旋转动画效果
JavaCode中
AlphaAnimation渐变透明度动画效果
ScaleAnimation渐变尺寸伸缩动画效果
TranslateAnimation画面转换位置移动动画效果
RotateAnimation画面转移旋转动画效果
Android动画模式
Animation主要有两种动画模式:
一种是tweenedanimation(渐变动画)
XML中
JavaCode
alpha
AlphaAnimation
scale
ScaleAnimation
一种是framebyframe(画面转换动画)
XML中
JavaCode
translate
TranslateAnimation
rotate
RotateAnimation
如何在XML文件中定义动画
① 打开Eclipse,新建Android工程
② 在res目录中新建anim文件夹
③ 在anim目录中新建一个myanim.xml(注意文件名小写)
④ 加入XML的动画代码
xmlversion="1.0"encoding="utf-8"?
>
android="
复制代码
Android动画解析--XML
xmlversion="1.0"encoding="utf-8"?
>
android=">
android:
fromAlpha="0.1"
android:
toAlpha="1.0"
android:
duration="3000"
/>
--透明度控制动画效果alpha
浮点型值:
fromAlpha属性为动画起始时透明度
toAlpha属性为动画结束时透明度
说明:
0.0表示完全透明
1.0表示完全不透明
以上值取0.0-1.0之间的float数据类型的数字
长整型值:
duration属性为动画持续时间
说明:
时间以毫秒为单位
-->
复制代码
xmlversion="1.0"encoding="utf-8"?
>
android="
android:
interpolator=
"@android:
anim/accelerate_decelerate_interpolator"
android:
fromXScale="0.0"
android:
toXScale="1.4"
android:
fromYScale="0.0"
android:
toYScale="1.4"
android:
pivotX="50%"
android:
pivotY="50%"
android:
fillAfter="false"
android:
startOffset=“700”
android:
duration="700"/>
--尺寸伸缩动画效果scale
属性:
interpolator指定一个动画的插入器
在我试验过程中,使用android.res.anim中的资源时候发现
有三种动画插入器:
accelerate_decelerate_interpolator加速-减速动画插入器
accelerate_interpolator加速-动画插入器
decelerate_interpolator减速-动画插入器
其他的属于特定的动画效果
浮点型值:
fromXScale属性为动画起始时X坐标上的伸缩尺寸
toXScale属性为动画结束时X坐标上的伸缩尺寸
fromYScale属性为动画起始时Y坐标上的伸缩尺寸
toYScale属性为动画结束时Y坐标上的伸缩尺寸
startOffset属性为从上次动画停多少时间开始执行下个动画
说明:
以上四种属性值
0.0表示收缩到没有
1.0表示正常无伸缩
值小于1.0表示收缩
值大于1.0表示放大
pivotX属性为动画相对于物件的X坐标的开始位置
pivotY属性为动画相对于物件的Y坐标的开始位置
说明:
以上两个属性值从0%-100%中取值
50%为物件的X或Y方向坐标上的中点位置
长整型值:
duration属性为动画持续时间
说明:
时间以毫秒为单位
布尔型值:
fillAfter属性当设置为true,该动画转化在动画结束后被应用
-->
复制代码
xmlversion="1.0"encoding="utf-8"?
>
android="
android:
fromXDelta="30"
android:
toXDelta="-80"
android:
fromYDelta="30"
android:
toYDelta="300"
android:
duration="2000"
/>
--translate位置转移动画效果
整型值:
fromXDelta属性为动画起始时X坐标上的位置
toXDelta属性为动画结束时X坐标上的位置
fromYDelta属性为动画起始时Y坐标上的位置
toYDelta属性为动画结束时Y坐标上的位置
注意:
没有指定fromXTypetoXTypefromYTypetoYType时候,
默认是以自己为相对参照物
长整型值:
duration属性为动画持续时间
说明:
时间以毫秒为单位
-->
复制代码
xmlversion="1.0"encoding="utf-8"?
>
android="
android:
interpolator="@android:
anim/accelerate_decelerate_interpolator"
android:
fromDegrees="0"
android:
toDegrees="+350"
android:
pivotX="50%"
android:
pivotY="50%"
android:
duration="3000"/>
--rotate旋转动画效果
属性:
interpolator指定一个动画的插入器
在我试验过程中,使用android.res.anim中的资源时候发现
有三种动画插入器:
accelerate_decelerate_interpolator加速-减速动画插入器
accelerate_interpolator加速-动画插入器
decelerate_interpolator减速-动画插入器
其他的属于特定的动画效果
浮点数型值:
fromDegrees属性为动画起始时物件的角度
toDegrees属性为动画结束时物件旋转的角度可以大于360度
说明:
当角度为负数——表示逆时针旋转
当角度为正数——表示顺时针旋转
(负数from——to正数:
顺时针旋转)
(负数from——to负数:
逆时针旋转)
(正数from——to正数:
顺时针旋转)
(正数from——to负数:
逆时针旋转)
pivotX属性为动画相对于物件的X坐标的开始位置
pivotY属性为动画相对于物件的Y坐标的开始位置
说明:
以上两个属性值从0%-100%中取值
50%为物件的X或Y方向坐标上的中点位置
长整型值:
duration属性为动画持续时间
说明:
时间以毫秒为单位
-->
复制代码
如何使用XML中的动画效果
publicstaticAnimationloadAnimation(Contextcontext,intid)
//第一个参数Context为程序的上下文
//第二个参数id为动画XML文件的引用
//例子:
myAnimation=AnimationUtils.loadAnimation(this,R.anim.my_action);
//使用AnimationUtils类的静态方法loadAnimation()来加载XML中的动画XML文件
复制代码
如何在Java代码中定义动画
//在代码中定义动画实例对象
privateAnimationmyAnimation_Alpha;
privateAnimationmyAnimation_Scale;
privateAnimationmyAnimation_Translat