美文网首页AndroidAndroid干货自定义View
Android 自定义控件之起步代码实践总结

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

作者: Jinbeen | 来源:发表于2016-11-13 11:46 被阅读705次

    本文参照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 自定义控件之起步代码实践总结

      本文链接:https://www.haomeiwen.com/subject/jnbtpttx.html