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); 
    } 

centerInParent属性のないCircleProgressBarタグでは、その位置は左上(0,0)です。したがって、 "onDraw"メソッドではgetLeft()を使用して戻り値0とgetTop()は0を返します。

centerInParent属性のCircleProgressBarタグでは、その位置は親の中心(parent_width/2、parent_height/2)です。だから、 "onDraw"メソッドでgetLeft()はparent_width/2()を返します(親の幅が480の場合は240を返します)、simmilarlly getTop()はparent_height/2を返します。 CenterXの値が大きくなりすぎています。

+0

@tomtailaマイ・ポストを更新しました。これをチェックしてください – Sabari

関連する問題