它很大程度上取决于您要创建的自定义View和ViewGroup类的数量.我能想到的具有最少数量的自定义类的实现将是这样的(非常类似于您所描述的):

>为最大的正方形自定义FrameLayout,使用自定义的onMeasure()实现将高度与可用宽度相匹配(您已经提到过这个).

>嵌套的LinearLayout实例使用权重来使所有网格按钮的大小相同.

这种方法的一大缺点是效率.您需要大约36个LinearLayout实例才能在更大的9×9网格内创建小的9×9网格……这是纯布局开销的36个视图.

就文本大小而言,我可以想到几种方法来处理这个问题.一种方法是使用Paint.measureTextBounds()(您可以获取任何TextView的Paint对象来进行测量),以确定在测量每个按钮后在每个按钮中生成文本所需的大小.不幸的是,这将是一个有点迭代的过程,因为Paint根据其当前设置测量给定文本,因此您需要:

>设置文字大小

>测量界限

>检查身高

>重复直到尺寸合适

好消息是你只需要这样做一次,然后将其应用到所有网格按钮,但是你需要等到网格按钮被测量.

这里的另一个选择是在ImageView之类的内容中显示图像而不是文本,ImageView可以将内容缩放到其大小.您可以使用我写的TextDrawable这样的内容来将文本内容设置为可扩展且没有质量损失的图像.

现在回到布局.你可以通过创建一个自定义的ViewGroup来测量和布局网格来获得大量的效率(名称GridLayout已经被采用……并且它不能完全用于此目的,所以我们称之为BlockLayout).创建自定义BlockLayout将允许您测量每个块的大小,并使用单个父级而不是4个LinearLayout实例在网格中布置9个子视图.这与您测量整体方块的方式基本相同,只是均匀划分.

然后,您可以使用仅10个布局开销实例构建整个布局……如果您可以将整个内容编码到单个ViewGroup中,则更少.

基本上,您可以编写的用于展平视图层次结构的代码越多,应用程序整体运行的效果就越好.

HTH

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐