Android Canvas自定義實(shí)現(xiàn)時(shí)鐘效果
Android之Canvas自定義畫一個(gè)時(shí)鐘,供大家參考,具體內(nèi)容如下
自定義控件,在安卓是也是一種無(wú)所不能的技術(shù)了,所有自帶控件,以及組合自帶控件不能實(shí)現(xiàn)的一些效果,我們都可以通過(guò)自定義控件來(lái)實(shí)現(xiàn),不過(guò),如果能有系統(tǒng)控件使用的就用系統(tǒng)自帶的控件去實(shí)現(xiàn),而不必要用自定義去實(shí)現(xiàn),我們都知道,自定義控件在一定的程度上,效率往往會(huì)比系統(tǒng)自帶的控件效率低,所以我不到萬(wàn)不得已,不要使用自定義控件,今天用自定一控件,實(shí)現(xiàn)一個(gè)小小的時(shí)鐘,具體的實(shí)現(xiàn)在代碼中注釋功能。
ClockView.java
public class ClockView extends View implements Handler.Callback {
//定義一個(gè)畫筆
private Paint paint;
//定義個(gè)畫小時(shí)指針的路徑
private Path hour;
//定義一個(gè)畫分針的路徑
private Path minute;
//定義一個(gè)Handler來(lái)實(shí)現(xiàn)時(shí)鐘跑動(dòng)效果
private Handler handler = new Handler(this);
public ClockView(Context context) {
this(context, null);
}
public ClockView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public ClockView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
//創(chuàng)建一個(gè)畫筆
this.paint = new Paint();
//創(chuàng)建一個(gè)時(shí)針路徑,用于繪制時(shí)針
hour = new Path();
//首先將點(diǎn)定位到時(shí)針尾部,所有的坐標(biāo),大家可以根據(jù)圓心點(diǎn)去尋找對(duì)應(yīng)的點(diǎn)
hour.moveTo(500, 380);
//然后與(185,500)連接一條線
hour.lineTo(485, 500);
//然后與(500,515)連接一條線
hour.lineTo(500, 515);
//最后繪制成一個(gè)完整的時(shí)針線條了,效果為圖中的綠色線條
hour.lineTo(515, 500);
//創(chuàng)建一個(gè)分針路徑
minute = new Path();
minute.moveTo(500, 350);
minute.lineTo(490, 500);
minute.lineTo(500, 510);
//最后連接成一條分針線條
minute.lineTo(510, 500);
//一開始就發(fā)送消息,讓時(shí)鐘開始運(yùn)行
handler.sendEmptyMessage(0);
}
@TargetApi(Build.VERSION_CODES.N)
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
//首先設(shè)置畫布為黑色
canvas.drawColor(0xff000000);
//獲取屏幕的寬,和高的比例,選取最小的比例,這樣就能讓圖片位于中間了。
float scale = Math.min(getWidth() / 1000.0f, getHeight() / 1000.0f);
//設(shè)置畫布的比例
canvas.scale(scale, scale);
//將圖片繪制在屏幕的中間
canvas.translate((getWidth() / scale - 1000) / 2, (getHeight() / scale - 1000) / 2);
//設(shè)置畫筆類型為空心的
paint.setStyle(Paint.Style.STROKE);
//顏色為白色
paint.setColor(0xffffffff);
//畫筆的粗細(xì)
paint.setStrokeWidth(5);
//將上面所有繪制的內(nèi)容進(jìn)行保存一下
canvas.save();
//開始繪制一個(gè)時(shí)鐘外圓
canvas.drawCircle(500, 500, 200, paint);
//通過(guò)for循環(huán)繪制12個(gè)小時(shí)的時(shí)鐘刻度
for (int i = 0; i < 12; i++) {
if (i % 3 == 0) {//繪制12 3 6 9點(diǎn)時(shí)刻
paint.setStrokeWidth(5);//設(shè)置粗度為5
canvas.drawLine(500, 300, 500, 320, paint);
} else {
paint.setStrokeWidth(2);
canvas.drawLine(500, 300, 500, 315, paint);
}
canvas.rotate(30, 500, 500);//將圓圍繞圓點(diǎn)旋轉(zhuǎn)30度,每30度繪制一個(gè)刻度
}
paint.setStrokeWidth(3);
paint.setColor(0xff00ff00);
paint.setStyle(Paint.Style.FILL);
//定義一個(gè)Calendar時(shí)鐘類
Calendar calendar = Calendar.getInstance();
//將上面所有繪制的東西保存下來(lái)
canvas.save();
//通過(guò)獲取系統(tǒng)的時(shí)鐘,然后繪制到對(duì)應(yīng)的時(shí)針
canvas.rotate(calendar.get(Calendar.HOUR) * 30 + calendar.get(Calendar.MINUTE), 500, 500);
//繪制時(shí)針
canvas.drawPath(hour, paint);
//重繪上一次的時(shí)鐘
canvas.restore();
//設(shè)置分針的顏色為紅色
paint.setColor(0xffff0000);
//根據(jù)系統(tǒng)獲取的時(shí)間旋轉(zhuǎn)到對(duì)應(yīng)的角度
canvas.rotate(calendar.get(Calendar.MINUTE) * 6 + calendar.get(Calendar.SECOND) * 0.1f, 500, 500);
//繪制分針
canvas.drawPath(minute, paint);
paint.setColor(Color.WHITE);
paint.setStrokeWidth(2);
canvas.save();
canvas.rotate(calendar.get(Calendar.SECOND) * 6, 500, 500);
//繪制秒針
canvas.drawLine(500, 330, 500, 510, paint);
canvas.restore();
canvas.save();
}
/**
* 通過(guò)Handler更新時(shí)鐘走向
* @param message
* @return
*/
@Override
public boolean handleMessage(Message message) {
switch (message.what) {
case 0:
//重新掉用onDraw方法
invalidate();
//每隔一秒繪制一次
handler.sendEmptyMessageDelayed(0, 1000);
break;
}
return true;
}
}
通過(guò)如上的代碼就能簡(jiǎn)單的繪制一個(gè)時(shí)鐘了,我個(gè)人的美觀不太好,所以只能繪制成如下的效果,還是那句話,對(duì)于能自定義控件不到萬(wàn)不得已就不要用。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持我們。
上一篇:Android 實(shí)現(xiàn)長(zhǎng)按彈出PopupMenu 菜單欄
欄 目:Android
下一篇:android studio 使用Mocklocation虛擬定位
本文標(biāo)題:Android Canvas自定義實(shí)現(xiàn)時(shí)鐘效果
本文地址:http://www.jygsgssxh.com/a1/Android/8988.html
您可能感興趣的文章
- 01-10Android自定義View之繪制圓形頭像功能
- 01-10Android實(shí)現(xiàn)雙擊返回鍵退出應(yīng)用實(shí)現(xiàn)方法詳解
- 01-10android實(shí)現(xiàn)記住用戶名和密碼以及自動(dòng)登錄
- 01-10android實(shí)現(xiàn)簡(jiǎn)單計(jì)算器功能
- 01-10Android 友盟第三方登錄與分享的實(shí)現(xiàn)代碼
- 01-10C++自定義API函數(shù)實(shí)現(xiàn)大數(shù)相乘算法
- 01-10android實(shí)現(xiàn)指紋識(shí)別功能
- 01-10Emoji表情在Android JNI中的兼容性問(wèn)題詳解
- 01-10Android實(shí)現(xiàn)圓形漸變加載進(jìn)度條
- 01-10android開發(fā)環(huán)境中SDK文件夾下的所需內(nèi)容詳解


閱讀排行
- 1C語(yǔ)言 while語(yǔ)句的用法詳解
- 2java 實(shí)現(xiàn)簡(jiǎn)單圣誕樹的示例代碼(圣誕
- 3利用C語(yǔ)言實(shí)現(xiàn)“百馬百擔(dān)”問(wèn)題方法
- 4C語(yǔ)言中計(jì)算正弦的相關(guān)函數(shù)總結(jié)
- 5c語(yǔ)言計(jì)算三角形面積代碼
- 6什么是 WSH(腳本宿主)的詳細(xì)解釋
- 7C++ 中隨機(jī)函數(shù)random函數(shù)的使用方法
- 8正則表達(dá)式匹配各種特殊字符
- 9C語(yǔ)言十進(jìn)制轉(zhuǎn)二進(jìn)制代碼實(shí)例
- 10C語(yǔ)言查找數(shù)組里數(shù)字重復(fù)次數(shù)的方法
本欄相關(guān)
- 01-10Android自定義View之繪制圓形頭像功能
- 01-10Android實(shí)現(xiàn)雙擊返回鍵退出應(yīng)用實(shí)現(xiàn)方
- 01-10android實(shí)現(xiàn)簡(jiǎn)單計(jì)算器功能
- 01-10android實(shí)現(xiàn)記住用戶名和密碼以及自動(dòng)
- 01-10C++自定義API函數(shù)實(shí)現(xiàn)大數(shù)相乘算法
- 01-10Android 友盟第三方登錄與分享的實(shí)現(xiàn)代
- 01-10android實(shí)現(xiàn)指紋識(shí)別功能
- 01-10如何給Flutter界面切換實(shí)現(xiàn)點(diǎn)特效
- 01-10Android實(shí)現(xiàn)圓形漸變加載進(jìn)度條
- 01-10Emoji表情在Android JNI中的兼容性問(wèn)題詳
隨機(jī)閱讀
- 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置
- 08-05DEDE織夢(mèng)data目錄下的sessions文件夾有什
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 08-05dedecms(織夢(mèng))副欄目數(shù)量限制代碼修改
- 01-11ajax實(shí)現(xiàn)頁(yè)面的局部加載
- 04-02jquery與jsp,用jquery
- 08-05織夢(mèng)dedecms什么時(shí)候用欄目交叉功能?
- 01-10C#中split用法實(shí)例總結(jié)
- 01-10使用C語(yǔ)言求解撲克牌的順子及n個(gè)骰子
- 01-10delphi制作wav文件的方法


