最近在学自定义View,看到小米时钟这个效果,很想去了解一下是界面是如何绘制以及秒针,分针,时针是如何转动的,还有那个弧形颜色渐变效果。这是我参照Github上的效果弄的,Github地址:高仿小米时钟
首先看一下效果图,
直接看代码,说明注释已添加。
package com.example.threeversionasproject.widget;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.Rect;
import android.graphics.RectF;
import android.graphics.SweepGradient;
import android.support.annotation.Nullable;
import android.text.TextPaint;
import android.util.AttributeSet;
import android.util.Log;
import android.view.View;
import com.example.threeversionasproject.DensityUtils;
import com.example.threeversionasproject.R;
import java.util.Calendar;
/**
* Created by Ocean on 2019/3/15.
*/
public class MiClockView extends View {
/* 时钟半径,不包括padding值 */
private float mRadius;
/*当前画布*/
private Canvas mCanvas;
/*刻度线画笔*/
private Paint linePaint;
/* 刻度线长度 */
private float mLineLength;
/* 刻度线颜色 */
private int mLineColor;
/* 外层圆弧画笔 */
private Paint mOutCirclePaint;
/* 外层圆弧画笔 颜色 */
private int mOutArcColor;
/* 外层圆弧的外接矩形 */
private RectF mOutRect = new RectF();
/* 外环字体画笔 */
private TextPaint mTextPaint;
/* 外环字体颜色 */
private int mTextColor;
/*外环字体尺寸*/
private float mTextSize;
/* 字体外接矩形 */
private Rect mTextRect = new Rect();
/* 梯度扫描渐变 */
private SweepGradient mSweepGradient;
/* 渐变矩阵,作用在SweepGradient */
private Matrix mGradientMatrix;
/* 刻度圆弧画笔 */
private Paint mLineArcPaint;
/* 刻度圆弧的外接矩形 */
private RectF mLineArcRectF = new RectF();
/*用于分针、秒针、时针色 */
private int mHourNeedleColor;
private int mMinuteNeedleColor;
private int mSecondNeedleColor;
/* 加一个默认的padding值,为了防止用camera旋转时钟时造成四周超出view大小 */
private float mDefaultPadding;
private float mPaddingLeft;
private float mPaddingTop;
private float mPaddingRight;
private float mPaddingBottom;
/* 时针画笔 */
private Paint mHourHandPaint;
/* 分针画笔 */
private Paint mMinuteHandPaint;
/* 秒针画笔 */
private Paint mSecondHandPaint;
/* 时针角度 */
private float mHourDegree;
/* 分针角度 */
private float mMinuteDegree;
/* 秒针角度 */
private float mSecondDegree;
/* 时针路径 */
private Path mHourHandPath = new Path();
/* 分针路径 */
private Path mMinuteHandPath = new Path();
/* 秒针路径 */
private Path mSecondHandPath = new Path();
public MiClockView(Context context) {
super(context);
}
public MiClockView(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
TypedArray ta = context.obtainStyledAt