Android View学习总结

目录

分辨率与资源文件

View绘制

避免卡顿

View事件分发机制

自定义View

Bitmap

图片库

一些重要View

RecycleView 和ListView

其他

动画框架实现原理

状态栏

其它


分辨率与资源文件

inDensity 表示目标图片的 dpi(放在哪个资源文件夹下),inTargetDensity 表示目标屏幕的 dpi

View绘制

  1. Requestlayout,onlayout,onDraw,DrawChild区别与联系
  2. invalidate和postInvalidate的区别及使用:invalidate在主线程中调用,postInvalidate在子线程中调用,最终调的也是view.invalidate();

避免卡顿

1.主线程不要做耗时操作;

2.界面布局尽量简单,避免下一个 vsync 信号来的时候这一帧还没画完,造成掉帧。

View事件分发机制

Android事件分发机制

OnTouchEvent()方法是获取的对屏幕的各种操作,比如向左向右滑动,点击返回按钮等等。属于一个宏观的屏幕触摸监控。

OnTouchListener()方法是获取某一个控件某一个View的点击监控。

onTouchListener的onTouch方法优先级比onTouchEvent高,会先触发。假如onTouch方法返回false,会接着触发onTouchEvent,反之onTouchEvent方法不会被调用。内置诸如click事件的实现等等都基于onTouchEvent,假如onTouch返回true,这些事件将不会被触发。


点击事件被拦截,但是想传到下面的View,如何操作?

使用 getParent().requestDisallowInterceptTouchEvent(true);

​​

自定义View

参考:Android自定义View全解

分ViewGroup 和 View,是基于View, ViewGroup新增,还是基于Android已有的扩展。扩展比较简单。

直接继承View时需要有几点注意:

1、在onDraw当中对padding属性进行处理。
2、在onMeasure过程中对wrap_content属性进行处理。
3、至少要有一个构造方法。

直接集成ViewGroup更复杂:要复写onMeasure, onLayout, 还需考虑事件分发问题。


如何优化自定义View:

1. 减少onDraw的调用,多使用有参的invalidate;

2. 利用GPU硬件加速,(只用来处理其擅长处理的图片);

3. 不要在onDraw方法内创建对象;

4. View也应该尽可能的保存其属性。

自定义View如何提供获取View属性的接口:自定义属性。

Bitmap

Bitmap对象的理解:包含java部分和C部分。Android自动回收机制只能释放java部分,要通过recycle去释放c部分。

 android 3.0 到7.1 bitmap是放在dalvik heap中, 8.0 以后放在native heap中

不要在主线程处理bitmap;降低采样率;不用时调用recycle及时释放。

Bitmap如何处理大图,如一张30M的大图,如何预防OOM?  降低分辨率,缩放。

参考:Bitmap使用优化

图片库

  1. 图片库对比:ImageLoader, Picasso,Glide,Fresco 等。Glide和picasso使用及区别
  2. LRUCache原理:维护了一个集合LinkedHashMap,该LinkedHashMap是以访问顺序排序的。当调用put()方法时,就会在结合中添加元素,如果满了就用LinkedHashMap的迭代器删除队首元素,即近期最少访问的元素。当调用get()方法访问缓存对象时,就会调用LinkedHashMap的get()方法获得对应集合元素,同时会更新该元素到队尾。 默认大小一般设置为运行时内存的1/8。LruCache用于内存级缓存,可基于其做三级缓存。
  3. 图片加载原理:通过三级缓存机制获取Bitmap对象,在draw方法中用canvas绘制出来。参考:三级缓存基本使用
  4. Glide内存缓存如何控制大小?

Glide源码解析

Glide实现原理解析

主要涉及缓存机制,生命周期管理。
    缓存机制:活动缓存(CPU中的一块内存,是寄存器与外部内存之间的桥梁)、内存、磁盘。BitmapPool(复用池)防止内存抖动。
    生命周期管理:可传Application、Activity, Fragment, View。与传入的对象的生命周期绑定。

一些重要View

RecycleView 和ListView

  1. RecycleView 和ListView区别,ListView并没有被废弃,参考 RecyclerView和ListView的区别 ,源码分析:
    1. ListView只能在垂直方向上滚动;recycleView能支持水平、网格、瀑布流方式;
    2. RecycleView能局部刷新,就能避免调用许多无用的bindView;容易实现添加item、删除item的动画效果。容易实现拖拽、侧滑删除等功能。
    3. ListView通过AdapterView.OnItemClickListener接口来探测点击事件。而RecyclerView则通过RecyclerView.OnItemTouchListener接口来探测触摸事件。它虽然增加了实现的难度,但是却给予开发人员拦截触摸事件更多的控制权限;
    4. ListView 可以设置选择模式,单项选择,多项选择等;
    5. ListView能通过addHeaderView(), addFooterView()添加头视图和尾视图。
    6. 列表页展示界面,需要支持动画,或者频繁更新,局部刷新,建议使用RecyclerView,更加强大完善,易扩展;其它情况(如微信卡包列表页)两者都OK,但ListView在使用上会更加方便快捷;

其他

ListView图片加载错乱的原理和解决方案:  使用了缓存convertView进行优化引起的。 解决方法:给图片设置tag,若tag正确才显示。

动画框架实现原理

调整View在ParentView中的起始坐标、旋转角度等。

状态栏

下拉状态栏不会影响activity的生命周期

其它

  1. AlertDialog, popupWindow, Activity区别:AlertDialog是非阻塞式对话框:AlertDialog弹出时,后台还可以做事情;而PopupWindow是阻塞式对话框:PopupWindow弹出时,程序会等待,在PopupWindow退出前,程序一直等待,只有当我们调用了dismiss方法的后,PopupWindow退出,程序才会向下执行。
  2. ViewPager使用细节,如何设置成每次只初始化当前的Fragment,其他的不初始化? 用懒加载模式,在setUserVisibleHint 中判断可见时才进行加载。
  3. 计算一个view的嵌套层级:递归调用view.getParent ;
  4. 约束布局Constraint;

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值