自定義View圓形進度條帶跳轉頁面
阿新 • • 發佈:2019-02-09
MainActivity:
public class MainActivity extends AppCompatActivity { private Button btnAdd; private ProgressView pv; private static final int FLAG = 0x123; private Handler handler = new Handler() { @Override public void handleMessage(Message msg) { super.handleMessage(msg); switch (msg.what) { case FLAG: int progress = pv.getProgress(); progress += 10; if (progress > 100) { progress = 0; } pv.setProgress(progress); handler.sendEmptyMessageDelayed(FLAG, 1000); break; } } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); btnAdd = (Button) findViewById(R.id.btn_add); pv = (ProgressView) findViewById(R.id.pv_data); btnAdd.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // int progress = pv.getProgress(); // progress += 30; // pv.setProgress(progress); handler.sendEmptyMessageDelayed(FLAG, 1000); } }); pv.setListener(new ProgressView.ProgressUpdateListener(){ @Override public void onProgressUpdated(int progress) { if (progress >= 100) { // handler.remove; startActivity(new Intent(MainActivity.this, ScanActivity.class)); } } }); } @Override protected void onStop() { super.onStop(); handler.removeMessages(FLAG); } }
自定義View:
public class ProgressView extends View { private ProgressUpdateListener listener; interface ProgressUpdateListener { void onProgressUpdated(int progress); } public void setListener(ProgressUpdateListener listener) { this.listener = listener; } private int progress = 0; public ProgressView(Context context) { super(context); } public ProgressView(Context context, @Nullable AttributeSet attrs) { super(context, attrs); } public ProgressView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } public int getProgress() { return progress; } public void setProgress(int progress) { this.progress = progress; postInvalidate(); if (listener != null) { listener.onProgressUpdated(progress); } } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); int width = getWidth(); int height = getHeight(); // 繪圖範圍 int react = Math.min(width, height); // 半徑 int radius = react / 2; // 繪製最外層的大圓 Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG); paint.setColor(Color.GREEN); paint.setStyle(Paint.Style.STROKE); canvas.drawCircle(radius, radius, radius, paint); paint.reset(); paint.setStyle(Paint.Style.STROKE); paint.setStrokeWidth(20); paint.setColor(Color.RED); // 畫扇形 canvas.drawArc(10, 10, react-10, react-10, -90, progress*360/100, true, paint); // 畫內層的小圓 paint.reset(); paint.setColor(Color.WHITE); paint.setStyle(Paint.Style.FILL_AND_STROKE); canvas.drawCircle(radius, radius, radius - 20, paint); // 畫進度文字 paint.reset(); paint.setColor(Color.BLUE); paint.setTextSize(40); Rect rect = new Rect(); paint.getTextBounds(progress + "", 0, String.valueOf(progress).length(), rect); int textWidth = rect.width(); int textHeight = rect.height(); canvas.drawText(progress + "", radius-textWidth/2, radius-textHeight/2, paint); } }