Android 自定义钟表 表盘 机械表

最近有点时间, 突然想起以前面试的时候, 好多问过有没有写过自定义控件, 问的让我很懵逼, 说做过吧, 但好像极少特意自定义, 但说没有吧, 又觉得委屈了自己, 明明以前写过....  最后一问, 做过自定义钟表吗? 就这? 好吧, 貌似我把他们要问的内容想复杂了...

随手写一个自定义钟表, 还有蚊香圈哦...  蚊香圈很好玩.

对了, 特别讨厌那种让你背代码的面试....面试某车新能源服务公司的时候, 竟然让背代码, TMD, 这什么玩意儿....

                              

上代码:

项目代码,  下载地址 :   https://download.csdn.net/download/x531305158/12689327

自定义表盘, 其实很简单, 就是表盘刻度, 相当于在两个同心圆中, 根据三角函数, 确定起始位置和结束位置, 根据Path确定路径来画.

//代码下载地址 :  https://download.csdn.net/download/x531305158/12689327

private void initTimerDis(Canvas canvas) {
        int sourceBR = centerX - 40;
        int sourceSR = sourceBR - 20;

        int tempBR = sourceBR + 10;
        int tempSR = sourceSR - 10;

        int bR;
        int sR;
        mPaint.setStyle(Paint.Style.STROKE);

        for (int i = 0; i <= 59; i++) {
            int angle = 360 / 60 * i;

            if ((i + 1) % 5 == 1) {
                bR = tempBR;
                sR = tempSR;
                mPaint.setStrokeWidth(12);
                mPaint.setColor(Color.BLACK);
            } else {
                bR = sourceBR;
                sR = sourceSR;
                mPaint.setStrokeWidth(5);
                mPaint.setColor(Color.BLUE);
            }

            float y = (float) (centerY - bR * Math.cos(angle * Math.PI / 180));
            float x = (float) (centerX + bR * Math.sin(angle * Math.PI / 180));

            float sy = (float) (centerY - sR * Math.cos(angle * Math.PI / 180));
            float sx = (float) (centerX + sR * Math.sin(angle * Math.PI / 180));

//            Log.i("Test", "cos : " + Math.cos(angle) + "  sin : " + Math.sin(angle));
//            Log.i("Test", "sx : " + sx + ", sy : " + sy + ", x : " + x + ", y : " + y + "  --> angle : " + angle + "  br : " + bR + " centerX : " + centerX + " centerY : " + centerY);

            mPath.moveTo(sx, sy);
            mPath.lineTo(x, y);
            canvas.drawPath(mPath, mPaint);
            mPath.reset();
        }

        mPaint.setColor(Color.RED);
        mPaint.setStyle(Paint.Style.FILL);
        canvas.drawCircle(centerX, centerY, 30, mPaint);

        mPaint.setColor(Color.BLACK);
        mPaint.setStyle(Paint.Style.FILL);
        canvas.drawCircle(centerX, centerY, 10, mPaint);
    }

2. 时分秒指针

这就更简单, 唯计算尔.

//代码下载地址 :  https://download.csdn.net/download/x531305158/12689327

private void refreshTime(Canvas canvas) {
        String timeStr = DateUtils.getFormatTime(System.currentTimeMillis());
        Log.i("Test", "timeStr : " + timeStr);
        String[] array       = timeStr.split(":");
        int      hour        = Integer.parseInt(array[0]) % 12;
        int      mini        = Integer.parseInt(array[1]);
        int      second      = Integer.parseInt(array[2]);
        int      millis      = Integer.parseInt(array[3]);
        float    hourAngel   = (float) (360 / 12 * hour + 360 / 12 * (mini / 60.0));
        float    miniAngel   = (float) (360 / 60 * mini + 360 / 60 * (second / 60.0));
        float    secondAngel = 360 / 60 * second;
        float    millisAngel = secondAngel + (float) (360.0 / 60 / 1000 * millis);
        Log.i("Test", "secondAngel : " + secondAngel + "  millisAngel : " + millisAngel);

        float hourY = (float) (centerY - centerX / 3 * 2 * Math.cos(hourAngel * Math.PI / 180));
        float hourX = (float) (centerX + centerX / 3 * 2 * Math.sin(hourAngel * Math.PI / 180));

        mPaint.setColor(Color.LTGRAY);
        mPaint.setStyle(Paint.Style.STROKE);
        mPaint.setStrokeWidth(8);
        mPath.moveTo(centerX, centerY);
        mPath.lineTo(hourX, hourY);
        canvas.drawPath(mPath, mPaint);
        mPath.reset();


        float miniY = (float) (centerY - centerX / 5 * 4 * Math.cos(miniAngel * Math.PI / 180));
        float miniX = (float) (centerX + centerX / 5 * 4 * Math.sin(miniAngel * Math.PI / 180));

        mPaint.setColor(Color.parseColor("#5C1CB0"));
        mPaint.setStyle(Paint.Style.STROKE);
        mPaint.setStrokeWidth(5);
        mPath.moveTo(centerX, centerY);
        mPath.lineTo(miniX, miniY);
        canvas.drawPath(mPath, mPaint);
        mPath.reset();


        float y = (float) (centerY - centerX * Math.cos(secondAngel * Math.PI / 180));
        float x = (float) (centerX + centerX * Math.sin(secondAngel * Math.PI / 180));

        float sy = (float) (centerY - centerX / 8 * Math.cos((180 + secondAngel) * Math.PI / 180));
        float sx = (float) (centerX + centerX / 8 * Math.sin((180 + secondAngel) * Math.PI / 180));

        mPaint.setColor(Color.RED);
        mPaint.setStyle(Paint.Style.STROKE);
        mPaint.setStrokeWidth(2);
        mPath.moveTo(sx, sy);
        mPath.lineTo(x, y);
        canvas.drawPath(mPath, mPaint);
        mPath.reset();

        if (!mHandler.hasMessages(ACTION_REFRESH_TIME)) {
            mHandler.sendEmptyMessageDelayed(ACTION_REFRESH_TIME, TIME_DELAY);
        }
    }

 

代码直通车 : https://download.csdn.net/download/x531305158/12689327

直接运行就去下载吧. 也给我点积分, 现在实在缺少.

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值