自定义view画带有进度条的圆

来源:互联网 发布:mac系统word画流程图 编辑:程序博客网 时间:2024/05/16 09:20
ShanXing 类
public class ShanXing extends View {  
  private int progress = 0;   
  private ProgressUpdateListener listener;   
  interface  ProgressUpdateListener {     
   void onProgressUpdated(int progress);   
 }   
 public void setListener(ProgressUpdateListener listener) {    
    this.listener = listener;   
 }   
 public ShanXing(Context context) {    
           super(context);   
 }   
 public ShanXing(Context context, AttributeSet attrs) {    
         super(context, attrs);  
  }  
  public ShanXing(Context context, AttributeSet attrs, int defStyleAttr) {      
           super(context, attrs, defStyleAttr);   
 }  
  @Override   
 protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {    
          super.onMeasure(widthMeasureSpec, heightMeasureSpec);  
  }   
 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(new RectF(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);  
  }   
 @Override  
  protected void onLayout(boolean changed, int left, int top, int right, int bottom) {   
     super.onLayout(changed, left, top, right, bottom);  
  }    
@Override    
public boolean onTouchEvent(MotionEvent event) {     
   return super.onTouchEvent(event);   
 }
}
主类
public class MainActivity extends AppCompatActivity {  private ShanXing shanXing;    private Button btn;    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 = shanXing.getProgress();                    progress += 10;                    if (progress > 100) {                        progress = 0;                    }                    shanXing.setProgress(progress);                    handler.sendEmptyMessageDelayed(FLAG, 1000);                    break;            }        }    };    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        btn = (Button) findViewById(R.id.btn);        shanXing = (ShanXing) findViewById(R.id.shan);        btn.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View view) {                handler.sendEmptyMessageDelayed(FLAG, 1000);            }        });        shanXing.setListener(new ShanXing.ProgressUpdateListener(){            @Override            public void onProgressUpdated(int progress) {                if (progress >= 100) {//                    handler.remove;                    //跳转                    /*startActivity(new Intent(MainActivity.this, ScanActivity.class));*/                    Toast.makeText(MainActivity.this,"完成",Toast.LENGTH_SHORT).show();                }            }        });    }    @Override    protected void onStop() {        super.onStop();        handler.removeMessages(FLAG);    }}
<test.bwie.com.shanxing.ShanXing    android:id="@+id/shan"    android:layout_width="match_parent"    android:layout_height="80dp" />    <Button        android:id="@+id/btn"        android:layout_width="match_parent"        android:layout_height="30dp" />
布局
 
原创粉丝点击