Android Hongyang博客自定义View练习与优化

所写内容基本来自Hongyang的CSDN博客,以及练习时可以优化处进行优化:
对应GitHub地址:https://github.com/youlookwhat/CustomViewStudy

一. 博客目录:

1. Android 自定义View (一)

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

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

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

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

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

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


二. 主要源码


三. 项目图片(部分)


四. 代码优化

1. CustomTitleView优化

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解决)

1.3 参考文档

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);
    }

五. Thanks

  • 1
    点赞
  • 3
    收藏
  • 打赏
    打赏
  • 11
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:编程工作室 设计师:CSDN官方博客 返回首页
评论 11

打赏作者

Jinbeen

一份支持与认可

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值