您的位置:首页 > 移动开发 > Android开发

【Android】自定义View -- 钟表

2016-01-02 15:03 567 查看
【问题】

通过自定义View来实现一个钟表;

【效果图】







【代码分析】

重写onDraw

画外圆
/**
*画外圆和中心实心圆
*@paramcanvas
*/
privatevoiddrawCircle(Canvascanvas){
Paintpaint=newPaint();
paint.setColor(mRingColor);
paint.setStyle(Paint.Style.STROKE);
paint.setAntiAlias(true);
paint.setDither(true);
paint.setStrokeWidth(getDigit(2));
canvas.drawCircle(mWidth/2,mHeight/2,mDiameter/2,paint);
//画中心的实心圆
paint.setStyle(Paint.Style.FILL);
paint.setColor(mCenterPointColor);
canvas.drawCircle(mWidth/2,mHeight/2,getDigit(4),paint);
}


画刻度
/**
*画刻度
*@paramcanvas
*/
privatevoiddrawScale(Canvascanvas){
Paintpaint=newPaint();
paint.setStrokeWidth(getDigit(1));
paint.setTextSize(getDigit(10));
paint.setAntiAlias(true);
for(inti=0;i<60;i++){
if(i%5==0){
paint.setStrokeWidth(getDigit(2));
paint.setColor(mLongScaleColor);
paint.setTextSize(getDigit(15));
StringtimeText=""+i/5;
if(i==0){
timeText="12";
}
canvas.drawLine(mWidth/2,mHeight/2-mDiameter/2,mWidth/2,mHeight/2-mDiameter/2+40,paint);
paint.setColor(mTextColor);
canvas.drawText(timeText,mWidth/2-paint.measureText(timeText)/2,mHeight/2-mDiameter/2+80,paint);
}else{
paint.setStrokeWidth(getDigit(1));
paint.setTextSize(getDigit(15));
paint.setColor(mShortScaleColor);
canvas.drawLine(mWidth/2,mHeight/2-mDiameter/2,mWidth/2,mHeight/2-mDiameter/2+20,paint);
}
//旋转画布,每次旋转6度
canvas.rotate(6,mWidth/2,mHeight/2);
}
}


画指针
/**
*画指针:时针,分针,秒针
*@paramcanvas
*/
privatevoiddrawIndicator(Canvascanvas){
//保存图层
canvas.save();
canvas.translate(mWidth/2f,mHeight/2f);
Paintpaint=newPaint();
paint.setAntiAlias(true);
paint.setDither(true);
paint.setStrokeWidth(getDigit(3));
paint.setColor(mHourColor);
canvas.drawLine(0,0,getLeftBy(H),getTopBy(H),paint);
paint.setStrokeWidth(getDigit(2));
paint.setColor(mMinuteColor);
canvas.drawLine(0,0,getLeftBy(M),getTopBy(M),paint);
paint.setStrokeWidth(getDigit(1));
paint.setColor(mSecondColor);
canvas.drawLine(0,0,getLeftBy(S),getTopBy(S),paint);
//合并图层
canvas.restore();
}
privatefloatgetLeftBy(intindicator){
floatr=0f;
floatdigit=0;
switch(indicator){
caseH:
r=mHourR;
//根据分钟进行补充,每5分钟进一小格
digit=((mHour%12/12f*60+mMinute/60f*5))%60;
break;
caseM:
r=mMinuteR;
digit=mMinute;
break;
caseS:
r=mSecondR;
digit=mSecond+1;
break;
}
floatleft=(float)Math.sin(digit/60f*Math.PI*2)*r;
if(digit<=30){
returnMath.abs(left);
}else{
return-Math.abs(left);
}
}
privatefloatgetTopBy(intindicator){
floatr=0f;
floatdigit=0;
switch(indicator){
caseH:
r=mHourR;
//根据分钟进行补充,每5分钟进一小格
digit=((mHour%12/12f*60+mMinute/60f*5))%60;
break;
caseM:
r=mMinuteR;
digit=mMinute;
break;
caseS:
r=mSecondR;
digit=mSecond+1;
break;
}
floatleft=(float)Math.cos(digit/60f*Math.PI*2)*r;
if(15<=digit&&digit<=45){
returnMath.abs(left);
}else{
return-Math.abs(left);
}
}


重写onMesure
@Override
protectedvoidonMeasure(intwidthMeasureSpec,intheightMeasureSpec){
mWidth=measuredWidth(widthMeasureSpec);
mHeight=measuredHeight(heightMeasureSpec);
setMeasuredDimension(mWidth,mHeight);
//钟表的外圆直径(除去padding)
mDiameter=Math.min(mWidth-getPaddingLeft()-getPaddingRight(),mHeight-getPaddingTop()-getPaddingBottom());
//时针半径外环半径的1/3
mHourR=mDiameter/2f/3;
//分针半径为外环半径的1/2
mMinuteR=mDiameter/2f/2;
//秒针半径为外环半径的1/1.5
mSecondR=mDiameter/2f/1.5f;
}
privateintmeasuredWidth(intwidthMeasureSpec){
intresult=0;
intspecMode=MeasureSpec.getMode(widthMeasureSpec);
intspecSize=MeasureSpec.getSize(widthMeasureSpec);
if(specMode==MeasureSpec.EXACTLY){
result=specSize;
}else{
result=500;
if(specMode==MeasureSpec.AT_MOST){
result=Math.min(result,specSize);
}
}
returnresult;
}
privateintmeasuredHeight(intheightMeasureSpec){
intresult=0;
intspecMode=MeasureSpec.getMode(heightMeasureSpec);
intspecSize=MeasureSpec.getSize(heightMeasureSpec);
if(specMode==MeasureSpec.EXACTLY){
result=specSize;
}else{
result=500;
if(specMode==MeasureSpec.AT_MOST){
result=Math.min(result,specSize);
}
}
returnresult;
}


用新线程启动钟表
/**
*启动钟表
*/
privatevoidstartClock(){
newThread(newRunnable(){
@Override
publicvoidrun(){
while(true){
Calendarcalendar=Calendar.getInstance();
calendar.setTime(newDate());
inthour=calendar.get(Calendar.HOUR)+1;
intminute=calendar.get(Calendar.MINUTE);
intsecond=calendar.get(Calendar.SECOND);
setHour(hour);
setMinute(minute);
setSecond(second);
try{
Thread.sleep(1000);
}catch(InterruptedExceptione){
e.printStackTrace();
}
}
}
}).start();
}


【源码下载】

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: