5

Mam wymagane w moim projekcie dynamiczne rysowanie koła w czasie wykonywania. W tym celu używam ShapeDrawable do programowego tworzenia koła, ale niestety nie mogłem znaleźć żadnej klasy ani metod wewnątrz ShapeDrawable dla CircleShape, zamiast tego znalazłem tylko OvalShape(). Uprzejmie proszę pomóż mi narysować okrąg za pomocą ShapeDrawable przez podanie średnicy lub promienia koła. Z góry dziękuję. Każdy rodzaj dostosowania byłby przydatny dla mnie, aby naprawić moje rozwiązanie.Koło rysowania programowo za pomocą Android ShapeDrawable

kod używam dla ShapeDrawable jest

public static ShapeDrawable drawCircle (Context context, int width, int height, int color) { 

     //////Drawing oval & Circle programmatically ///////////// 

     ShapeDrawable oval = new ShapeDrawable (new OvalShape()); 
     oval.setIntrinsicHeight (height); 
     oval.setIntrinsicWidth (width); 
     oval.getPaint().setColor (color); 
     return oval; 
    } 

Code używając w MainActivity.java

if(Build.VERSION.SDK_INT >= 16) { 
      txtCount.setBackground (Util.drawCircle (MainActivity.this, 50, 50, getResources().getColor (R.color.yellow))); 
      txtHotelCount.setText ("20"); 
     }else{ 
      txtCount.setBackgroundDrawable (Util.drawCircle (MainActivity.this, 50, 50, getResources().getColor (R.color.yellow))); 
      txtHotelCount.setText ("20"); 

     } 

xml użyciem TextViewtxtCount w moim projekcie, jest

<LinearLayout 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:padding="10dp" 
     android:background="@color/white"> 

     <TextView 
      android:id="@+id/txt_count" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:textColor="@color/text_grey" 
      android:gravity="center" 
      android:textSize="12sp" 
      android:padding="2dp" 
      /> 

     <TextView 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:textColor="@color/text_grey" 
      android:text="AVAILABLE" 
      android:layout_marginLeft="10dp" 
      android:gravity="center" 
      /> 
    </LinearLayout> 

Ale nadal brak szczęścia nawet po ustawieniu tej samej szerokości i wysokości co 50. Właściwość zachowuje się jak owal.

+0

jeśli "width == height', a następnie Oval powinien być Circle? – Blackbelt

+0

Ale nie dostaję koła. Na przykład, jeśli przekazuję szerokość jako 42 i wysokość jako 23, otrzymuję koło. – Chandru

+0

Wyświetl kod, który używa tej ShapeDrawable. Jaki jest rozmiar widoku, który go używa? – Karakuri

Odpowiedz

1

Daj samą wysokość i szerokość do listy TextView

<TextView 
      android:id="@+id/txt_count" 
      android:layout_width="50dp" 
      android:layout_height="50dp" 
      android:textColor="@color/text_grey" 
      android:gravity="center" 
      android:textSize="12sp" 
      android:padding="2dp" 
      /> 
+0

whats rodzice "txtCount"? – dhams

+0

Powinieneś nadać tej samej wysokości i szerokości tekstowi – dhams

+0

Dzięki temu zadziałało! Naprawdę pomocne w naprawieniu mojej głupiej pomyłki w xml. Akceptuję to rozwiązanie – Chandru

-3
// Circle 

    Paint paint = new Paint(); 
    paint.setColor(Color.GREEN); 
    paint.setStyle(Paint.Style.STROKE); 
    float x = 50; 
    float y = 50; 
    float radius = 20; 
    canvas.drawCircle(x, y, radius, paint); 
1

Jest zbyt późno, by odpowiedzieć, ale mam nadzieję, że to pomoże kogoś innego. Jeśli chcesz narysować taki okrąg, nie przejmuj się 46.0%, ponieważ jest to tylko widok tekstowy.

enter image description here.

public class Circle extends View { 

private Paint mCircleYellow; 
private Paint mCircleGray; 

private float mRadius; 
private RectF mArcBounds = new RectF(); 

public Circle(Context context) { 
    super(context); 

    // create the Paint and set its color 

} 

public Circle(Context context, AttributeSet attrs, int defStyleAttr) { 
    super(context, attrs, defStyleAttr); 

    initPaints(); 
} 

public Circle(Context context, AttributeSet attrs) { 
    this(context, attrs, 0); 
} 

private void initPaints() { 
    mCircleYellow = new Paint(Paint.ANTI_ALIAS_FLAG); 
    mCircleYellow.setStyle(Paint.Style.FILL); 
    mCircleYellow.setColor(Color.YELLOW); 
    mCircleYellow.setStyle(Paint.Style.STROKE); 
    mCircleYellow.setStrokeWidth(15 * getResources().getDisplayMetrics().density); 
    mCircleYellow.setStrokeCap(Paint.Cap.SQUARE); 
    // mEyeAndMouthPaint.setColor(getResources().getColor(R.color.colorAccent)); 
    mCircleYellow.setColor(Color.parseColor("#F9A61A")); 

    mCircleGray = new Paint(Paint.ANTI_ALIAS_FLAG); 
    mCircleGray.setStyle(Paint.Style.FILL); 
    mCircleGray.setColor(Color.GRAY); 
    mCircleGray.setStyle(Paint.Style.STROKE); 
    mCircleGray.setStrokeWidth(15 * getResources().getDisplayMetrics().density); 
    mCircleGray.setStrokeCap(Paint.Cap.SQUARE); 
    // mEyeAndMouthPaint.setColor(getResources().getColor(R.color.colorAccent)); 
    mCircleGray.setColor(Color.parseColor("#76787a")); 

} 

@Override 
protected void onSizeChanged(int w, int h, int oldw, int oldh) { 
    super.onSizeChanged(w, h, oldw, oldh); 

    mRadius = Math.min(w, h)/2f; 

} 

@Override 
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 
    super.onMeasure(widthMeasureSpec, heightMeasureSpec); 

    int w = MeasureSpec.getSize(widthMeasureSpec); 
    int h = MeasureSpec.getSize(heightMeasureSpec); 

    int size = Math.min(w, h); 
    setMeasuredDimension(size, size); 
} 

@Override 
protected void onDraw(Canvas canvas) { 
    super.onDraw(canvas); 
    Float drawUpto = 46f; 


    float mouthInset = mRadius/3f; 
    mArcBounds.set(mouthInset, mouthInset, mRadius * 2 - mouthInset, mRadius * 2 - mouthInset); 
    canvas.drawArc(mArcBounds, 0f, 360f, false, mCircleGray); 

    canvas.drawArc(mArcBounds, 270f, drawUpto, false, mCircleYellow); 


} 

}

więc użyć tej klasy w pliku xml, ponieważ jest to klasa widok.

Powiązane problemy