覆盖onDraw方法,使其分别打印到android:alignParentLeft

时间:2013-12-17 00:31:38

标签: android xml custom-controls relativelayout

我在应用程序屏幕上定位自定义视图时遇到问题。 我想覆盖onDraw方法,以便它'知道'在哪里绘制,如“android:layout_alignParentLeft”中所指定的那样。 目前它吸引了marginLeft和marginTop,无论我的'坦克'在哪里。 我有什么想法可以解决这个问题吗?

XML文件:

<ImageView
    android:id="@+id/tank"
    android:layout_width="wrap_content"
    android:layout_height="250dp"
    android:layout_marginLeft="150dp"
    android:layout_marginTop="10dp"
    android:adjustViewBounds="true"
    android:scaleType="fitXY"
    android:src="@drawable/tank" />

<pl.edu.agh.scada.graphicalObjects.AnalogBar
    android:id="@+id/analogBar"
    android:layout_width="25dp"
    android:layout_height="200dp"
    android:layout_toLeftOf="@+id/tank"
    android:layout_toStartOf="@+id/tank"
    android:layout_marginLeft="100dp"
    android:layout_marginTop="15dp"
    custom:editable="true"/>

我班级的一部分检索有关自定义视图的信息:

int width;
int height;
public AnalogBar(Context context, AttributeSet attrs) {
    super(context, attrs);
    boolean editable;
    TypedArray a = context.getTheme().obtainStyledAttributes(attrs, R.styleable.AnalogBar, 0, 0);
    if (!isInEditMode())
        parentView = ((MainActivity) context).fragment;
    try {
        editable = a.getBoolean(R.styleable.AnalogBar_editable, false);
       //I deleted everything else regarding custom properties
    } finally {
        a.recycle();
    }
    if (editable)
        this.setOnClickListener(new WriteRegisterListener());
    init();
}

public void init() {
    if (!isInEditMode())
        parentView.addViewToList(this);

要在屏幕上放置布局后获取有关布局的信息,我会覆盖:

public void onSizeChanged(int w, int h, int oldw, int oldh) {
    super.onSizeChanged(w, h, oldw, oldh);

    width = w;
    height = h;

我尝试了不同的功能:getX(),getLocationOnScreen() 但它仍然写在marginLeft和marginTop中保存的绝对位置。 有没有办法获取在与toLeftOf和toStartOf相关的位置绘制视图所需的信息?

幸运的是我设法做到了。 我怀疑我必须以某种方式检索布局的位置。事实证明,当您在左侧的“0”位置绘制视图时,它位于布局的最左端。
这样就可以正确地进行参数化

    android:layout_alignBottom="@+id/tank"
    android:layout_alignLeft="@+id/tank"
    android:layout_marginBottom="45dp"
    android:layout_marginLeft="75dp"

您可以在自定义视图的绘制位置绘制。 例如,如果要用矩形填充所有视图,则必须检索其大小(就像我在onSizeChanged中所做的那样),然后使用canvas.drawRect(0,0,width,height,border)绘制矩形;

我不知道为什么但是这些参数(alignBottom&amp; alignLeft)似乎比toLeftOf和toEndOf更好。 这些参数之间有什么区别?

1 个答案:

答案 0 :(得分:0)

视图在边距之后开始,并绘制考虑填充的子视图(作为子项的内边距)。 在这种情况下,如果您希望将视图绘制为与父项左侧对齐,则不应使用以下内容布置自定义视图:

android:layout_marginLeft="100dp"

除非您确实想要在父视图和视图之间留出空格。

另一件事是您设置自定义视图相对于坦克的位置:

android:layout_toLeftOf="@+id/tank"
android:layout_toStartOf="@+id/tank"

所以你可以试试:

android:layout_alignParentLeft="true"

希望它有所帮助。