安卓自定义View的技巧记录
2018-08-22 本文已影响7人
奋斗小青年Jerome
一、基础API的使用
-
Canvas
Canvas的常规操作API.png
1.记录一些常用但是易混淆的API案例
画线:
当设置画笔(paint)的宽度之后,真正draw时,坐标原点在Y轴上是去掉了线宽的一半,而不是从直线的最左下角开始的,这一点尤其是在画笔宽度设置过大时很明显
private void initView(Context context) {
mPaint = new Paint();
mPaint.setColor(Color.RED);
mPaint.setAntiAlias(true);
mPaint.setStrokeWidth(10);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.drawLine(50,50,300,50,mPaint);
}

画矩形:画矩形时,画笔宽度对矩形的宽度没有影响


画圆弧
canvas.drawArc()接收的前部分参数,可以是坐标,也可以是矩形,它其实就是一个矩形的内切圆
image.png

可以看到,绿色矩形坐标分别为:左上角(150,150),右下角(300,300),那么红色圆弧就是其内切圆
startAngle是圆弧绘制的起始位置,0°即时钟的三点钟位置,扫描的方向跟时钟方向一致
注意:画圆弧同样要注意画笔的宽度,某些情况,矩形坐上右下的坐标原点需要减掉画笔宽度
画路径
drawPath涉及的API主要是moveTo和lineTo,moveTo是将path移动到某个点,lineTo是沿着坐标进行绘制,并连接下一个坐标点,形成路径
path其实是一个很伟大的api,能够做非常多炫酷的东西,案例给出了pathMeasure结合属性动画,得到一个path动画
PathMeasuer结合Path来做炫酷的path动画
image.png
image.png
利用pathMeasure进行动画
//path进行测量之后,每个比例下的path片段被存放在这个dst中
mDst = new Path();
mPathMeasure = new PathMeasure();
mPath.reset();
mPath.moveTo(mPathStartX, mPathStartY);
mPath.lineTo(mPathStopX1, mPathStopY1);
mPath.lineTo(mMPathStop2X, mMPathStop2Y);
mPath.lineTo(mPathStop3X, mPathStop3Y);
//测量path片段
mPathMeasure.setPath(mPath, false);
mPathLength = mPathMeasure.getLength();
`
mDst.reset();
//解决硬件加速的bug
mDst.lineTo(0, 0);
//一个变化因子内,path的长度
float stop = mPathLength * mRate;
mPathMeasure.getSegment(0, stop, mDst, true);
canvas.drawPath(mDst, mPathPaint);
