自定義控件--時鐘

先上效果圖
效果圖
效果圖

先繼承View,然后再寫構(gòu)造方法,構(gòu)造方法里初始化畫筆

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


        bigCiclePaint = new Paint();
        bigCiclePaint.setColor(Color.BLUE);
        bigCiclePaint.setStyle(Paint.Style.STROKE);
        bigCiclePaint.setStrokeWidth(34);

        smallCiclePaint = new Paint();
        smallCiclePaint.setColor(Color.RED);
        smallCiclePaint.setStyle(Paint.Style.FILL);

        calibrationPaint = new Paint();
        calibrationPaint.setColor(Color.BLUE);
        calibrationPaint.setStyle(Paint.Style.FILL);
        calibrationPaint.setStrokeWidth(20);

        numPaint = new Paint();
        numPaint.setColor(Color.RED);
        numPaint.setAntiAlias(true);
        numPaint.setTextAlign(Paint.Align.CENTER);
        numPaint.setTextSize(40);

        hourPaint = new Paint();
        hourPaint.setColor(Color.parseColor("#3F51B5"));
        hourPaint.setStrokeWidth(25);

        minutePaint = new Paint();
        minutePaint.setColor(Color.DKGRAY);
        minutePaint.setStrokeWidth(18);

        secondPaint = new Paint();
        secondPaint.setColor(Color.parseColor("#FF4081"));
        secondPaint.setStrokeWidth(11);
    }

解釋:

  • bigCiclePaint:畫大表盤的畫筆
  • smallCiclePaint:畫小圓心的畫筆
  • calibrationPaint:畫12個刻度的畫筆
  • numPaint:畫刻度下的數(shù)字的畫筆
  • hourPaint:小時的畫筆
  • minutePaint:分鐘的畫筆
  • secondPaint:秒針的畫筆

在onDraw方法里面畫

 @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        calendar = Calendar.getInstance();
        int clockWidth = getWidth();
        cX=clockWidth/2;
        cY=clockWidth/2;
        bigRadius=(float) clockWidth/2-75;

        canvas.drawCircle(cX,cY,bigRadius,bigCiclePaint);//畫大表盤
        canvas.drawCircle(cX,cY,30,smallCiclePaint);//畫小圓心

//        canvas.save()方法和canvas.restore()方法都是成對出現(xiàn)的,這一點要注意沮稚。
        for (int i = 1; i <13 ; i++) {
            //在旋轉(zhuǎn)之前保存畫布狀態(tài)
            canvas.save();
            canvas.rotate(i*30,cX,cY);//先畫1點查剖,從1到12
            canvas.drawLine(cX,cY-bigRadius+34/2,cX,cY-bigRadius+34/2+18,calibrationPaint);//畫刻度
            //畫刻度上數(shù)字,第三個參數(shù)表示文字的基準線
            canvas.drawText(i+"",cX,cY-bigRadius+34/2+18+50,numPaint);
            //恢復(fù)畫布狀態(tài)
            canvas.restore();
        }
        //獲得當(dāng)前小時
        int hour = calendar.get(Calendar.HOUR);
        int minute  = calendar.get(Calendar.MINUTE);
        int second  = calendar.get(Calendar.SECOND);
//        Log.d("alan","hour----->"+hour);
//        Log.d("alan","minute--->"+minute);
        Log.d("alan","second--->"+second);
        float hourDegree=((float)minute/60+hour)*30;//畫時針時畫布應(yīng)該旋轉(zhuǎn)的度數(shù)
//        Log.d("alan","(float)minute/60---->"+(float)minute/60);
//        Log.d("alan","hourDegree--->"+hourDegree);
        canvas.save();
        canvas.rotate(hourDegree,cX,cY);//旋轉(zhuǎn)畫布準備畫時針
        canvas.drawLine(cX,cY-200,cX,cY,hourPaint);//畫時針
        canvas.restore();//重置畫布

//        canvas.save();
        float minuteDegree=((float)minute)/60*360;//畫分針時畫布應(yīng)該旋轉(zhuǎn)的度數(shù)
//        Log.d("alan","minuteDegree--->"+minuteDegree);
        canvas.rotate(minuteDegree,cX,cY);
        canvas.drawLine(cX,cY-250,cX,cY,minutePaint);
        canvas.restore();

        float secondDegree=((float)second)/60*360;//畫秒針時畫布應(yīng)該旋轉(zhuǎn)的度數(shù)
//        Log.d("alan","secondDegree--->"+secondDegree);
        canvas.rotate(secondDegree,cX,cY);//這里是順時針旋轉(zhuǎn)
        canvas.drawLine(cX,cY-300,cX,cY,secondPaint);
        canvas.restore();

        postInvalidateDelayed(1000);//每1秒鐘重繪一次
    }

這樣就完成了自定義控件的制作侥蒙,然后在布局中引用就行了

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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"
    tools:context="com.yus.clockview.MainActivity">

    <com.yus.clockview.ClockView
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
</RelativeLayout>

代碼已經(jīng)上傳到我的GitHub上,如果喜歡的話凛篙,不妨Star一下臭墨,我GitHub上別的項目也可以關(guān)注下。
代碼地址
我的GitHub地址

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末皮假,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子骂维,更是在濱河造成了極大的恐慌惹资,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,496評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件航闺,死亡現(xiàn)場離奇詭異褪测,居然都是意外死亡猴誊,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,187評論 3 385
  • 文/潘曉璐 我一進店門侮措,熙熙樓的掌柜王于貴愁眉苦臉地迎上來懈叹,“玉大人,你說我怎么就攤上這事分扎∠钜酰” “怎么了?”我有些...
    開封第一講書人閱讀 157,091評論 0 348
  • 文/不壞的土叔 我叫張陵笆包,是天一觀的道長环揽。 經(jīng)常有香客問我,道長庵佣,這世上最難降的妖魔是什么歉胶? 我笑而不...
    開封第一講書人閱讀 56,458評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮巴粪,結(jié)果婚禮上通今,老公的妹妹穿的比我還像新娘。我一直安慰自己肛根,他們只是感情好辫塌,可當(dāng)我...
    茶點故事閱讀 65,542評論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著派哲,像睡著了一般臼氨。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上芭届,一...
    開封第一講書人閱讀 49,802評論 1 290
  • 那天储矩,我揣著相機與錄音,去河邊找鬼褂乍。 笑死持隧,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的逃片。 我是一名探鬼主播屡拨,決...
    沈念sama閱讀 38,945評論 3 407
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼褥实!你這毒婦竟也來了呀狼?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,709評論 0 266
  • 序言:老撾萬榮一對情侶失蹤性锭,失蹤者是張志新(化名)和其女友劉穎赠潦,沒想到半個月后叫胖,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體草冈,經(jīng)...
    沈念sama閱讀 44,158評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,502評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了怎棱。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片哩俭。...
    茶點故事閱讀 38,637評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖拳恋,靈堂內(nèi)的尸體忽然破棺而出凡资,到底是詐尸還是另有隱情,我是刑警寧澤谬运,帶...
    沈念sama閱讀 34,300評論 4 329
  • 正文 年R本政府宣布隙赁,位于F島的核電站,受9級特大地震影響梆暖,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,911評論 3 313
  • 文/蒙蒙 一绩蜻、第九天 我趴在偏房一處隱蔽的房頂上張望礁苗。 院中可真熱鬧,春花似錦级解、人聲如沸冒黑。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,744評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽抡爹。三九已至,卻和暖如春芒划,著一層夾襖步出監(jiān)牢的瞬間豁延,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,982評論 1 266
  • 我被黑心中介騙來泰國打工腊状, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留诱咏,地道東北人。 一個月前我還...
    沈念sama閱讀 46,344評論 2 360
  • 正文 我出身青樓缴挖,卻偏偏與公主長得像袋狞,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子映屋,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,500評論 2 348

推薦閱讀更多精彩內(nèi)容