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

本文参照Hongyang的CSDN博客(自定义控件之起步)所写,具体细节优化请见这里。如有错误欢迎指正,如有侵权,请联系我删除。

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

1. 博客目录

  • 1. Android 自定义View (一)

  • 2. Android 自定义View (二) 进阶

  • 3. Android 自定义View (三) 圆环交替 等待效果

  • 4. Android 自定义View (四) 视频音量调控

  • 5. Android 手把手教您自定义ViewGroup(一)

  • 6. Android 深入理解Android中的自定义属性

  • 7. Android ViewDragHelper完全解析 自定义ViewGroup神器

2. 实践代码

  • 1.CustomTitleView.java
  • 2.CustomImageView.java
  • 3.CustomProgressBar.java
  • 4.CustomVolumControlBar.java
  • 5.CustomImgContainer.java
  • 6.DeepUnderstandAttrActivity.java
  • 7.VDHDeepLayout.java

3. 项目图片(部分)

Android 自定义控件之起步代码实践总结_第1张图片
首页目录.png

Android 自定义控件之起步代码实践总结_第2张图片
自定义View(一).png

Android 自定义控件之起步代码实践总结_第3张图片
自定义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. 下载

  • CustomViewStudy.apk

6. 参考链接

  • http://blog.csdn.net/lmj623565791/article/category/2680591

7. Thanks

  • CSDN:张鸿洋

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

你可能感兴趣的:(Android 自定义控件之起步代码实践总结)