【问题标题】:Custom View disappears when aligned within a RelativeLayout自定义视图在相对布局中对齐时消失
【发布时间】:2016-09-26 10:51:32
【问题描述】:

我有一个自定义视图,它只是在画布上绘制一个圆圈(到目前为止)。 在 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>

【问题讨论】:

  • 你检查 onDraw() 方法中的值吗?你将什么数据传输到 drawCircle() 中?
  • 您的 onMeasure 实现是什么样的?

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


【解决方案1】:

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

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

@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),类似地 getTop() 将返回 parent_height/2。现在 centerX、centerY 的值变得太大了。

【讨论】:

  • @tomtaila 更新了我的帖子。请检查一下
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-02
相关资源
最近更新 更多