自定义View(环形下载,球形下载)

本文介绍了一种环形进度条和球形进度条的实现方式,使用Android自定义View绘制两种不同样式的进度条,并通过Handler更新进度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

效果图:

这里写图片描述

代码:

这里的layout就不写了,注意view要写全称,包名类名都要写

环形下载:

MyArc

package com.example.administrator.mywidgetmode.Progress;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.RectF;
import android.util.AttributeSet;
import android.util.Log;
import android.view.View;
import java.text.SimpleDateFormat;
import java.util.Date;

import android.annotation.SuppressLint;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Paint.Align;
import android.graphics.Paint.Style;
import android.graphics.Rect;
import android.graphics.RectF;
import android.util.AttributeSet;
import android.view.View;

/**
 * Created by Administrator on 2015/9/16.
 */
public class MyArc extends View {
    private int width;
    private int height;
    private int currentProgress;
    private Paint mPaintBackGround;
    private Paint mPaintCurrent;
    private Paint mPaintText;
    private int maxProgress=100;
    //得到进度的最大值
    public int getMaxProgress() {
        return maxProgress;
    }
    //设置进度的最大值
    public void setMaxProgress(int maxProgress) {
        this.maxProgress = maxProgress;
    }
    //得到当前的进度值
    public int getCurrentProgress(){
        return currentProgress;
    }
    //设置当前的进度值
    public void setCurrentProgress(int currentProgress){
        this.currentProgress=currentProgress;
        invalidate();//刷新
    }
    public MyArc(Context context) {
        super(context);
    }

    public MyArc(Context context, AttributeSet attrs) {
        super(context, attrs);
        mPaintBackGround=new Paint();
        mPaintBackGround.setColor(Color.CYAN);
        mPaintBackGround.setAntiAlias(true);//消除锯齿

        mPaintCurrent=new Paint();
        mPaintCurrent.setColor(Color.GREEN);
        mPaintCurrent.setAntiAlias(true);
        mPaintCurrent.setStyle(Paint.Style.STROKE);
        mPaintCurrent.setStrokeWidth(20);

        mPaintText=new Paint();
        mPaintText.setColor(Color.BLACK);
        mPaintText.setTextSize(40);
        mPaintText.setTextAlign(Paint.Align.CENTER);

    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        width=getDefaultSize(getSuggestedMinimumWidth(),widthMeasureSpec);
        height=getDefaultSize(getSuggestedMinimumHeight(),heightMeasureSpec);
        setMeasuredDimension(width,height);//设置画布的大小,长和宽
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        canvas.drawColor(Color.GRAY);//设置画布颜色
        RectF oval=new RectF(); //RectF对象
        oval.left=width/4; //左边
        oval.top=width/4; //上边
        oval.right=width/4*3; //右边
        oval.bottom=width/4*3; //下边
        canvas.drawArc(oval,225, 360*currentProgress/maxProgress,false,mPaintCurrent);
        canvas.drawText(currentProgress+"%",width/2,width/2,mPaintText);
    }
}

MyArcActivity

package com.example.administrator.mywidgetmode.Progress;

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;

import com.example.administrator.mywidgetmode.R;

/**
 * Created by Administrator on 2015/9/16.
 */
public class MyArcActivity extends AppCompatActivity{
    private MyArc myArc;
    private static final int PROGRESS=0x23;
    private Button mBtStart;
    private int progress;
    private Handler handler=new Handler(){
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            switch (msg.what){
                case PROGRESS:
                    progress++;
                    if(progress<=100){
                        myArc.setCurrentProgress(progress);
                        handler.sendEmptyMessageDelayed(PROGRESS,200);
                    }
                    break;
            }
        }
    };
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_arc);
        myArc= (MyArc) findViewById(R.id.arc);
        mBtStart= (Button) findViewById(R.id.button_arc_download);
        mBtStart.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                handler.sendEmptyMessageDelayed(PROGRESS, 1000);
            }
        });
    }
}

球形下载:

MyPathViewTwo

package com.example.administrator.mywidgetmode.PathView;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.PorterDuff;
import android.graphics.PorterDuffXfermode;
import android.os.Handler;
import android.os.Message;
import android.util.AttributeSet;
import android.view.View;

/**
 * Created by Administrator on 2015/9/18.
 */
public class MyPathViewTwo extends View {
    private int width;
    private int height;
    private Paint mPaintText;
    private Paint mPaint;
    private Paint mPaintPoint;
    private Path path;
    private int currentProgress;
    private int maxProgress = 100;
    private int count=0;
    private boolean isAdd=false;
    private int size;
    public static final int NEED_INVALIDATE=0X23;


    private Handler handler=new Handler(){
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            switch (msg.what){
                case NEED_INVALIDATE:
                    count+=5;
                    if(count>80){
                        count=0;
                    }
                    invalidate();//告诉主线程重新绘制
                    handler.sendEmptyMessageDelayed(NEED_INVALIDATE,100);
                    break;
            }

        }
    };
    public int getCurrentProgress() {
        return currentProgress;
    }

    public void setCurrentProgress(int currentProgress) {
        this.currentProgress = currentProgress;
    }
    public MyPathViewTwo(Context context) {
        super(context);
    }

    public MyPathViewTwo(Context context, AttributeSet attrs) {
        super(context, attrs);
        path = new Path();//路径

        //文字画笔
        mPaintText = new Paint();
        mPaintText.setAntiAlias(true);//消除锯齿
        mPaintText.setColor(Color.BLACK);
        mPaintText.setTextSize(50);
        mPaintText.setTextAlign(Paint.Align.CENTER);

        mPaint=new Paint();
        mPaint.setColor(Color.RED);//下半部分
        mPaint.setStyle(Paint.Style.FILL);
        mPaint.setTextSize(50);
        mPaint.setAntiAlias(true);

        mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_ATOP));

        mPaintPoint=new Paint();
        mPaintPoint.setColor(Color.argb(0xFF,0xF8,0xA6,0xA6));//上半部分
        mPaintPoint.setStrokeWidth(10);
        mPaintPoint.setStyle(Paint.Style.FILL);

        handler.sendEmptyMessage(NEED_INVALIDATE);
    }
   private Bitmap mBitmapBubble;
    private Canvas mCanvasBit;
    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        width = getDefaultSize(getSuggestedMinimumWidth(), widthMeasureSpec);
        height = getDefaultSize(getSuggestedMinimumHeight(), heightMeasureSpec);
        setMeasuredDimension(width, height);//设置画布的大小,长和宽

        mBitmapBubble=Bitmap.createBitmap(width,height,Bitmap.Config.ARGB_8888);
        mCanvasBit=new Canvas(mBitmapBubble);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);

        mCanvasBit.drawCircle(300,300,150,mPaintPoint);//圆
        path.reset();//刷新
        path.moveTo(500,450-currentProgress*3);
        path.lineTo(500,500);
        path.lineTo(count,500);
        path.lineTo(count,450-currentProgress*3);
        for(int i=0;i<10;i++){
            path.rQuadTo(20,7,40,0);
            path.rQuadTo(20,-7,40,0);
        }
        path.close();
        mCanvasBit.drawPath(path, mPaint);
        canvas.drawBitmap(mBitmapBubble, 0, 0, null);
        canvas.drawText(currentProgress + "%", 300, 300, mPaintText);
    }
}

MyPathViewTwoActivity

package com.example.administrator.mywidgetmode.PathView;

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;

import com.example.administrator.mywidgetmode.Progress.MyRectangle;
import com.example.administrator.mywidgetmode.R;

/**
 * Created by Administrator on 2015/9/18.
 */
public class MyPathViewTwoActivity extends AppCompatActivity {
    private MyPathViewTwo myPathViewTwo;
    private static final int PROGRESS=0x23;
    private Button mBtStart;
    private int progress;

    private Handler handler=new Handler(){
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            switch (msg.what){
                case PROGRESS:
                    progress++;
                    if(progress<=100){
                        myPathViewTwo.setCurrentProgress(progress);
                        handler.sendEmptyMessageDelayed(PROGRESS,200);
                    }
                    break;
            }
        }
    };
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_pathview_two);
        myPathViewTwo= (MyPathViewTwo) findViewById(R.id.myPathViewTwo);
        mBtStart= (Button) findViewById(R.id.button_myPathViewTwo);
        mBtStart.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                handler.sendEmptyMessageDelayed(PROGRESS,1000);
            }
        });
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值