0

我有一個自定義視圖,只是在畫布上繪製一個圓(到目前爲止)。 在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> 
+0

你檢查onDraw()方法的值嗎?你將什麼數據傳輸到drawCircle()中? – Alexander

+0

你的onMeasure實現是什麼樣的? –

回答

0

嘗試這樣的。這將解決您的問題

刪除 「機器人:layout_centerInParent =」 真 「」 從 「CircleProgressBar」 和 集 「機器人:比重=」 中心 「」 以 「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),並且相似getTop()將返回parent_height/2。現在centerX,centerY值變得太大了。

+0

@tomtaila更新了我的文章。請檢查一下 – Sabari

相關問題