我正在我的应用程序中绘制一个自定义 View ,该 View 基本上将arguments(XML)作为要显示的文本,然后继续无限旋转它。

在进行此控制时,我有一些疑问要问:

  • 我已经在attrs.xml文件中声明了我的两个可样式化属性。这些属性用于设置控件中使用的圆的宽度和宽度。我将在ondraw方法和onmeasure方法中使用这些值。我仅通过声明这些内容来运行程序,但是出现了一个错误,要求我放置android:width and android:height属性。我的问题是,如果我已经在使用自定义属性定义 View
  • 的高度和宽度,为什么我需要这些属性?
  • 我正在Mac上编码。现在,当我制作自己的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/

    09-04 22:03
    查看更多