zoukankan      html  css  js  c++  java
  • Android布局优化策略

    我们要知道布局是否合理,可以通过Hierarchy Viewer这个工具。打开Hierarchy Viewer(定位到tools/目录下,直接执行hierarchyviewer的命令,选定需要查看的Process,再点击Load View Hierarchy会显示出当前界面的布局Tree。在每个模块的Traffic light上有三个灯,分别代表了Measure, Layout and Draw三个步骤的性能。如果有红灯了,那么就说明这里有点问题,需要优化。

    如果你在布局中在LinearLayout中使用了layout_weight。我们需要仔细评估到底是否需要使用那样的布局,尽量避免使用layout_weight。因为这样会计算两次。

    如果你想要观察和解决过度绘制,又一个简单实用的窍门是移除Window默认的Background,然后在布局文件中进行添加背景。

    canvas.clipRect()这个方法可以让你选择你需要绘制的区域,这里可以是Rect也可以是path,可以方便简单的解决自定义view过度绘制的问题。

    这个方法可以指定一块矩形区域,只有在这个区域内才会被绘制,其他的区域会被忽视。
    除了clipRect方法之外,我们还可以使用canvas.quickreject()来判断是否没和某个矩形相交,从而跳过那些非矩形区域内的绘制操作。

    例子:

    如果一个自定义view是这样绘制的

        private Paint mPaint;
        private Bitmap mBitmap;
        private int mPadding = 0;
        
        public CView(Context context, AttributeSet attrs, int defStyleAttr) {
            super(context, attrs, defStyleAttr);
            mPaint = new Paint();
            mBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.kale);
        }
    
        @Override
        protected void onDraw(Canvas canvas) {
            super.onDraw(canvas);
            for (int i = 0; i < 2; i++) {
                canvas.save();
                Rect rect = new Rect(mPadding, 0, 100 + mPadding, mBitmap.getWidth() + mPadding);
               
                canvas.drawBitmap(mBitmap,mPadding,0,mPaint);
                canvas.restore();
                mPadding += 100;
            }
            canvas.drawBitmap(mBitmap, mPadding, 0, mPaint);
        }
    }

    那么检测到的情况如下:

    可以很明显的看到有重叠的部分,重叠的部分出现了严重的红色。那么当我们用clipRect来指定view绘制的区域后会如何呢?

    可以很明显的看见重叠的部分没有了,原因就是我们在代码中指定了只绘制可见的部分,重叠的不可见部分不会去绘制。

     @Override
        protected void onDraw(Canvas canvas) {
            super.onDraw(canvas);
            for (int i = 0; i < 2; i++) {
                canvas.save();
                Rect rect = new Rect(mPadding, 0, 100 + mPadding, mBitmap.getWidth() + mPadding);
                canvas.clipRect(rect);
                canvas.drawBitmap(mBitmap,mPadding,0,mPaint);
                canvas.restore();
                mPadding += 100;
            }
            canvas.drawBitmap(mBitmap, mPadding, 0, mPaint);
        }
  • 相关阅读:
    ## 序列化和反序列化
    C#小型资源管理器
    codeforces #310 div1 B
    codeforces #310 div1 A
    BZOJ 1030 文本生成器
    BZOJ 2806 cheat
    BZOJ 2553 禁忌
    BZOJ 4199 品酒大会
    codeforces #309 div1 D
    codeforces #309 div1 C
  • 原文地址:https://www.cnblogs.com/tianzhijiexian/p/4644693.html
Copyright © 2011-2022 走看看