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