我正在我的应用程序中绘制一个自定义 View ,该 View 基本上将arguments(XML)作为要显示的文本,然后继续无限旋转它。
在进行此控制时,我有一些疑问要问:
attrs.xml
文件中声明了我的两个可样式化属性。这些属性用于设置控件中使用的圆的宽度和宽度。我将在ondraw方法和onmeasure方法中使用这些值。我仅通过声明这些内容来运行程序,但是出现了一个错误,要求我放置android:width and android:height
属性。我的问题是,如果我已经在使用自定义属性定义 View attrs.xml
文件时,没有显示通常通过ctrl + space获取的自动完成列表。这是为什么。例如,我想知道我可以给自定义属性的format属性提供哪些值,就像我在下面进行降级处理一样:<attr name ="somename" format="value I wanted to find out through autocomplete">
。为什么自动弹出功能没有弹出?当我制作一个.java文件时,它确实弹出了。 ondraw()
方法中,我想画一个圆。现在,为此,我需要圆心的坐标。所以我要做的是0,0。但这是不正确的。我希望圆位于它所在的父 View 的中心。因此,如果我的 View 处于层次结构中,我希望它尊重它。我想给出相对于父 View 的坐标。现在发生的现象是它绘制在屏幕的左上角。这就是我所不想要的。我要怎么做才能做到这一点? 最佳答案
这是因为Android需要知道如何以及在布局中放置 View 的位置。您可以通过覆盖View.onMeasure()以返回自己的大小参数来实现您的 View ,以利用您的自定义高度/宽度要求。然后,您可以在布局文件中设置android:layout_width="wrap_content" android:layout_height="wrap_content"
。
Android xml文件的自动完成和自动文档实现充其量是不稳定的,因此它不起作用并不奇怪。我未知的修复程序和AFAIK这是一个IDE错误。
如果正确实现了onMeasure(),则相对于父级的坐标应已得到照顾。要获得 View 的中心,请使用以下代码:
void onDraw(Canvas canvas)
{
int centerX = this.getWidth() / 2;
int centerY = this.getHeight()) / 2;
//..draw code here
}
编辑
这是一个源代码示例,应该会有所帮助:http://mindtherobot.com/blog/272/android-custom-ui-making-a-vintage-thermometer/