记编程学习过程中所谓设计思想的总结

本文仅记录个人学习中对一些组件产品或者一些其他的设计思想上面的理解,如果您有兴趣在这篇文章停留的时间长一点,很期待您能写下您的思考或者对某个问题的见解,或者对某个原理的不明白之处,共同交流,共同进步,水平有限,不喜勿喷,谢谢!

Android

View

可滑动的View

要实现的效果
  1. 能上下滑动且丝滑顺畅
解决思路
  • 首先来谈这个滑动的问题

    1,对计算机屏幕显示的原理,我是这么理解的,首先他是一个个可发光的点,我们通过控制这些点的不同亮灭组合,就能呈现一幅美丽的图片
    2,对于计算机能显示出实时变化的像视频一样的,我的理解是,通过我们人眼的视觉暂留时间,计算机快速的运算,使得在一秒内有很多次的不同图片(不同点的亮灭组合)展示,我们就感觉到好像是一个连贯的视频呈现。
    3,所以Android普通定型的View展示很好理解,也就是不会随着时间在屏幕上移动的View,我们只需要再需要的时候改变这个View的一些属性,比如说颜色,我们就能实时的看到View的变化了,那么可滑动的View是怎么做的呢?比如ListView等,我们究竟是怎么控制View的位置的。
    4,滑动是一个什么样子的事件呢?就是上一次这个View的位置假设是(x1,y1),下次的位置就可能变成了(x2,y2).这个差值是怎么知道的呢?手机本身的传感器会感知到你的手指在屏幕上的动作。并转换成特定的表示,比如我们将手机屏幕看成一个坐标轴,我们就很容易的能表示出每次手指在屏幕上的动作轨迹,进而就知道,如果需要改变某个View的位置,那么他的下一个位置的坐标。
    5,Android中有ViewGroup,是专门用来控制位置变化属性相同的一组View,比如,LinearLayout控制的就是位置属性随线性变化的一组View。ViewGroup最大的一个工作就是负责告知每个子View应该摆放的位置。也就是onLayout方法。
    6,那么,我们所谓的滑动是怎么产生的呢?其实就是在每次手指的滑动事件被当前ViewGroup处理的时候,ViewGroup发现他能够滑动,或者说ViewGroup发现他还有更多的子View可以通过将其他子View的坐标改变的方式展示出来,也就是所谓偏移,比如线性VIewGroup,如果它本身可接受滑动事件,并且自身的View没有展示完全,在发生了从下往上滑动的事件之后,他就可以判断出此时他可以发生多少偏移量(因为滑动的距离可能比他未展示的View高度大,也有可能小),所以这个线性ViewGroup在下次显示的时候就可以统一把子VIew的坐标往上移动,可能这样做之后最前面的View就不在ViewGroup的范围之内了,也就不能显示了,但是其他的之前未显示的View就会因为显示坐标的改变得以显示。

    • 总结
    • 1,我们只要根据传入事件的偏移量来控制子VIew位置的摆放,就能达到滑动的效果了。
    • 2,对于如果发现他的坐标在偏移之后不在ViewGroup之内了,那就不能给他显示了。
    • 3,这样子,我们就知道了下次显示的时候需要绘制的View集合了。
  • 再来说说滑动流畅的问题

    1,首先,滑动的时候首先发生的事情是,会让之前没有显示的View显示出来,那么因为显示的是相对之前来说是没有显示过的VIew,所以我们需要创建这些个新View,而当快速滑动的时候,就会出现很多的创建View事件,而这些创建又是非常耗时的,所以会发现非常的卡。
    2,说到这里我突然想到了计算机里面读取硬盘数据的场景,须知,在现在虚拟化内存盛行的时代,我们的程序并不是从一开始就全部装入内存的,刚开始只是装入一些必须的数据,这么说,够用就行,因为大多数程序的运行用到的都是一小部分代码,完全没必要把所有的代码数据都装入到内存中,当发现不够用的时候,我们再去硬盘中去读取,这样子如果多次读取到相同部分的代码数据的话,其实效率是很低的,因为他受到硬盘io速率的限制,所以我们在计算机里面加入了多级缓存。缓存的作用就是比如第一次我们用到了A数据,在第二次,第三次的时候我们用到了B数据,C数据,而这时发现内存不够了,所以先把A数据从内存中删掉,这样子当我们第四次再想要使用A数据的话,就必须重新去硬盘中拿,但是如果我们事先在高速缓存中有最近时刻使用过的数据A的拷贝,我们就可以很快速的拿到数据A,这样就能大大提升程序执行的效率。
    3,所以,这里我们如果不想这么频繁的创建View的话,就得看看前面的已经被隐藏掉的View有没有可以直接复用的。因为如果View样子相同的话,可能我们只需要将一些数据变一下就能直接显示了,这相对来说是非常高效的。
    4,那么,我们每次拿到可复用的View都需要重新绑定数据吗?如果这个View就是上次刚刚显示过的呢?是想这种场景,先上滑一下,再下滑一下,这样子,在最上面的View其实只是消失了很短一段时间就重新显示了,这种情况我们可能没必要重新去给他绑定数据,如果我们的缓存原理记住他是不是上次刚显示过的,是不是就可以判断可否直接显示了呢。

    • 总结
    • 做二级缓存,第一级的缓存可以直接拿来用,第二级的缓存需要重新绑定数据才能用。

你可能感兴趣的:(安卓)