android米尺
最近在自己的項目中使用到了米尺,在這裏記錄下來,也分享給大家。
要繪製米尺,那麼必須知道米尺由哪些要素組成。米尺由數字和刻度線線組成。 刻度線又包含長中短3種線。刻度線與相鄰刻度線之間存在的距離爲最小單位。瞭解了米尺的要素,我們就可以開始在代碼中定義米尺的屬性了。
米尺的方向(垂直或水平)private int mOrientation = VERTICAL;
米尺的背景顏色(當然你也可以定義drawable)
private int mBackgroundColor;
刻度線的長度:
private float mShortLineLength; //短線長度
private float mLongLineLength; //長線長度
private float mMiddleLineLength; //中線成都
刻度線的顏色:
private int mLineColor; //刻度線顏色
刻度線的寬度:
private float mLineWidth; //刻度線的寬度
相鄰刻度線之間的距離
private double space; //刻度線的距離
數字的顏色:
private int mTextColor;
數字字體大小:
private float mTextSize;
屬性定義的差不多了,那我們還缺少什麼呢?對,我們缺少對相鄰刻度之間的大小的定義。如何才能確定這個大小呢?對,我們需要的是求出屏幕的物理大小和屏幕的分辨率。如何才能獲取到屏幕的物理長寬?直接看代碼
Point point = new Point();
//屏幕實際分辨大小,包含通知欄
getWindowManager().getDefaultDisplay().getRealSize(point);
DisplayMetrics dm = getResources().getDisplayMetrics();
//獲取到的是英寸值*25.4
float physicsW = (point.x/ dm.xdpi)*25.4; //屏幕物理寬度
float physicsH = (point.y / dm.ydpi)*25.4; //屏幕物理長度
知道屏幕物理長度,屏幕的的實際分辨率。我們只需要知道自定義控件的大小,重載onMeasure。就知道space的大小了
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec)
萬事具備,只欠繪製onDraw
canvas.drawColor(mBackgroundColor); //繪製背景
switch (mOrientation) {
case VERTICAL:
drawVertical(canvas);
break;
case HORIZONTAL:
drawHorizontal(canvas);
break;
}
具體繪製,這裏就不貼出來了。源碼:https://github.com/zhao007z4/ruler
參考:https://blog.csdn.net/lincyang/article/details/42679589