使用Android绘制自定义视图

使用Android绘制自定义视图,android,Android,我在我的应用程序中绘制了一个自定义视图,它基本上以参数(XML)作为文本来显示,然后继续无限旋转它 当我进行此控制时,我有一些疑问,我想问: 我在attrs.xml文件中声明了两个可设置样式的属性。这些属性用于设置控件中使用的圆的宽度和宽度。我将在ondraw方法和onmeasure方法中使用这些值。我运行程序时只声明了这些属性,但出现了一个错误,要求我输入android:width和android:height属性。我的问题是,如果我已经在使用自定义属性定义视图的高度和宽度,为什么需要这些属

我在我的应用程序中绘制了一个自定义视图,它基本上以参数(XML)作为文本来显示,然后继续无限旋转它

当我进行此控制时,我有一些疑问,我想问:

  • 我在
    attrs.xml
    文件中声明了两个可设置样式的属性。这些属性用于设置控件中使用的圆的宽度和宽度。我将在ondraw方法和onmeasure方法中使用这些值。我运行程序时只声明了这些属性,但出现了一个错误,要求我输入
    android:width和android:height
    属性。我的问题是,如果我已经在使用自定义属性定义视图的高度和宽度,为什么需要这些属性

  • 我在mac电脑上编码。现在,当我制作
    attrs.xml
    文件时,通常通过ctrl+space获得的自动完成列表并没有显示出来。这是为什么。例如,我想知道我可以为自定义属性的format属性指定哪些值,就像我在下面演示的那样:
    。为什么自动完成没有出现?当我制作一个.java文件时,它确实会弹出

  • 在我的
    ondraw()
    方法中,我想画一个圆。现在我需要圆心的坐标。所以我要做的就是把0,0。但这是不对的。我希望圆位于其所在父视图的中心。因此,如果我的观点是层次结构,我希望它尊重这一点。我想给出相对于父视图的坐标。现在发生的事情是,它被绘制在我屏幕的左上角。这是我不想要的。我该怎么做才能做到这一点

如果我已经在使用自定义属性定义视图的高度和宽度,为什么需要这些属性

这是因为Android需要知道如何以及在布局中放置视图。通过重写以返回自己的尺寸参数,可以实现视图以利用自定义高度/宽度要求。然后,只需在布局文件中设置android:layout\u width=“wrap\u content”android:layout\u height=“wrap\u content”

为什么自动完成没有出现?当我制作一个.java文件时,它确实会弹出

Android xml文件的Autocomplete和autodoc实现充其量是不稳定的,所以它不起作用也就不足为奇了。我不知道有什么修复方法,我想这是一个IDE错误

在我的ondraw()方法中,我想要绘制 一个圆圈。现在为了这个,我需要 中心的坐标 圆圈所以我要做的就是把0,0。但是 这是不对的。我要圆圈 位于父视图的中心 它在里面。所以如果我的观点是正确的 我希望它尊重这一点。我 要给出相对坐标吗 到父视图。发生了什么事 现在,它是在 我屏幕的左上角。这 这是我不想要的。我该怎么办 实现这一目标

如果正确地实现了onMeasure(),那么应该已经考虑到相对于父对象的坐标。要获取视图的中心,请使用以下代码:

void onDraw(Canvas canvas)
{
int centerX = this.getWidth() / 2;
int centerY = this.getHeight()) / 2;
//..draw code here
}
编辑

下面是一个源代码示例,应该会有所帮助:

谢谢您的回复。现在,当我执行这个.getWidth()时,我确实需要注意我使用的密度,对吗?在XML中,dip有一个很好的规定,我可以硬编码单元,有没有类似的方法通过代码来做事情?同样,当我在上面的方法中谈到画布时,它包括整个屏幕,或者我的视图所在的屏幕部分?@user590849 GetWidth已经处理了密度,如果在onMeasure()中正确处理密度。另外,我看到的一个建议是在onDraw()中调用canvas.scale(),并将比例设置为1.0到1.0,以便1.0是视图的宽度/高度。那么所有的尺寸都是实际视图尺寸。好的。这是个好建议。但是当你说我必须用测量方法来处理这个问题时,我该怎么做呢。实际上,当我通过代码进行操作时,我不知道如何处理屏幕独立性。使用XML时我很清楚。@user590849我认为所有的onMeasure dimmensions都是dip单位,但我不确定。请查看这个带有源代码的示例,以获得进一步的建议。