(安卓) 自定义View 绘画圆(包括简单的接口回调)
上图:
这道题主要是 当点击Button按钮的时候 开始走进度条 ,当进度条走到100时 跳转到第二个页面
上代码:
xml类:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout 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" android:orientation="vertical" tools:context="bawe.day1105lianximoni.MainActivity"> <bawe.day1105lianximoni.ProgressView android:layout_width="400dp" android:layout_height="200dp" android:id="@+id/pv_data" /> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:text="点击我" android:id="@+id/bt_one" /> </LinearLayout>
MainActivity 类:
package bawe.day1105lianximoni; import android.content.Intent; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.support.v7.app.AppCompatActivity; import android.view.View; import android.widget.Button; public class MainActivity extends AppCompatActivity { private Button bt_one; 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); //指定在同一个频道 FLAG handler.sendEmptyMessageDelayed(FLAG, 1000); break; } } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); bt_one = (Button) findViewById(R.id.bt_one); pv = (ProgressView) findViewById(R.id.pv_data); bt_one.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { handler.sendEmptyMessageDelayed(FLAG, 1000); } }); //接口的方法 pv.setListener(new ProgressView.ProhressUpdateListener() { @Override public void onProgressUpdated(int progress) { //如果当前的进度等于100 if (progress>=100){ //就进行跳转 startActivity(new Intent(MainActivity.this,Main2Activity.class)); } } }); } =============================================================================
ProgressView类:
package bawe.day1105lianximoni; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.Rect; import android.support.annotation.Nullable; import android.util.AttributeSet; import android.view.View; import static android.R.attr.radius; /** * Created by 迷人的脚毛!! on 2017/11/5. */ public class ProgressView extends View{ //接口对象 private ProhressUpdateListener listener; //定义一个接口 interface ProhressUpdateListener{ void onProgressUpdated(int progress); } //对外提供一个set方法 public void setListener(ProhressUpdateListener listener) { this.listener = listener; } //设置角度为0 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); } //Progress get和set方法 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 min = Math.min(width, height); //半径 int i = min / 2; //绘制外层最大的圆 Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG); paint.setColor(Color.BLUE); paint.setStyle(Paint.Style.STROKE); canvas.drawCircle(i,i,i,paint); //重置 paint.reset(); paint.setStyle(Paint.Style.STROKE); paint.setColor(Color.RED); //设置图形的边框厚度 paint.setStrokeWidth(20); //绘画扇形 canvas.drawArc(10, 10, min-10, min-10, -90, progress*360/100, true, paint); //重置 paint.reset(); //设置颜色 paint.setColor(Color.WHITE); //设置实心 paint.setStyle(Paint.Style.FILL_AND_STROKE); canvas.drawCircle(i,i,i-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 + "", i-textWidth/2, i-textHeight/2, paint); } }
这个代码里面包裹了绘圆,绘画扇形, 绘画进度文字