1. 程式人生 > 其它 >自定義控制元件-01-繪圖基礎-繪製尺子

自定義控制元件-01-繪圖基礎-繪製尺子

DipUtil

ublic class DipUtil {
    /**
     * 根據手機的解析度從 dp 的單位 轉成為 px(畫素)
     */
    public static int dipTopx(Context context, float dpValue) {
        final float scale = context.getResources().getDisplayMetrics().density;
        return (int) (dpValue * scale + 0.5f);
    }

    /**
     * 根據手機的解析度從 px(畫素) 的單位 轉成為 dp
     */
    public int pxTodip(Context context, float pxValue) {
        final float scale = context.getResources().getDisplayMetrics().density;
        return (int) (pxValue / scale + 0.5f);
    }
}

DemoAView

public class DemoAView extends View {
    // 刻度尺高度
    private static final int DIVIDING_RULE_HEIGHT = 70;
    // 距離左右間
    private static final int DIVIDING_RULE_MARGIN_LEFT_RIGHT = 10;

    // 第一條線距離邊框距離
    private static final int FIRST_LINE_MARGIN = 5;
    // 打算繪製的釐米數
    private static final int DEFAULT_COUNT = 9;

    private Resources mResources;
    private int mDividRuleHeight;
    private int mHalfRuleHeight;
    private int mDividRuleLeftMargin;
    private int mFirstLineMargin;

    private Paint mPaint;
    private int mWidth,mHeight;

    private Rect mOutRect;

    public DemoAView(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
        initData();
    }
    private void initData() {
        mResources = getResources();
        mPaint = new Paint();
        mPaint.setAntiAlias(true);
        mPaint.setColor(0xffff0000);
        mPaint.setStrokeWidth(4);
        mPaint.setStyle(Paint.Style.STROKE);

        //資料轉為對應畫素值:
        mDividRuleHeight = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,
                DIVIDING_RULE_HEIGHT, mResources.getDisplayMetrics());

        mHalfRuleHeight = mDividRuleHeight / 2;// 整數標記線

        mDividRuleLeftMargin = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,
                DIVIDING_RULE_MARGIN_LEFT_RIGHT, mResources.getDisplayMetrics());
        mFirstLineMargin = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,
                FIRST_LINE_MARGIN, mResources.getDisplayMetrics());

    }



    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        //canvas.translate( )
        //繪製外框
        drawOuter(canvas);
        //繪製刻度
        drawLines(canvas);
        //繪製數字
        drawNumbers(canvas);
    }

    private void drawNumbers(Canvas canvas) {
        canvas.drawText("1",60,140,mPaint);
    }

    private void drawLines(Canvas canvas) {
        canvas.save();
        canvas.translate(60,0);
        int top = 80;
         for(int i = 0;i<100;i++){
             if(i%10 == 0){
                 top = 80;
             }else if(i%5==0){
                 top = 60;
             }else{
                 top = 40;
             }

             canvas.drawLine(0,20,0,top,mPaint);
             canvas.translate(10,0);

         }
         //畫布狀態回滾
        canvas.restore();
    }

    private void drawOuter(Canvas canvas) {
        mOutRect = new Rect(50,20,1050,100);
        canvas.drawRect(mOutRect,mPaint);

    }
}