最近有点时间, 突然想起以前面试的时候, 好多问过有没有写过自定义控件, 问的让我很懵逼, 说做过吧, 但好像极少特意自定义, 但说没有吧, 又觉得委屈了自己, 明明以前写过.... 最后一问, 做过自定义钟表吗? 就这? 好吧, 貌似我把他们要问的内容想复杂了...
随手写一个自定义钟表, 还有蚊香圈哦... 蚊香圈很好玩.
对了, 特别讨厌那种让你背代码的面试....面试某车新能源服务公司的时候, 竟然让背代码, TMD, 这什么玩意儿....
上代码:
项目代码, 下载地址 : https://download.csdn.net/download/x531305158/12689327
自定义表盘, 其实很简单, 就是表盘刻度, 相当于在两个同心圆中, 根据三角函数, 确定起始位置和结束位置, 根据Path确定路径来画.
//代码下载地址 : https://download.csdn.net/download/x531305158/12689327
private void initTimerDis(Canvas canvas) {
int sourceBR = centerX - 40;
int sourceSR = sourceBR - 20;
int tempBR = sourceBR + 10;
int tempSR = sourceSR - 10;
int bR;
int sR;
mPaint.setStyle(Paint.Style.STROKE);
for (int i = 0; i <= 59; i++) {
int angle = 360 / 60 * i;
if ((i + 1) % 5 == 1) {
bR = tempBR;
sR = tempSR;
mPaint.setStrokeWidth(12);
mPaint.setColor(Color.BLACK);
} else {
bR = sourceBR;
sR = sourceSR;
mPaint.setStrokeWidth(5);
mPaint.setColor(Color.BLUE);
}
float y = (float) (centerY - bR * Math.cos(angle * Math.PI / 180));
float x = (float) (centerX + bR * Math.sin(angle * Math.PI / 180));
float sy = (float) (centerY - sR * Math.cos(angle * Math.PI / 180));
float sx = (float) (centerX + sR * Math.sin(angle * Math.PI / 180));
// Log.i("Test", "cos : " + Math.cos(angle) + " sin : " + Math.sin(angle));
// Log.i("Test", "sx : " + sx + ", sy : " + sy + ", x : " + x + ", y : " + y + " --> angle : " + angle + " br : " + bR + " centerX : " + centerX + " centerY : " + centerY);
mPath.moveTo(sx, sy);
mPath.lineTo(x, y);
canvas.drawPath(mPath, mPaint);
mPath.reset();
}
mPaint.setColor(Color.RED);
mPaint.setStyle(Paint.Style.FILL);
canvas.drawCircle(centerX, centerY, 30, mPaint);
mPaint.setColor(Color.BLACK);
mPaint.setStyle(Paint.Style.FILL);
canvas.drawCircle(centerX, centerY, 10, mPaint);
}
2. 时分秒指针
这就更简单, 唯计算尔.
//代码下载地址 : https://download.csdn.net/download/x531305158/12689327
private void refreshTime(Canvas canvas) {
String timeStr = DateUtils.getFormatTime(System.currentTimeMillis());
Log.i("Test", "timeStr : " + timeStr);
String[] array = timeStr.split(":");
int hour = Integer.parseInt(array[0]) % 12;
int mini = Integer.parseInt(array[1]);
int second = Integer.parseInt(array[2]);
int millis = Integer.parseInt(array[3]);
float hourAngel = (float) (360 / 12 * hour + 360 / 12 * (mini / 60.0));
float miniAngel = (float) (360 / 60 * mini + 360 / 60 * (second / 60.0));
float secondAngel = 360 / 60 * second;
float millisAngel = secondAngel + (float) (360.0 / 60 / 1000 * millis);
Log.i("Test", "secondAngel : " + secondAngel + " millisAngel : " + millisAngel);
float hourY = (float) (centerY - centerX / 3 * 2 * Math.cos(hourAngel * Math.PI / 180));
float hourX = (float) (centerX + centerX / 3 * 2 * Math.sin(hourAngel * Math.PI / 180));
mPaint.setColor(Color.LTGRAY);
mPaint.setStyle(Paint.Style.STROKE);
mPaint.setStrokeWidth(8);
mPath.moveTo(centerX, centerY);
mPath.lineTo(hourX, hourY);
canvas.drawPath(mPath, mPaint);
mPath.reset();
float miniY = (float) (centerY - centerX / 5 * 4 * Math.cos(miniAngel * Math.PI / 180));
float miniX = (float) (centerX + centerX / 5 * 4 * Math.sin(miniAngel * Math.PI / 180));
mPaint.setColor(Color.parseColor("#5C1CB0"));
mPaint.setStyle(Paint.Style.STROKE);
mPaint.setStrokeWidth(5);
mPath.moveTo(centerX, centerY);
mPath.lineTo(miniX, miniY);
canvas.drawPath(mPath, mPaint);
mPath.reset();
float y = (float) (centerY - centerX * Math.cos(secondAngel * Math.PI / 180));
float x = (float) (centerX + centerX * Math.sin(secondAngel * Math.PI / 180));
float sy = (float) (centerY - centerX / 8 * Math.cos((180 + secondAngel) * Math.PI / 180));
float sx = (float) (centerX + centerX / 8 * Math.sin((180 + secondAngel) * Math.PI / 180));
mPaint.setColor(Color.RED);
mPaint.setStyle(Paint.Style.STROKE);
mPaint.setStrokeWidth(2);
mPath.moveTo(sx, sy);
mPath.lineTo(x, y);
canvas.drawPath(mPath, mPaint);
mPath.reset();
if (!mHandler.hasMessages(ACTION_REFRESH_TIME)) {
mHandler.sendEmptyMessageDelayed(ACTION_REFRESH_TIME, TIME_DELAY);
}
}
代码直通车 : https://download.csdn.net/download/x531305158/12689327
直接运行就去下载吧. 也给我点积分, 现在实在缺少.