【发布时间】:2015-05-12 15:39:55
【问题描述】:
干杯,
我有一个接收用户输入(2 个数字,宽度和高度)的应用程序,理论上,根据该输入,我有一个自定义视图,应该绘制一个网格(宽度和高度)。
注意:
- 这 2 个值应在视图尝试绘制自身之前接收。
- 这两个值不是常数,因此我认为 XML 方法没有帮助。
- 有人告诉我,向 View 构造函数添加另一个参数是邪恶的。
- 不要将我的 2 个值与 canvas.getWidth 等混淆。这些值仅用于绘制某些内容,仅此而已。
- My View 也是一个 ViewGroup。
- 主要问题在于 XML 文件中声明的视图。
我通过创建一个包含这 2 个静态值的 SchemeContext 类暂时解决了这个问题,我只是将它们设置在 onCreate 中(在 onCreateView 之前),然后在需要时在自定义 View onDraw 中使用它们(SchemeContext.width)。这不是人们所说的 OOP 我在 java 上强制使用全局变量,并且由于片段生命周期而按时设置。
我已经看到了这个答案How to pass variables to custom View before onDraw() is called?。
但这更像是一种变通方法,而不是一种解决方案(而且可能不是最快的解决方案)。必须有一个明智的解决方案,我不认为 android 上的 3D 游戏采用这些变通方法(使用 OpenGL 的 SurfaceView 仍然是 View 对吗?:d)。
如果有一个明显的解决方案并且这是一个明显的双重问题,我会删除这个问题。
【问题讨论】:
-
在您的自定义视图中使用方法
setValues(int width, int height)有什么问题?在setValues(...)中分配这些值后,调用 invalidate()`。 -
为什么添加构造函数是邪恶的?如果您不想这样做,为什么不在将视图添加到其容器之前添加设置值?
-
@Vikram 每个对象在其构造函数返回时都应该是有效的。
-
vikram:因为我认为这是通过视图组树的额外传递。也许它在小应用程序中吹毛求疵,但我认为这可能会导致问题。
-
@KevinKrumwiede 请解释一下。
标签: android android-custom-view