一、坐标系:
1、屏幕坐标系
屏幕坐标系以手机屏幕的左上角为坐标原点,过的原点水平直线为X轴,向右为正方向;过原点的垂线为Y轴,向下为正方向。
2、View坐标系
View坐标系以父视图的左上角为坐标原点,过的原点水平直线为X轴,向右为正方向;过原点的垂线为Y轴,向下为正方向。
View内部拥有四个函数,用于获取View的位置
getTop();//View的顶边到其Parent View的顶边的距离,即View的顶边与View坐标系的X轴之间的距离
getLeft();//View的左边到其Parent View的左边的距离,即View的左边与View坐标系的Y轴之间的距离
getBottom();//View的底边到其Parent View的顶边的距离,即View的底边与View坐标系的X轴之间的距离
getRight();//View的右边到其Parent View的左边的距离,即View的右边与View坐标系的Y轴之间的距离
图示如下:
event.getX();//触摸点相对于其所在组件坐标系的坐标
event.getY();event.getRawX();//触摸点相对于屏幕默认坐标系的坐标event.getRawY();
如下图所示:
PS:其中相同颜色的内容是对应的,其中为了显示方便,蓝色箭头向左稍微偏移了一点.
4.核心要点
1.在数学中常见的坐标系与屏幕默认坐标系的差别
2.View的坐标系是相对于父控件而言的
3.MotionEvent中get和getRaw的区别
二、绘制过程
1、构造函数初始化
AttributeSet:是节点的属性集合
defStyleAttr:默认风格,是指它在当前Application或Activity所用的Theme中的默认Style
实例如下:
public class BaseChart extends View { private String TAG = "BaseChart"; public BaseChart(Context context) { this(context,null); } public BaseChart(Context context, AttributeSet attrs) { this(context, attrs,R.attr.base_chart_style); } public BaseChart(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { this(context, attrs, defStyleAttr,R.style.base_chart_res); } public BaseChart(Context context, @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes) { super(context, attrs, defStyleAttr, defStyleRes); TypedArray array = context.obtainStyledAttributes(attrs, R.styleable.base_chart, defStyleAttr,defStyleRes); int n = array.getIndexCount(); for (int i=0; i" + array.getString(attr));
break;
case R.styleable.base_chart_attr2:
Log.d(TAG,"attr2 =>" + array.getString(attr));
break;
case R.styleable.base_chart_attr3:
Log.d(TAG,"attr3 =>" + array.getString(attr));
break;
case R.styleable.base_chart_attr4:
Log.d(TAG,"attr4 =>" + array.getString(attr));
break;
case R.styleable.base_chart_attr5:
Log.d(TAG,"attr5 =>" + array.getString(attr));
break;
}
}
}
}
obtainStyledAttributes(AttributeSet set, int[] attrs, int defStyleAttr, int defStyleRes)新增加的attrs属性说明如下:
attrs:默认属性,告诉系统需要获取那些属性的值,有多种Value类型,这里使用string类型,如:
在attrs.xml中添加