在RelativeLayout中对齐时,自定义视图会消失

时间:2016-05-28 02:39:27

标签: android android-layout android-custom-view android-relativelayout

我有一个自定义视图,只是在画布上绘制一个圆圈(到目前为止)。 在RelativeLayout中使用它是好的,直到我告诉它具体在RelativeLayout中对齐的位置。

即。一旦我添加如下内容:android:layout_centerInParent =" true" 它将不再出现。

以下是相关代码:

public class CircleProgressBar extends ProgressBar {

int radius;
float centerX;
float centerY;

Paint progressPaint;

public CircleProgressBar(Context context) {
    super(context);
    init(context);
}

public CircleProgressBar(Context context, AttributeSet attrs) {
    super(context, attrs);
    init(context, attrs);
}

public CircleProgressBar(Context context, AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);
    init(context, attrs);
}

private void init(Context context) {
    progressPaint = new Paint();
    progressPaint.setColor(ContextCompat.getColor(context, R.color.colorAccent));
}

private void init(Context context, AttributeSet attributeSet) {
    progressPaint = new Paint();
    progressPaint.setColor(ContextCompat.getColor(context, R.color.colorAccent));
}

@Override
protected synchronized void onDraw(Canvas canvas) {
    radius = Math.max(getMeasuredWidth(), getWidth()) / 2;
    centerX = getLeft() + radius;
    centerY = getTop() + radius;

    canvas.drawCircle(centerX, centerY, radius, progressPaint);
}
}
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent">

<com.example.tomtaila.circleprogressbar.CircleProgressBar
    android:layout_centerInParent="true"
    android:layout_width="100dp"
    android:layout_height="100dp"/>

</RelativeLayout>

1 个答案:

答案 0 :(得分:0)

试试这样。这将解决您的问题

从“CircleProgressBar”中删除“android:layout_centerInParent =”true“” 将“android:gravity =”center“”设置为“activity_main”RelativeLayout

OR

@Override
    protected synchronized void onDraw(Canvas canvas) {
        radius = Math.max(getMeasuredWidth(), getWidth()) / 2;
        centerX = radius;
        centerY = radius;

        canvas.drawCircle(centerX, centerY, radius, progressPaint);
    }

虽然CircleProgressBar标签没有centerInParent属性,但它的位置是左上角(0,0)。所以在“onDraw”方法中你使用getLeft()返回0并且getTop()返回0。

但是CircleProgressBar标签带有centerInParent属性,它的位置是父级的中心(parent_width / 2,parent_height / 2)。因此在“onDraw”方法中,getLeft()将返回parent_width / 2()(如果父宽度为480,则返回240)并且simmilarlly getTop()将返回parent_height / 2。现在centerX,centerY值变得太大。