自定义圆形加载控件,百分比加载--西域黄老板

自定义圆形加载控件,百分比加载,最近在学习一本书<群英传>,讲的真的很不错,但是需要一些基础才能适应这本书,可以快速的让自己从初级工程师步入到中级工程师,这就是一个自己学习后优化的控件,感觉还不错,借鉴下吧.

先上截图
截图1

截图2

package com.example.android_addview;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.RectF;
import android.util.AttributeSet;
import android.view.View;

public class MyYuanView extends View{

    private Context context;

    private int length;//控件的长宽
    private int mCircleXY;//控件的半径
    private float mRadius;//控件的弧角

    private RectF mArcRectF;//绘制弧线指定的外接矩形

    private Paint mCirclePaint;//圆的画笔
    private Paint mArcPaint;//绘制弧线的画笔
    private Paint mTextPaint;//绘制文字的画笔
    private String mShowText;//文字内容
    private int mShowTextSize;//文字长度
    private float mSweepAngle = 0;//圆弧的度数

    protected topbarClickListener mListener;

    public MyYuanView(Context context) {
        super(context);
        this.context = context;
    }
    public MyYuanView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

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

    @Override
    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
        super.onSizeChanged(w, h, oldw, oldh);

        //设置三种图形的参数
        length = getMeasuredWidth();
        mCircleXY = length/2;
        mRadius = (float)(length*0.5/2);

        //绘制弧线,需要指定其椭圆的外接矩形
        mArcRectF = new RectF((float)(length*0.1), (float)(length*0.1), (float)(length*0.9), (float)(length*0.9));

    }

    @Override
    protected void onDraw(Canvas canvas) {

//      mSweepAngle = (float) (Math.random()*360); 

        //绘制弧线
        mArcPaint = new Paint();
        mArcPaint.setColor(0xffd2d2d2);
        canvas.drawArc(mArcRectF,270, mSweepAngle, true, mArcPaint);//SweepAngle比例//4个参数的含义 
        //外接矩形
        //绘制点的起始位置270是正上方
        //绘制的角度
        //是否连接圆心
        //画笔工具

        //绘制圆形
        mCirclePaint = new Paint();
        mCirclePaint.setColor(0xff9c9c9c);
        canvas.drawCircle(mCircleXY, mCircleXY, mRadius, mCirclePaint);


        //绘制文字
        mTextPaint = new Paint();
        mTextPaint.setColor(0xff000000);
        mTextPaint.setTextAlign(Paint.Align.CENTER);
        mTextPaint.setTextSize(30);
        mShowText = (int)(mSweepAngle/360*100)+"%";
        mShowTextSize = 50;
        canvas.drawText(mShowText, 0, mShowText.length(),mCircleXY,mCircleXY+(mShowTextSize/4), mTextPaint);

        super.onDraw(canvas);
//      invalidate();

        if(mSweepAngle>360){
            mListener.Toasttt();
        }else{
            postInvalidateDelayed(5);
        }

        mSweepAngle +=1 ;

    }

    public interface topbarClickListener{
        //左按钮点击事件
        void Toasttt();
    }

    public void setOnTopBarClickListener(topbarClickListener mListener){
        this.mListener = mListener;
    }


}

//加载成功后回调

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        MyYuanView myyuanview = (MyYuanView) findViewById(R.id.myyuanview);
        myyuanview.setOnTopBarClickListener(new topbarClickListener() {
            @Override
            public void Toasttt() {
                Toast.makeText(MainActivity.this, "结束了", 0).show();
            }
        });

    }

}

//布局引用

<LinearLayout 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"
    android:orientation="horizontal" >

    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:orientation="vertical" >

        <com.example.android_addview.MyYuanView
            android:id="@+id/myyuanview"
            android:layout_width="300dp"
            android:layout_height="300dp" >
        </com.example.android_addview.MyYuanView>


    </LinearLayout>



</LinearLayout>

我是安卓一年新人,请大家支持.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值