一:布局
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="activity.example.com.baikaijun20171104.MainActivity">
<activity.example.com.baikaijun20171104.view.MainView
android:id="@+id/mainview"
android:layout_below="@id/title"
android:layout_width="match_parent"
android:layout_height="wrap_content">
</activity.example.com.baikaijun20171104.view.MainView>
<Button
android:id="@+id/btn_sm"
android:layout_width="200dp"
android:layout_height="wrap_content"
android:text="扫描二维码"
android:background="#78d21d"
android:textColor="#de2514"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true"
android:layout_marginBottom="107dp" />
</RelativeLayout>
二:创建MainView类继承view
public class MainView extends View {
private ProgressUpdateListener listener;
public interface ProgressUpdateListener {
void onProgressUpdated(int progress);
}
public void setListener(ProgressUpdateListener listener) {
this.listener = listener;
}
private int progress = 0;
public int getProgress() {
return progress;
}
public void setProgress(int progress) {
this.progress = progress;
postInvalidate();
if (listener != null) {
listener.onProgressUpdated(progress);
}
}
public MainView(Context context) {
this(context,null);
}
public MainView(Context context, @Nullable AttributeSet attrs) {
this(context, attrs,0);
}
public MainView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@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.BLACK);
paint.setAntiAlias(true);//消除锯齿
paint.setStyle(Paint.Style.STROKE);
canvas.drawCircle(radius, radius, radius, paint);
// 画扇形
paint.reset();
paint.setStyle(Paint.Style.STROKE);
paint.setStrokeWidth(20);
paint.setColor(Color.GREEN);
RectF rectF = new RectF();
paint.setAntiAlias(true);//消除锯齿
rectF.set(10, 10, react-10, react-10);
canvas.drawArc(rectF, -90, progress*360/100, true, paint);
// 画内层的小圆
paint.reset();
paint.setColor(Color.WHITE);
paint.setAntiAlias(true);//消除锯齿
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);
}
}
三:代码操作进度条
public class MainActivity extends AppCompatActivity {
private MainView mainview;
private Button btn_sm;
Handler handler = new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
if (msg.what == 1) {
int progress = mainview.getProgress();
progress += 10;
if(progress > 100){
progress=0;
}
mainview.setProgress(progress);
handler.sendEmptyMessageDelayed(1, 1000);
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mainview = (MainView)findViewById(R.id.mainview);
btn_sm = (Button)findViewById(R.id.btn_sm);
btn_sm.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
handler.sendEmptyMessageDelayed(1,0);
}
});
mainview.setListener(new MainView.ProgressUpdateListener() {
@Override
public void onProgressUpdated(int progress) {
if (progress >= 100) {
Intent intent = new Intent(MainActivity.this, CaptureActivity.class);
startActivityForResult(intent,1);
}
}
});
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == 1) {
//处理扫描结果(在界面上显示)
if (null != data) {
Bundle bundle = data.getExtras();
if (bundle == null) {
return;
}
if (bundle.getInt(CodeUtils.RESULT_TYPE) == CodeUtils.RESULT_SUCCESS) {
String result = bundle.getString(CodeUtils.RESULT_STRING);
Toast.makeText(this, "解析结果:" + result, Toast.LENGTH_LONG).show();
} else if (bundle.getInt(CodeUtils.RESULT_TYPE) == CodeUtils.RESULT_FAILED) {
Toast.makeText(MainActivity.this, "解析二维码失败", Toast.LENGTH_LONG).show();
}
}
}
}
@Override
protected void onStop() {
super.onStop();
handler.removeMessages(1);
}
}