1. 程式人生 > >自定義控價之實現儀表盤 搬運自 rengwuxian

自定義控價之實現儀表盤 搬運自 rengwuxian

     涼風起天末,君子意如何.閒來無事,開始做一下自定義控制元件的學習.手寫一個儀表盤.效果是下面醬紫的.

下面上一下程式碼: 

**
 * 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());
    }
}