Android系统的桌面定制精要

一、WorkSpace 的构成
WorkSpace

      WorkSpace是一个ViewGroup,用来显示应用图标,文件夹,widget

包含多个 CellLayout :

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

当项目需要使用相同的布局时,使用 Include 标签可达到重用 layout 布局文件的作用
 

二、计算View大小(measure

measure 过程的本质是把视图布局时使用的 相对值 转换为具体值的过程。
View 系统启动 measure 过程是从 ViewRoot 中调用 host.measure () 开始的。
Host.measure () 会调用 View 类的 measure() 函数,该函数被 final 修饰,不能被重载,该方法中回调 onMeasure ()。
自定义 View 大多时候重写 onMeasure () 时需要对计算控件的实际大小,然后调用 setMeasuredDimension ( int , int ) 设置实际大小。
onMeasure 传入的 widthMeasureSpec heightMeasureSpec 不是一般的尺寸数值,而是将模式和尺寸组合在一起的数值。我们需要通过 int mode = MeasureSpec.getMode ( widthMeasureSpec ) 得到模式,用 int size =  MeasureSpec.getSize ( widthMeasureSpec ) 得到尺寸。
mode 共有三种情况,取值分别为 MeasureSpec.UNSPECIFIED , MeasureSpec.EXACTLY , MeasureSpec.AT_MOST
MeasureSpec.EXACTLY 是精确尺寸。
MeasureSpec.AT_MOST 是最大尺寸。
MeasureSpec.UNSPECIFIED 是未指定尺寸,这种情况不多,一般都是父控件是 AdapterView 通过 measure 方法传入的模式。
最根儿的 widthMeasureSpec heightMeasureSpec 通过调用 getRootMeasureSpec () 获取的。
 

三、 布局过程(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操作已经完成了。

ViewGroup 的切屏就是不断绘制的过程。
当手指在屏幕上滑动,通过调用 View scrollBy () 来更新屏幕
当手指离开屏幕,通过调用 Scroller startScroll () 来开始滚动切屏,在该函数中主要是进行赋值:水平方向滚动的偏移值,垂直方向滚动的偏移值水平方向滑动的距离,垂直方向滑动的距离,滚动持续时间
重载 computeScroll () 方法,在 drawChild () 方法中调用 computeScroll () 达到

自动滚动切屏的作用。

    以上过程的作用:1.计算mScrollX,mScrollY的值.2.通过invalidate函数来调用dispatchDraw()函数来不停的绘制。

dispatchdraw () 中绘制父视图中包含的子视图,本质作用是给不同的子视图分配合适的 canvas ,如何绘制,则递归到 view 类的 draw() 函数。
dispatchDraw () 内部执行流程:

          a.判断mGroupFlags是否设置FLAG_RUN_ANIMATION标识,该标识是ViewGroup的布局动画标识。

       b.处理padding属性。

          c.清除mPrivateFlagsDRAW_ANIMATION标识,因为接下来会绘制视图了。

          d.使用for()循环,针对子视图逐个调用drawChild()函数.

          e.重新检查mGroupFlags是否包含FLAG_INVALIDATED_REQURIED标识,因为drawChild()调用后,可能需要重绘ViewGroup.

           f.与第一步对称,如果第一步处理了布局动画,通知应用程序布局动画完成.

drawChild () 的核心过程是为子视图分配合适的 Canvas 剪切区 . 根据之前步奏计算得到的 mScrollX,mScrollY 的值,通过调用 canvas. translate() 函数来移动画布,达到视图滚动的效果。
 

四、WorkSapce 切屏 && 特效

drawChild () 中通过调用 getChildStaticTransformation () 方法来绘制切屏的特效。
getChildStaticTransformation (View child, Transformation transformation ) 中通过 transformation 来获取 canvas matrix, 通过调用 matrix.setPolyToPoly () 函数来控制 canvas 的变换 , 同时调用

      transformation.setAlpha()方法来控制透明度的变化。

    public void SetPolyToPoly (float[]srcint srcIndex, float[]dstint dstIndexint pointCount)

       功能:多边形的转换

      src:原始区域

      dst:目标区域

      pointCount:区域总的顶点数目

      比如说需要把一个矩形区域的内容搬到另一个矩形区域,一个继续有4个顶点,每个顶点需要xy来标识,这样srcdst数组的长度都是8,分别代表了 左上,右上,右下,左下顶点的坐标值。

一定要调用 setStaticTransformationsEnabled ( true ) , 才使 getChildStaticTransformation () 生效 .
 

五、主题包的制作和使用

1.主题包是什么

       主题包其实就是一个包含了相同主题的文件资源(主要是图片)的应用程序.

2.如何制作主题包

        遵循自己定义的一系列规则,比如图片的命名,该主题包的action设置等,然后打包成一个apk文件.

3. 如何获取安装的主题

        手机已经安装了应用的主题包,在程序中通过PackageManagerqueryIntentActivities函数来获取符合规则的主题包.比如在LauncherEyyo中通过下面的代码来获取主题包.

1.获取了安装的主题包,并选择其中的一个主题包,通过调用android.os.Process.killProcess(android.os.Process.myPid())来重启该应用,重新加载资源.

2.在程序中通过调用PackageManagergetResourcesForApplication ()来获取该主题包的Resources .

3.得到该主题包的Resources,通过调用该ResourcesgetIdentifier ()函数来获取指定文件名的资源.

       getIdentifier(“textView01”, “id”, “cn.xxx.xxx”); 
      
第一个参数为应用需要替换的文件名,第二个为资源属性是ID或者是Drawable,第三个为包名。返回值是该文件的id,如果返回值为0,则说明该主题包中没有包含对应的文件. 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值