android canvas uses line to draw a semicircle

  • 2021-11-24 02:44:56
  • OfStack

In this paper, we share the specific code of android canvas using line to draw semicircles for your reference. The specific contents are as follows

LineView.java


public class LineView extends View {
  private int progress = 0;
  private int max = 100;
  private int roundWidth = 50;
  public LineView(Context context) {
    super(context);
  }

  public LineView(Context context, AttributeSet attrs) {
    super(context, attrs);
  }

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

  public void setProgress(int progress) {
    this.progress = progress;
    invalidate();
  }

  @Override
  protected void onDraw(Canvas canvas) {

    Paint paint = new Paint();
    paint.setAntiAlias(true);
    paint.setColor(Color.RED);

    paint.setStrokeWidth(roundWidth);
    paint.setStyle(Paint.Style.STROKE);

    canvas.drawCircle(getWidth() / 2, getHeight() / 2, 200, paint);

    paint.setStyle(Paint.Style.FILL);
    paint.setStrokeWidth(10);
    paint.setColor(Color.BLUE);
    int startX = 0, startY = 0, stopX = 0, stopY = 0;

    startX=0;
    stopX=500;
    for (int i = 0; i <= progress; i++) {
      startY = stopY = getHeight()/2+200-roundWidth/2 - i*(400-roundWidth)/max;
      double v = Math.pow((200 - roundWidth / 2), 2) - (Math.pow((startY-getHeight()/2), 2));
      startX = (int)(getWidth()/2-Math.sqrt(v));
      stopX = (int)(getWidth()/2+Math.sqrt(v));
      canvas.drawLine(startX, startY, stopX, stopY, paint);
    }
  }
}

MainActivity.java


public class MainActivity extends Activity {

  private LineView lv;

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    lv = (LineView)findViewById(R.id.lv);

    lv.setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View v) {
        lv.setEnabled(false);


        new Thread() {
          @Override
          public void run() {
            for (int i = 0; i <= 100; i++) {

              final int finalI = i;
              runOnUiThread(new Runnable() {
                @Override
                public void run() {
                  lv.setProgress(finalI);
                }
              });
              try {
                sleep(10);
              } catch (InterruptedException e) {
                e.printStackTrace();
              }
            }

            runOnUiThread(new Runnable() {
              @Override
              public void run() {
                lv.setEnabled(true);
              }
            });
          }
        }.start();

      }
    });
  }
}

activity_main.xml


<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:tools="http://schemas.android.com/tools"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  >

   <com.xhly.sdv.lineview.view.LineView
    android:id="@+id/lv"
    android:layout_width="300dp"
    android:layout_height="300dp"
    android:layout_centerInParent="true"
    />

</RelativeLayout>

Related articles: