使用Android来画一个钟表

今天我们来画一个Android钟表,只不过没有美化,看起来有点粗糙.....

功能实现就好啦

效果图:

15349277624781534927752516.gif

//-------------------------------------具体思路

我们首先使用canvas.drawOval来画一个圆

计算圆的中心,记住圆的中心等于 x:宽/2 y:高/2

如果有移位的加上移位就能计算出圆的中心点

核心的系统方法:canvas.drawOval,canvas.drawLine,canvas.rotate,

canvas.rotate使用方式
canvas.rotate(角度,以哪个X坐标旋转,以哪个Y坐标旋转)

全部代码:


/**
 * 一个自定义钟表
 */

public class XHView extends View {

    //新的圆宽

    private int sizeW;

    private int sizeH;

    private String[] timeString = {"12", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11"};

    private Context mContext;
    private RectF rectF;
    private Paint mPaint;
    private Paint mTextPaint;
    //缩放距离
    private int sc = 20;
    //线的长度
    private int lineW = 40;

    //秒表最长
    private int lineS = 360;
    private Paint mPaintS;
    //分钟
    private int lineM = 260;
    private Paint mPaintM;
    //时钟
    private int lineH = 220;
    private Paint mPaintH;
    private int drawH;
    private int drawM;
    private int drawS;

    public XHView(Context context) {
        super(context);
        initData(context);
    }

    public XHView(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
        initData(context);
    }

    public XHView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        initData(context);
    }

    private void initData(Context mContext) {
        this.mContext = mContext;
        mPaint = new Paint();
        mPaint.setStyle(Paint.Style.STROKE);
        mPaint.setColor(Color.parseColor("#ad0015"));
        mPaint.setAntiAlias(true);
        mPaint.setStrokeWidth(5);
        //初始化
        mTextPaint = new Paint();
        mTextPaint.setTextSize(40);
        mTextPaint.setAntiAlias(true);

        mPaintS = new Paint();
        mPaintS.setStrokeWidth(20);
        mPaintM = new Paint();
        mPaintM.setColor(Color.parseColor("#c40302"));
        mPaintM.setStrokeWidth(5);
        mPaintM.setAntiAlias(true);
        mPaintH = new Paint();
        mPaintH.setColor(Color.parseColor("#a59632"));
        mPaintH.setStrokeWidth(5);
        mPaintH.setAntiAlias(true);
        mPaintS.setAntiAlias(true);
    }

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

    @Override
    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
        super.onSizeChanged(w, h, oldw, oldh);
        sizeW = w;
        sizeH = h;
        initW2H();
        invalidate();
        startTime();
    }


    //初始化宽高

    private void initW2H() {

        rectF = new RectF();
        rectF.left = sc;
        rectF.right = sizeW - sc;
        rectF.top = sc;
        rectF.bottom = sizeW - sc;


    }

    //开始画圆/表的刻度

    private void startDarwOR(Canvas canvas) {
        canvas.drawOval(rectF, mPaint);
        //开始画刻度表
        for (int i = 0; i < 60; i++) {
            if (i % 5 == 0) {
                //为时间段
                lineW = 40;
            } else {
                //为分钟段
                lineW = 20;
            }
            if (lineW == 40) {
                //画字
                canvas.drawText(timeString[i / 5], ((rectF.bottom / 2) + (sc / 2)), sc + lineW + 40/*加上字体大小*/, mTextPaint);
            }

            canvas.drawLine((rectF.right / 2) + (sc / 2), sc, (rectF.right / 2) + (sc / 2), sc + lineW, mPaint);
            canvas.rotate(360 / 60, (rectF.right / 2) + (sc / 2), (rectF.bottom / 2) + (sc / 2));

            canvas.drawOval((rectF.right / 2) + (sc / 2) - 10, (rectF.bottom / 2) + (sc / 2) - 10, (rectF.right / 2) + (sc / 2) + 10, (rectF.bottom / 2) + (sc / 2) + 10, mPaintS);

        }
    }

    //开始画秒钟/分钟/时钟

    private void startDrawSMH(Canvas canvas) {
        canvas.save();
        canvas.rotate(drawH, (rectF.right / 2) + (sc / 2), (rectF.bottom / 2) + (sc / 2));
        canvas.drawLine((rectF.right / 2) + (sc / 2), (rectF.bottom / 2) + (sc / 2) + 50, (rectF.right / 2) + (sc / 2), (rectF.bottom / 2) + (sc / 2) - lineH, mPaintH);
        canvas.restore();

        canvas.save();
        canvas.rotate(drawM, (rectF.right / 2) + (sc / 2), (rectF.bottom / 2) + (sc / 2));
        canvas.drawLine((rectF.right / 2) + (sc / 2), (rectF.bottom / 2) + (sc / 2) + 50, (rectF.right / 2) + (sc / 2), (rectF.bottom / 2) + (sc / 2) - lineM, mPaintM);
        canvas.restore();

        canvas.save();
        canvas.rotate(drawS, (rectF.right / 2) + (sc / 2), (rectF.bottom / 2) + (sc / 2));
        canvas.drawLine((rectF.right / 2) + (sc / 2), (rectF.bottom / 2) + (sc / 2) + 50, (rectF.right / 2) + (sc / 2), (rectF.bottom / 2) + (sc / 2) - lineS, mPaint);
        canvas.restore();

        canvas.drawText(time, ((rectF.right / 2) + (sc / 2)), (rectF.bottom / 4) + (sc / 2), mTextPaint);


    }
    //开始处理时间逻辑

    //开始处理角度

    //秒旋转角度
    private int angle = 6;
    //分旋转角度
    private int angleM = 6;
    //时旋转角度
    private int angleH = 6;

    private String time = "00:00:00";

    private void startTime() {

        //该逻辑处理放到子线程中
        final SimpleDateFormat simpleDateFormat = new SimpleDateFormat("HH:mm:ss");

        new Thread(new Runnable() {
            @Override
            public void run() {

                //死循环,如果有需要的同学请更改此逻辑

                while (true) {
                    //获取时间

                    Date date = new Date();
                    String format = simpleDateFormat.format(date);
                    final String[] split = format.split(":");

                    time = format;
                    if (angle > 360) {
                        angle = 6;
                    }
                    if (angleM > 360) {
                        angleM = 6;
                    }
                    if (angleH > 360) {
                        angleH = 6;
                    }

                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    MainActivity.handler.post(new Runnable() {
                        @Override
                        public void run() {
                            invalidate();
                            int h = Integer.parseInt(split[0]);
                            int m = Integer.parseInt(split[1]);
                            int s = Integer.parseInt(split[2]);
                            drawH = angle * h;
                            drawM = angleM * m;
                            drawS = angleH * s;
                        }
                    });
                }


            }
        }).start();


    }


}
![15349277624781534927752516.gif](https://upload-images.jianshu.io/upload_images/5337239-a86b67c1b18a8d41.gif?imageMogr2/auto-orient/strip)



github:https://github.com/hanxinhao000/Clocks

15349277624781534927752516.gif
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,335评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,895评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,766评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,918评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,042评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,169评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,219评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,976评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,393评论 1 304
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,711评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,876评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,562评论 4 336
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,193评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,903评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,142评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,699评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,764评论 2 351