android 时钟进度加载器

本文介绍如何自写控件实现时钟加载View,包括画时钟盘、画刻度、画时针并动态旋转,以及对外开放接口控制线程结束。

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

接触过很多等待加载的View,今天就给大家介绍自写控件实现时钟加载View,不多说废话,开始。

一、实现思路:

1:画时钟盘,获取View大小适配圆心和半径。
2:画刻度,通过旋转画布15度来分别画出刻度线。
3:画时针,旋转画布角度来实现,并通过线程死循环来改变旋转角 度,更新画布,从而动态旋转。
4:对外开放接口控制线程结束。

二、程序运行如下图:

这里写图片描述

三、主要代码(ClockLoaderView 类):

package com.tielizi.clockloaderview;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.util.Log;
import android.view.View;

/**
 * Created by Administrator on 2015/10/15.
 */
public class ClockLoaderView extends View {

    private Paint paint;
    private float width,height;
    private float radius;//时钟半径
    private float centerX,centerY;//时钟圆心坐标
    private float paintBaseWidth;//画笔基本粗细
    private int angleLong,angleShort = 0;//长短指针
    private boolean isKill;//控制线程结束
    private int speed;//指针旋转速度

    public ClockLoaderView(Context context) {
        super(context);
        init();
    }

    public ClockLoaderView(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }

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

//    public ClockLoaderView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
//        super(context, attrs, defStyleAttr, defStyleRes);
//    }


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

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {//根据View大小适配参数
        width = getWidth();
        height = getHeight();
        radius = width/4;
        centerX = width/2;
        centerY = height/2;
        paintBaseWidth = width/200;
        angleLong = 0;
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    }

    private void init(){
        isKill = false;
        speed = 1;
        paint = new Paint();
        paint.setStyle(Paint.Style.STROKE);
        paint.setAntiAlias(true);
        new Thread(new Runnable() {//线程控制canvas旋转角度
            @Override
            public void run() {
                while (!isKill){
                    try {
                        Thread.sleep(1);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    angleLong+=speed;
                    if(angleLong%360==0){
                        angleLong = 0;
                        angleShort += 15;
                    }
                    Log.i("px",""+angleLong);
                    postInvalidate();
                }
            }
        }).start();
    }

    private void drawCircle(Canvas canvas){//画时钟圈
        paint.setColor(Color.BLACK);
        paint.setStrokeWidth(paintBaseWidth * 2);
        canvas.drawCircle(centerX, centerY, radius, paint);
        paint.setStyle(Paint.Style.FILL);
        for(int i = 0; i < 24 ; i++){
            if(i == 0 || i == 6 || i == 12 || i == 18 || i == 24){
                paint.setStrokeWidth(paintBaseWidth*2);
                canvas.drawLine(centerX,centerY-radius,centerX,centerY-radius+width/20,paint);
            }else{
                paint.setStrokeWidth(paintBaseWidth);
                canvas.drawLine(centerX, centerY - radius, centerX, centerY - radius + width/30,paint);
            }
            canvas.rotate(15,centerX,centerY);//旋转画布
        }
    }

    private void drawPointer(Canvas canvas){//画时针
        paint.setStrokeWidth(paintBaseWidth * 5);
        paint.setColor(Color.BLACK);
        canvas.drawPoint(centerX, centerY, paint);
        paint.setColor(Color.BLUE);
        paint.setStrokeWidth(paintBaseWidth * 3);
        canvas.rotate(angleShort, centerX, centerY);
        canvas.drawLine(centerX, centerY, centerX, centerY - radius / 3, paint);
        canvas.rotate(angleLong, centerX, centerY);
        paint.setStrokeWidth(paintBaseWidth * 2);
        paint.setColor(Color.GREEN);
        canvas.drawLine(centerX, centerY, centerX, centerY - radius / 2, paint);
        paint.setStyle(Paint.Style.STROKE);
    }

    public void killThread(){//结束线程
        isKill = true;
    }

    public void setSpeed(int speed){//对外开放设置时针速度接口
        this.speed = speed;
    }

}

好了就这些。

时钟加载源码下载

更多相关博客
模仿搜狗加载小球

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值