Android 自定义控件之起步代码实践总结

本文参照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);
    }

5. 下载

6. 参考链接

7. Thanks

GitHub:https://github.com/youlookwhat/CustomViewStudy

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 167,436评论 24 706
  • afinalAfinal是一个android的ioc,orm框架 https://github.com/yangf...
    passiontim阅读 14,248评论 2 43
  • 一晃都十点半了! 该睡觉了,可是还是觉得应该写点什么! 这一次参加写写团,看到那么多优秀文章,我反而一点儿压力都没...
    常春静阅读 128评论 0 0
  • 掐一生恩宠 掏一空星尘 嘘一曲箫瑟 描一面虚眉 揪一世晕沉 深院纷人心 忠情一世 盼君臣 野草诗会:"雪花体"原创...
    墙角的梅花阅读 153评论 0 8
  • 为了帮助广大中小企业主对企业品牌推广知其然,知其所以然,令哥归纳总结了中小企业品牌推广的6大要素,来帮助大家思考这...
    巨子令阅读 259评论 0 3