




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
【移動(dòng)應(yīng)用開(kāi)發(fā)技術(shù)】怎么在Android中通過(guò)自定義控件實(shí)現(xiàn)時(shí)鐘功能
這篇文章將為大家詳細(xì)講解有關(guān)怎么在Android中通過(guò)自定義控件實(shí)現(xiàn)時(shí)鐘功能,文章內(nèi)容質(zhì)量較高,因此在下分享給大家做個(gè)參考,希望大家閱讀完這篇文章后對(duì)相關(guān)知識(shí)有一定的了解。自定義控件的代碼(ClockView.java):package
com.example.clock;
import
java.util.Calendar;
import
java.util.Date;
import
android.content.Context;
import
android.graphics.Canvas;
import
android.graphics.Color;
import
android.graphics.Paint;
import
android.os.Handler;
import
android.os.Looper;
import
android.os.Message;
import
android.util.AttributeSet;
import
android.view.View;
public
class
ClockView
extends
View
{
private
Paint
circlePaint,
dialPaint,
numberPaint;
//
view
的寬高
private
float
mWidth,
mHeight;
//
圓的半徑
private
float
circleRadius;
//
圓心X,Y坐標(biāo)
private
float
circleX,
circleY;
private
int
second,
minute;
private
double
hour;
private
Handler
handler
=
new
Handler(Looper.getMainLooper())
{
@Override
public
void
handleMessage(Message
msg)
{
super.handleMessage(msg);
if
(msg.what
==
0)
{
invalidate();
}
}
};
public
ClockView(Context
context,
AttributeSet
attrs)
{
super(context,
attrs);
initPaint();
}
private
void
initPaint()
{
//
刻盤圓,小時(shí)刻度,時(shí)針和分針的畫筆
circlePaint
=
new
Paint(Paint.ANTI_ALIAS_FLAG);
circlePaint.setColor(Color.BLACK);
circlePaint.setStyle(Paint.Style.STROKE);
circlePaint.setStrokeWidth(10);
//
分鐘刻度的畫筆
dialPaint
=
new
Paint(Paint.ANTI_ALIAS_FLAG);
dialPaint.setColor(Color.BLACK);
dialPaint.setStrokeWidth(5);
//
數(shù)字的畫筆
numberPaint
=
new
Paint(Paint.ANTI_ALIAS_FLAG);
numberPaint.setColor(Color.BLACK);
numberPaint.setStrokeWidth(5);
numberPaint.setTextSize(30);
}
@Override
protected
void
onMeasure(int
widthMeasureSpec,
int
heightMeasureSpec)
{
super.onMeasure(widthMeasureSpec,
heightMeasureSpec);
mWidth
=
getMeasuredWidth();
mHeight
=
getMeasuredHeight();
if
(mWidth
<
mHeight)
{
//
圓的半徑為view的寬度的一半再減9,防止貼邊
circleRadius
=
mWidth
/
2
-
9;
circleX
=
mWidth
/
2;
circleY
=
mHeight
/
2;
}
else
{
circleRadius
=
mHeight
/
2
-
9;
circleX
=
mWidth
/
2;
circleY
=
mHeight
/
2;
}
}
@Override
protected
void
onDraw(Canvas
canvas)
{
super.onDraw(canvas);
setTimes();
drawCirclePoint(canvas);
drawCircle(canvas);
drawDial(canvas);
drawPointer(canvas);
}
/**
*
圓心
*
*
@param
canvas
*/
private
void
drawCirclePoint(Canvas
canvas)
{
canvas.drawCircle(circleX,
circleY,
5,
circlePaint);
}
private
void
drawCircle(Canvas
canvas)
{
canvas.drawCircle(circleX,
circleY,
circleRadius,
circlePaint);
}
/**
*
畫刻度及時(shí)間
*
*
@param
canvas
*/
private
void
drawDial(Canvas
canvas)
{
//
時(shí)鐘用長(zhǎng)一點(diǎn)的刻度,畫筆用畫圓的畫筆
Point
hourStartPoint
=
new
Point(circleX,
circleY
-
circleRadius);
Point
hourEndPoint
=
new
Point(circleX,
circleY
-
circleRadius
+
40);
//
分鐘的刻度要稍微短一些,畫筆用畫圓的畫筆
Point
startPoint2
=
new
Point(circleX,
circleY
-
circleRadius);
Point
endPoint2
=
new
Point(circleX,
circleY
-
circleRadius
+
10);
//
開(kāi)始畫刻度和數(shù)字,總共60個(gè)刻度,12個(gè)時(shí)鐘刻度,被5整除畫一個(gè)時(shí)鐘刻度,被其余的為分針刻度
String
clockNumber;
for
(int
i
=
0;
i
<
60;
i++)
{
if
(i
%
5
==
0)
{
if
(i
==
0)
{
clockNumber
=
"12";
}
else
{
clockNumber
=
String.valueOf(i
/
5);
}
//
時(shí)針刻度
canvas.drawLine(hourStartPoint.getX(),
hourStartPoint.getY(),
hourEndPoint.getX(),
hourEndPoint.getY(),
circlePaint);
//
畫數(shù)字,需在時(shí)針刻度末端加30
canvas.drawText(clockNumber,
circleX
-
numberPaint.measureText(clockNumber)
/
2,
hourEndPoint.getY()
+
30,
numberPaint);
}
else
{
//
畫分針刻度
canvas.drawLine(startPoint2.getX(),
startPoint2.getY(),
endPoint2.getX(),
endPoint2.getY(),
circlePaint);
}
//
畫布旋轉(zhuǎn)6度
canvas.rotate(360
/
60,
circleX,
circleY);
}
}
/**
*
畫指針
X點(diǎn)坐標(biāo)
cos(弧度)*r
Y點(diǎn)坐標(biāo)
sin(弧度)*r
toRadians將角度轉(zhuǎn)成弧度
*
安卓坐標(biāo)系與數(shù)學(xué)坐標(biāo)系不同的地方是X軸是相反的,所以為了調(diào)整方向,需要將角度+270度
*
*
@param
canvas
*/
private
void
drawPointer(Canvas
canvas)
{
canvas.translate(circleX,
circleY);
float
hourX
=
(float)
Math.cos(Math.toRadians(hour
*
30
+
270))
*
circleRadius
*
0.5f;
float
hourY
=
(float)
Math.sin(Math.toRadians(hour
*
30
+
270))
*
circleRadius
*
0.5f;
float
minuteX
=
(float)
Math.cos(Math.toRadians(minute
*
6
+
270))
*
circleRadius
*
0.8f;
float
minuteY
=
(float)
Math.sin(Math.toRadians(minute
*
6
+
270))
*
circleRadius
*
0.8f;
float
secondX
=
(float)
Math.cos(Math.toRadians(second
*
6
+
270))
*
circleRadius
*
0.8f;
float
secondY
=
(float)
Math.sin(Math.toRadians(second
*
6
+
270))
*
circleRadius
*
0.8f;
canvas.drawLine(0,
0,
hourX,
hourY,
circlePaint);
canvas.drawLine(0,
0,
minuteX,
minuteY,
circlePaint);
canvas.drawLine(0,
0,
secondX,
secondY,
dialPaint);
//
一秒重繪一次
handler.sendEmptyMessageDelayed(0,
1000);
}
public
void
startClock()
{
setTimes();
invalidate();
}
private
void
setTimes()
{
Date
date
=
new
Date();
Calendar
calendar
=
Calendar.getInstance();
calendar.setTime(date);
second
=
getTimes(date,
Calendar.SECOND);
minute
=
getTimes(date,
Calendar.MINUTE);
hour
=
getTimes(date,
Calendar.HOUR)
+
minute
/
12
*
0.2;
}
private
int
getTimes(Date
date,
int
calendarField)
{
Calendar
calendar
=
Calendar.getInstance();
calendar.setTime(date);
return
calendar.get(calendarField);
}
public
void
stopClock()
{
handler.removeMessages(0);
}
}Point.java:package
com.example.clock;
public
class
Point
{
private
float
x;
private
float
y;
public
Point(float
x,
float
y)
{
this.x
=
x;
this.y
=
y;
}
public
float
getX()
{
return
x;
}
public
void
setX(float
x)
{
this.x
=
x;
}
public
float
getY()
{
return
y;
}
public
void
setY(float
y)
{
this.y
=
y;
}
}Acitivity(ClockActivity.java):package
com.example.clock;
import
android.app.Activity;
import
android.os.Bundle;
public
class
ClockActivity
extends
Activity
{
/**
Called
when
the
activity
is
first
created.
*/
private
ClockView
clockView;
@Override
protected
void
onCreate(Bundle
savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
clockView
=
(ClockView)
findViewById(R.id.clock);
}
@Override
protected
void
onResume()
{
super.on
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 學(xué)生評(píng)教與反饋實(shí)施方案計(jì)劃
- 靜脈治療報(bào)告
- 統(tǒng)編版小學(xué)語(yǔ)文二年級(jí)下冊(cè)《語(yǔ)文園地三》精美課件
- 第四單元 《平行四邊形的認(rèn)識(shí)》教學(xué)設(shè)計(jì)-2024-2025學(xué)年四年級(jí)數(shù)學(xué)上冊(cè)青島版(五四學(xué)制)
- 養(yǎng)老床位建設(shè)服務(wù)方案(技術(shù)方案)
- 老年骨折手術(shù)護(hù)理
- 放射科護(hù)理相關(guān)知識(shí)課件
- 培訓(xùn)課件知識(shí)產(chǎn)權(quán)保護(hù)
- 2025年湛江道路客貨運(yùn)輸從業(yè)資格證模擬考試下載
- 2025年上海貨運(yùn)從業(yè)資格證模擬試題答案大全
- 智鼎在線測(cè)評(píng)題庫(kù)88題
- 花城版音樂(lè)八下第4單元《生命之歌》教案
- 搶救技術(shù) 氣管插管術(shù)
- 電纜敷設(shè)施工方案及安全措施
- 蘇科版九年級(jí)物理上冊(cè)同步教學(xué)課件第十三章 電路初探-單元復(fù)習(xí)(課件)
- 高中英語(yǔ)-人教-選修二-單詞默寫
- 《聯(lián)合國(guó)教科文:學(xué)生人工智能能力框架》-中文版
- 植物學(xué)基礎(chǔ)智慧樹(shù)知到答案2024年哈爾濱師范大學(xué)
- 小數(shù)除法100道豎式計(jì)算題及答案
- 2024CSCO胃腸間質(zhì)瘤診療指南解讀
- DL-T5159-2012電力工程物探技術(shù)規(guī)程
評(píng)論
0/150
提交評(píng)論