Android自定义控件时钟效果

时钟动图效果如下:


画图逻辑如下:

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec)
{
int widthMode = MeasureSpec.getMode(widthMeasureSpec);
int widthSize = MeasureSpec.getSize(widthMeasureSpec);
int heightMode = MeasureSpec.getMode(heightMeasureSpec);
int heightSize = MeasureSpec.getSize(heightMeasureSpec);


float hScale = 1.0f;
float vScale = 1.0f;


if (widthMode != MeasureSpec.UNSPECIFIED && widthSize < mDialWidth)
{
hScale = (float) widthSize / (float) mDialWidth;
}


if (heightMode != MeasureSpec.UNSPECIFIED && heightSize < mDialHeight)
{
vScale = (float) heightSize / (float) mDialHeight;
}


float scale = Math.min(hScale, vScale);


setMeasuredDimension(resolveSize((int) (mDialWidth * scale), widthMeasureSpec), resolveSize((int) (mDialHeight * scale), heightMeasureSpec));
}


@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh)
{
super.onSizeChanged(w, h, oldw, oldh);
mChanged = true;
}


@Override
protected void onDraw(Canvas canvas)
{
super.onDraw(canvas);
boolean changed = mChanged;
if (changed)
{
mChanged = false;
}


int availableWidth = getWidth();
int availableHeight = getHeight();


int x = availableWidth / 2;
int y = availableHeight / 2;


final Drawable dial = mDial;
int w = dial.getIntrinsicWidth();
int h = dial.getIntrinsicHeight();


boolean scaled = false;


if (availableWidth < w || availableHeight < h)
{
scaled = true;
float scale = Math.min((float) availableWidth / (float) w, (float) availableHeight / (float) h);
canvas.save();
canvas.scale(scale, scale, x, y);
}


if (changed)
{
dial.setBounds(x - (w / 2), y - (h / 2), x + (w / 2), y + (h / 2));
}
dial.draw(canvas);


canvas.save();
canvas.rotate(mHour / 12.0f * 360.0f, x, y);


final Drawable hourHand = mHourHand;
if (changed)
{
w = hourHand.getIntrinsicWidth();
h = hourHand.getIntrinsicHeight();
hourHand.setBounds(x - (w / 2), y - (h / 2), x + (w / 2), y + (h / 2));
}
hourHand.draw(canvas);
canvas.restore();


canvas.save();
canvas.rotate(mMinutes / 60.0f * 360.0f, x, y);


final Drawable minuteHand = mMinuteHand;
if (changed)
{
w = minuteHand.getIntrinsicWidth();
h = minuteHand.getIntrinsicHeight();
minuteHand.setBounds(x - (w / 2), y - (h / 2), x + (w / 2), y + (h / 2));
}
minuteHand.draw(canvas);
canvas.restore();


//add second draw
canvas.save();
canvas.rotate(mSeconds / 60.0f * 360.0f, x, y);


final Drawable secondHand = mSecondHand;
if (changed)
{
w = secondHand.getIntrinsicWidth();
h = secondHand.getIntrinsicHeight();
secondHand.setBounds(x - (w / 2), y - (h / 2), x + (w / 2), y + (h / 2));
}
secondHand.draw(canvas);
canvas.restore();


if (scaled)
{
canvas.restore();
}

}


完整图片以及代码下载地址 : https://download.csdn.net/download/u012539700/10289194

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

景兄弟1366

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值