Android系统的桌面定制精要

本文深入解析了Android桌面布局的工作原理,包括Workspace的构成及其切屏特效实现方式,并详细介绍了View的测量与布局过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、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传入的widthMeasureSpecheightMeasureSpec不是一般的尺寸数值,而是将模式和尺寸组合在一起的数值。我们需要通过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方法传入的模式。
最根儿的widthMeasureSpecheightMeasureSpec通过调用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的切屏就是不断绘制的过程。
当手指在屏幕上滑动,通过调用ViewscrollBy()来更新屏幕
当手指离开屏幕,通过调用ScrollerstartScroll()来开始滚动切屏,在该函数中主要是进行赋值:水平方向滚动的偏移值,垂直方向滚动的偏移值水平方向滑动的距离,垂直方向滑动的距离,滚动持续时间
重载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, Transformationtransformation)中通过transformation来获取canvasmatrix,通过调用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,则说明该主题包中没有包含对应的文件. 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值