自定義控制元件-01-繪圖基礎-繪製尺子
阿新 • • 發佈:2022-02-22
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); } }