凉风起天末,君子意如何.闲来无事,开始做一下自定义控件的学习.手写一个仪表盘.效果是下面酱紫的.
下面上一下代码:
**
* Created by lz on 2018/10/24.
* 功能描述:仪表盘
*/
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
public class DashBoard extends View {
private static final int ANGLE = 120;
private static final float RADIUS = Utils.dp2px(150);
private static final float LENGTH = Utils.dp2px(100);
PathDashPathEffect mPathDashPathEffect;
Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
Path path = new Path();
public DashBoard(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
}
{
paint.setStyle(Paint.Style.STROKE);
//paint.setColor(getResources().getColor(R.color.colorPrimary));
paint.setStrokeWidth(Utils.dp2px(2));
path.addRect(0, 0, Utils.dp2px(2), Utils.dp2px(10), Path.Direction.CW);
Path arc = new Path();
arc.addArc(getWidth() / 2 - RADIUS, getHeight() / 2 - RADIUS,
getWidth() / 2 + RADIUS, getHeight() / 2 + RADIUS,
90 + ANGLE / 2, 360 - ANGLE);
PathMeasure pathMeasure = new PathMeasure(arc,false);
mPathDashPathEffect = new PathDashPathEffect(path, (pathMeasure.getLength()-Utils.dp2px(2)) / 20, 0, PathDashPathEffect.Style.ROTATE);
}
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
//画线
canvas.drawArc(getWidth() / 2 - RADIUS, getHeight() / 2 - RADIUS,
getWidth() / 2 + RADIUS, getHeight() / 2 + RADIUS,
90 + ANGLE / 2, 360 - ANGLE, false, paint);
//画刻度
paint.setPathEffect(mPathDashPathEffect);
canvas.drawArc(getWidth() / 2 - RADIUS, getHeight() / 2 - RADIUS,
getWidth() / 2 + RADIUS, getHeight() / 2 + RADIUS,
90 + ANGLE / 2, 360 - ANGLE, false, paint);
paint.setPathEffect(null);
//画指针
canvas.drawLine(getWidth()/2,getHeight()/2,
getWidth()/2+(float) Math.cos(Math.toRadians(getAngleFromMark(5)))*LENGTH,
getHeight()/2+(float) Math.sin(Math.toRadians(getAngleFromMark(5)))*LENGTH,paint);
}
int getAngleFromMark(int mark){
return (int)(90+(float)ANGLE/2+(360-(float)ANGLE)/20*mark);
}
}
public class Utils {
//dp转px
public static float dp2px(float dp){
return TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,dp,
Resources.getSystem().getDisplayMetrics());
}
}