自定義控價之實現儀表盤 搬運自 rengwuxian
阿新 • • 發佈:2018-12-17
涼風起天末,君子意如何.閒來無事,開始做一下自定義控制元件的學習.手寫一個儀表盤.效果是下面醬紫的.
下面上一下程式碼:
** * 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()); } }