WorkSpace是一个ViewGroup,用来显示应用图标,文件夹,widget等。
<include android:id="@+id/cell2" layout="@layout/workspace_screen" />
<include android:id="@+id/cell3" layout="@layout/workspace_screen" />
<include android:id="@+id/cell4" layout="@layout/workspace_screen" />
<include android:id="@+id/cell5" layout="@layout/workspace_screen" />
二、计算View大小(measure)
三、 布局过程(layout)
1.执行完measure操作后,接下来就是layout过程了。
2.Layout函数的最初的调用从ViewRoot类的performTraversals()。
3.Layout函数类型是final,子类不能重载,保证View系统中layout过程不变,在该函数中回调onLayout()。
4.layout()函数内部流程如下:
a. 调用setFrame()将位置参数保存到View内部变量(mLeft,mTop,mRight,mButtom).
b. 回调onLayout(),View中定义的onLayout()函数默认什么都不做,ViewGroup中该方法重载修改为抽象方法,所以继承ViewGroup类必须重载onLayout,View系统希望在onLayout()中对该视图所包含的子视图进行layout操作。
c.清除mPrivateFlags中的LAYOUT_REQUIRED标识,layout操作已经完成了。
自动滚动切屏的作用。
以上过程的作用:1.计算mScrollX,mScrollY的值.2.通过invalidate函数来调用dispatchDraw()函数来不停的绘制。
a.判断mGroupFlags是否设置FLAG_RUN_ANIMATION标识,该标识是ViewGroup的布局动画标识。
b.处理padding属性。
c.清除mPrivateFlags的DRAW_ANIMATION标识,因为接下来会绘制视图了。
d.使用for()循环,针对子视图逐个调用drawChild()函数.
e.重新检查mGroupFlags是否包含FLAG_INVALIDATED_REQURIED标识,因为drawChild()调用后,可能需要重绘ViewGroup.
f.与第一步对称,如果第一步处理了布局动画,通知应用程序布局动画完成.
四、WorkSapce 切屏 && 特效
transformation.setAlpha()方法来控制透明度的变化。
public void SetPolyToPoly (float[]src, int srcIndex, float[]dst, int dstIndex, int pointCount)
功能:多边形的转换
src:原始区域
dst:目标区域
pointCount:区域总的顶点数目
比如说需要把一个矩形区域的内容搬到另一个矩形区域,一个继续有4个顶点,每个顶点需要x,y来标识,这样src和dst数组的长度都是8,分别代表了 左上,右上,右下,左下顶点的坐标值。
五、主题包的制作和使用
1.主题包是什么
主题包其实就是一个包含了相同主题的文件资源(主要是图片)的应用程序.
2.如何制作主题包
遵循自己定义的一系列规则,比如图片的命名,该主题包的action设置等,然后打包成一个apk文件.
3. 如何获取安装的主题
手机已经安装了应用的主题包,在程序中通过PackageManager的queryIntentActivities函数来获取符合规则的主题包.比如在LauncherEyyo中通过下面的代码来获取主题包.
1.获取了安装的主题包,并选择其中的一个主题包,通过调用android.os.Process.killProcess(android.os.Process.myPid())来重启该应用,重新加载资源.
2.在程序中通过调用PackageManager的getResourcesForApplication ()来获取该主题包的Resources .
3.得到该主题包的Resources后,通过调用该Resources的getIdentifier ()函数来获取指定文件名的资源.
getIdentifier(“textView01”, “id”, “cn.xxx.xxx”);
第一个参数为应用需要替换的文件名,第二个为资源属性是ID或者是Drawable,第三个为包名。返回值是该文件的id,如果返回值为0,则说明该主题包中没有包含对应的文件.