2016-10-23 1 views
1

私は「OK」サークルの中央集中書きたいライトキャンバス(onDrawビュー)とテキスト私はこの見解を持っている

public class ColorPickerOvalView extends View { 

    private Paint paint; 
    private Paint centerPaint; 
    private Paint paintText; 
    private final int[] colorsArray; 
    private OnColorChangedListener changedListener; 
    private String key; 
    private boolean trackingCenter; 
    private boolean highlightCenter; 

    private RectF rectF; 

    private static final int CENTER_X = 120; 
    private static final int CENTER_Y = 120; 
    private static final int CENTER_RADIUS = 39; 
    private static final float PI = 3.1415926f; 

    public ColorPickerOvalView(Context context) { 
     super(context); 
     colorsArray = new int[]{ 
       0xFFFF0000, 0xFFFF00FF, 0xFF0000FF, 0xFF00FFFF, 0xFF00FF00, 
       0xFFFFFF00, 0xFFFF0000 
     }; 
    } 

    public ColorPickerOvalView(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     colorsArray = new int[]{ 
       0xFFFF0000, 0xFFFF00FF, 0xFF0000FF, 0xFF00FFFF, 0xFF00FF00, 
       0xFFFFFF00, 0xFFFF0000 
     }; 
    } 

    public ColorPickerOvalView(Context context, AttributeSet attrs, int defStyleAttr) { 
     super(context, attrs, defStyleAttr); 
     colorsArray = new int[]{ 
       0xFFFF0000, 0xFFFF00FF, 0xFF0000FF, 0xFF00FFFF, 0xFF00FF00, 
       0xFFFFFF00, 0xFFFF0000 
     }; 
    } 

    public void init(OnColorChangedListener listener, int color, String key) { 
     //super(c); 
     changedListener = listener; 

     Shader shader = new SweepGradient(0, 0, colorsArray, null); 

     paint = new Paint(Paint.ANTI_ALIAS_FLAG); 
     paint.setShader(shader); 
     paint.setStyle(Paint.Style.STROKE); 
     paint.setStrokeWidth(50); 

     centerPaint = new Paint(Paint.ANTI_ALIAS_FLAG); 
     centerPaint.setColor(color); 
     centerPaint.setStrokeWidth(10); 

     paintText = new Paint(); 
     paintText.setColor(Color.WHITE); 

     this.key = key; 

     float raio = CENTER_X - paint.getStrokeWidth() * 0.5f; 
     rectF = new RectF(-raio, -raio, raio, raio); 
    } 


    @Override 
    protected void onDraw(Canvas canvas) { 

     canvas.translate(CENTER_X, CENTER_X); 

     canvas.drawOval(rectF, paint); 
     canvas.drawCircle(0, 0, CENTER_RADIUS, centerPaint); 

     //write the text 
     canvas.drawText("OK", 0, 0, paintText); 

     if (trackingCenter) { 
      int color = centerPaint.getColor(); 
      centerPaint.setStyle(Paint.Style.STROKE); 

      if (highlightCenter) { 
       centerPaint.setAlpha(0xFF); 
      } else { 
       centerPaint.setAlpha(0x80); 
      } 

      canvas.drawCircle(0, 0, CENTER_RADIUS + centerPaint.getStrokeWidth(), centerPaint); 

      centerPaint.setStyle(Paint.Style.FILL); 
      centerPaint.setColor(color); 
     } 
    } 

    @Override 
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 
     setMeasuredDimension(CENTER_X * 2, CENTER_Y * 2); 
    } 

    ... 

} 

と(カラーピッカービュー)が、私のOKが間違って滞在している(しません中央集中型)。 このテキストを正確に円の中心に置く必要があります。私はこのテキストを集中することができますどのように

enter image description here

?どのようにサイズを変更するのですか?

おかげ

答えて

1

のDrawText()は、文字列の最初の文字の左下に描画を開始します。中央に配置する場合は、最初にテキストブロック全体のサイズを計算し、開始位置をオフセットする必要があります。

テキストのサイズを取得するには、Paint.getTextBounds()を使用します。

+0

@EmilyRでしたか? –

+0

本当に助けられました!どうもありがとう。サイズを変更するには、次のようにしました: 'float txtSize = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP、20、getResources()。getDisplayMetrics()); paintText.setTextSize(txtSize); @ペリーハートマンありがとう – EmilyR

+0

喜んで聞いてください。ペイントをよく見てみてください。それは、テキストサイズを含むあらゆる種類のものの設定をしています。 –

0

テキストの幅の半分を左に移動する必要があります。つまり、

float textWidth = paintText.measureText(timeText); 
float xOffset = textWidth/2; 
canvas.drawText("OK", -xOffset, 0, paintText); 
関連する問題