1 Star 1 Fork 0

张建华/test

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
ClockView.java 6.42 KB
一键复制 编辑 原始数据 按行查看 历史
张建华 提交于 2018-09-12 16:45 +08:00 . test
package com.example.rxjava;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.LinearGradient;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.Shader;
import android.support.annotation.Nullable;
import android.util.AttributeSet;
import android.view.View;
import java.util.Calendar;
public class ClockView extends View implements Runnable {
private Shader shader;
private Paint paint;
private Matrix matrix;
private Calendar calendar;
private int currentHours;
private int currentMinutes;
private int currentSeconds;
private float calibrationStrokeWidth = getResources().getDisplayMetrics().density * 2f;
private float calibrationLineLength = getResources().getDisplayMetrics().density * 8f;
private float hourPointerLengthStrokeWidth = getResources().getDisplayMetrics().density * 6;
private float hourPointerGap = getResources().getDisplayMetrics().density * 21;
private float minutePointerLengthStrokeWidth = getResources().getDisplayMetrics().density * 4f;
private float minutePointerGap = getResources().getDisplayMetrics().density * 6;
private float secondPointerLengthStrokeWidth = getResources().getDisplayMetrics().density * 1f;
private float secondPointerGap = getResources().getDisplayMetrics().density * 12f;
private float hourPointerLength;
private float minutePointerLength;
private float secondPointerLength;
public ClockView(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
paint = new Paint(Paint.ANTI_ALIAS_FLAG);
matrix = new Matrix();
}
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
shader = new LinearGradient(0, 0, 0, h, new int[]{0xffff8ea0, 0xffffa551}, new float[]{0.3f, 1f}, Shader.TileMode.MIRROR);
}
@Override
protected void onDraw(Canvas canvas) {
//draw circle
if (calendar == null) {
calendar = Calendar.getInstance();
currentHours = calendar.get(Calendar.HOUR_OF_DAY);
currentMinutes = calendar.get(Calendar.MINUTE);
currentSeconds = calendar.get(Calendar.SECOND);
postDelayed(this, 1000);
}
canvas.save();
final float circleRadius = getWidth() * 0.5f;
final float decrementRadius = getWidth() * 0.5f * 0.09f;
final float minimumShaderRadius = decrementRadius * 2;
matrix.reset();
paint.setShader(shader);
float previousRadius = circleRadius;
for (int i = 0; i < 4; i++) {
float currentRadius = circleRadius - decrementRadius * i;
float calculateScaleRatio = currentRadius / previousRadius;
canvas.scale(calculateScaleRatio, calculateScaleRatio, getWidth() * 0.5f, getHeight() * 0.5f);
matrix.postScale(calculateScaleRatio, calculateScaleRatio, getWidth() * 0.5f, getHeight() * 0.5f);
shader.setLocalMatrix(matrix);
if (i == 3) {
paint.setShader(null);
paint.setAlpha(255);
paint.setColor(Color.WHITE);
} else {
float alphaRatio = 0.2f + ((circleRadius - currentRadius) / minimumShaderRadius) * 0.8f;
paint.setAlpha((int) (alphaRatio * 255));
}
canvas.drawCircle(getWidth() * 0.5f, getHeight() * 0.5f, circleRadius, paint);
previousRadius = currentRadius;
}
float calculateScale = circleRadius / previousRadius;
paint.setShader(shader);
paint.setStrokeWidth(calibrationStrokeWidth * calculateScale);
paint.setStrokeCap(Paint.Cap.ROUND);
//刻度
for (int i = 0; i < 12; i++) {
canvas.drawLine(getWidth(), getHeight() * 0.5f, getWidth() - calibrationLineLength * calculateScale, getHeight() * 0.5f, paint);
canvas.rotate(30, getWidth() * 0.5f, getHeight() * 0.5f);
matrix.postRotate(-30, getWidth() * 0.5f, getHeight() * 0.5f);
shader.setLocalMatrix(matrix);
}
//canvas,shaderMatrix回归最开始状态
canvas.restore();
matrix.reset();
//画时分秒针
canvas.rotate(-90f, circleRadius, circleRadius);
float angleRotate;
canvas.save();
//计算时针旋转角度
angleRotate = currentHours * 30f + currentMinutes / 60f * 30f + currentSeconds / 3600f * 30f;
canvas.rotate(angleRotate, circleRadius, circleRadius);
paint.setStrokeWidth(hourPointerLengthStrokeWidth);
paint.setColor(Color.BLACK);
paint.setShader(null);
canvas.drawLine(circleRadius + previousRadius - hourPointerGap, circleRadius, circleRadius - getResources().getDisplayMetrics().density * 9, circleRadius, paint);
canvas.restore();
//分针
canvas.save();
matrix.setRotate(90f, circleRadius, circleRadius);
shader.setLocalMatrix(matrix);
paint.setShader(shader);
paint.setStrokeWidth(minutePointerLengthStrokeWidth);
angleRotate = currentMinutes * 6f + currentSeconds / 60f * 6f;
canvas.rotate(angleRotate, circleRadius, circleRadius);
canvas.drawLine(circleRadius + previousRadius - minutePointerGap, circleRadius, circleRadius - getResources().getDisplayMetrics().density * 13, circleRadius, paint);
canvas.restore();
//秒针
canvas.save();
paint.setShader(null);
paint.setColor(Color.parseColor("#03a9fe"));
paint.setStrokeWidth(secondPointerLengthStrokeWidth);
angleRotate=currentSeconds*6f;
canvas.rotate(angleRotate,circleRadius,circleRadius);
canvas.drawLine(circleRadius + previousRadius - secondPointerGap, circleRadius, circleRadius - getResources().getDisplayMetrics().density * 20f, circleRadius, paint);
canvas.restore();
paint.setStrokeWidth(0);
paint.setStyle(Paint.Style.FILL);
paint.setColor(Color.parseColor("#03a9fe"));
canvas.drawCircle(circleRadius, circleRadius, minutePointerLengthStrokeWidth * 0.5f, paint);
}
@Override
public void run() {
calendar = Calendar.getInstance();
currentHours = calendar.get(Calendar.HOUR_OF_DAY);
currentMinutes = calendar.get(Calendar.MINUTE);
currentSeconds = calendar.get(Calendar.SECOND);
invalidate();
postDelayed(this, 1000);
}
}
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
Android
1
https://gitee.com/shunxir/test.git
git@gitee.com:shunxir/test.git
shunxir
test
test
dev

搜索帮助