本文参照Hongyang的CSDN博客(自定义控件之起步)所写,具体细节优化请见这里。如有错误欢迎指正,如有侵权,请联系我删除。
GitHub:https://github.com/youlookwhat/CustomViewStudy
1. 博客目录
2. 实践代码
3. 项目图片(部分)
首页目录.png自定义View(一).png
自定义View(三) 圆环交替 等待效果.png
4. 代码优化
1. [CustomTitleView优化](https://github.com/youlookwhat/CustomViewStudy/blob/master/file/Android 自定义View (一)优化.md)
1.1 关于文字显示优化:
// int textWidth = mRect.width(); // 这样mRect.width()直接计算出来的会有误差
float textWidth = mPaint.measureText(mTitleText);
// int textHeight = mRect.height(); //直接计算出来的会有误差
Paint.FontMetrics fontMetrics = mPaint.getFontMetrics();
float textHeight = Math.abs((fontMetrics.bottom - fontMetrics.top));
1.2 onDraw里画Text时起点坐标优化:
canvas.drawText(mTitleText, getWidth() / 2 - mRect.width() / 2 - mRect.left, getHeight() / 2 + mRect.height() / 2, mPaint);
canvas.drawText(String text,float x,float y,Paint paint); x和y是绘制时的起点坐标(左下角);
" - mRect.left": 就很标准,居中显示(csdn:yql_running解决)
2. 圆环交替 等待效果优化
2.1 新开线程画线,离开页面时线程未关闭优化
// 用来开关线程
private boolean isContinue;
// 绘图线程
new Thread() {
public void run() {
while (isContinue) {
mProgress++;
if (mProgress == 360) {
mProgress = 0;
isNext = !isNext;
}
Log.e("--------", "在执行..");
postInvalidate();
try {
Thread.sleep(100 / mSpeed);// 这里优化了一下,值越大,速度越快
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}.start();
Activity相关代码:
@Override
protected void onStop() {
super.onStop();
customProgressBar01.setContinue(false);
customProgressBar02.setContinue(false);
customProgressBar03.setContinue(false);
}
2.2 用户宽高若设置wrap_content时优化
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
// super.onMeasure(widthMeasureSpec, heightMeasureSpec);
int modeWidth = MeasureSpec.getMode(widthMeasureSpec);
int sizeWidth = MeasureSpec.getSize(widthMeasureSpec);
if (modeWidth == MeasureSpec.EXACTLY) {
width = sizeWidth;
} else {//默认宽度200dp
width = (int) getContext().getResources().getDimension(R.dimen.width);
}
Log.e("------------->", "width:" + width);
setMeasuredDimension(width, width);
}
网友评论