面试

Android项目中的优化 -- 布局优化

2018-02-04  本文已影响87人  gzfgeh

0. 概念

1. 工具

既然是优化,肯定要能看到效果,所以要有数据显示证明优化确实起到了作用

有了上面两个工具就可以直观的看到优化的效果了

2. 优化方法

  1. LinearLayout效率优于RelativeLayout(同样布局嵌套的情况下),
    RelativeLayout会onMeasure两次
  2. 不带weight的LinearLayout效率优于带weight的LinearLayout,
    weight属性会onMeasure两次
  3. RelativeLayout有利于减少布局的嵌套,LinearLayout只能必须指定子View的方向
  4. ConstraintLayout 优于任何布局(只是学习了解真正项目中还没用过),学习文章ConstraintLayout
  5. include 和 merge :布局复用,比如toolbar布局
  6. ViewStub :懒加载布局,初始化的时候不会初始化ViewStub,比如每个网络请求页面都有的加载失败、网络错误、未登录等页面
  7. Space:一般用于分割线,onDraw函数是空了,效率高,比如个人中心中的分割线
  8. 不要在Activity的主题中为Activity设置默认的背景图片,这样会导致Activity占用的内存翻倍
  9. 用SurfaceView和TextureView 绘制复杂布局和高清大图(也可以使用BitmapRegionDecoder来加载),因为他们都是在非UI线程绘制UI,不会阻塞主线程(项目中还未用到,需要研究).
  10. Button的点击效果:
    尽量不要用两个图片来设置selector,会占用两倍内存
    尽量用纯颜色设置点击效果
    必须有图片的(业务要求),尽量用.9.png图片
    不能用.9.png的用懒加载方式
view.setOnTouchListener(new OnTouchListener() {
               @Override
               public boolean onTouch(View v, MotionEvent event) {
                   switch(event.getAction()){
                   case MotionEvent.ACTION_DOWN:{
                       v.setBackgroundResource(pressResId);
                   }
                   break;
                   case MotionEvent.ACTION_MOVE:{
                       v.setBackgroundResource(pressResId);
                   }
                   break;
                   case MotionEvent.ACTION_UP:{
                       v.setBackgroundResource(normalResId);
                   }
                   break;
                   default:{
                       
                   }
                   break;
                   }
                   return false;
               }
           });
  1. ImageView的点击效果也用onTouch事件,用setColorFilter来实现效果,不要用两张图片
  2. Material Design效果的控件原生都支持点击效果,都不用两张图片
  3. 尽量合并子控件减少布局嵌套,比如ImageView和TextView可以转换成TextView+drawable等情况
  4. recyclerview scrollview 尽量不嵌套,可以给recyclerview添加addHeader方法来减少嵌套

3. RecyclerView优化

这个是布局优化的主要部分,因为一个APP中有太多的RecyclerView(以前是ListView),而且卡顿现象一般都在RecyclerView的快速滑动中。

4. Android适配方案

5. 自定义View

onCreate -> onFinishInflate -> onAttachToWindow -> onMeasure -> onSizeChanged -> onLayout -> onDraw -> onDetachedFromWindow
注意点:
0. onFinishInflate是xml加载完成以后调用
1. onDetachedFromWindow 在这里做释放对象、资源和结束线程的操作
2. invalidate() 和 postInvalidate() 是主动调用onDraw的方法
3. requestLayout() 是主动调用onMeasure 和 onLayout的方法
4. 如果有动画只是调用onDraw没有调用onMeasure 和 onLayout,所以View的实际大小没有改变
5. 测量模式下的三种模式MeasureSpec.UNSPECIFIED、MeasureSpec.EXACTLY、MeasureSpec.AT_MOST
6. 重写onMeasure方法的时候,要特别处理MeasureSpec.AT_MOST和View的padding这两种情况,在测量出宽高以后,一定要设置setMeasuredDimension这个函数.
7. 自定义View主要处理onMeasure,自定义ViewGroup主要处理onLayout,如果是组合View或者ViewGroup主要处理onDraw
8. canvas操作

        canvas.translate(100, 50) 平移
        canvas.scale(2, 4); 缩放
        canvas.rotate(30); 旋转
        canvas.save(); 保存状态
        canvas.restore(); 恢复状态
        canvas.drawText(); 画文字
        canvas.drawCircle(); 画圆
        canvas.drawLine(); 画线
        canvas.drawOval(); 画椭圆
        canvas.drawArc(); 画弧度
        canvas.drawRoundRect(); 画矩形
        canvas.drawPath(); 画多边形
        canvas.drawPath(); 画贝塞尔曲线
        canvas.drawBitmap(); 画图片
        简单有规则的东西直接画,复杂的用Path
上一篇 下一篇

猜你喜欢

热点阅读