00:00
看着啊,接着我们上这个讲,我们在这还有三个没讲绘制,事件处理和死亡,那事件处理呢,我们基本上已经讲完了,所以主要还是绘制和死亡。啊,绘制呢特别重要,我们来看一下。首先上绘制的作用是什么,那这一个流程它的作用其实非常简单,就画出视图的样子,就把视图的样子给画出来。人可能就要问了,视图样子到底什么样子了?那他是怎么视图了,对吧?如果是个text u,那就画出一个文本来。如果是个image you,那就把图片画出来。嗯,这就是所说的画出视图的样子。好了,下面一个。他既然要画,肯定要有一些方法才能做到这样的事情。这里面呢?也有两个方法。一个是做。一个是on做,其实你会发现他们这测量布局和绘制是不是对应的方法都非常有特点,对吧。
01:06
啊,也说不带暗的方法,用它来去完成对吧,而带暗的方法呢,你是不是可以去重写啊,啊就这样的一个事,好来我们来看做方法。做方法呢,它绘制了视图的通用部分,确定了绘制的流程,一般呢不会重写示方法,我们来看一下找找。看看源码。来,我把我的视图打开。哎,把其他的都先关了。OK,把接关了好了,现在我去搜一个类叫view view里面啊有做方法。有吧,嗯,有啊。
02:01
这一个做方法里面有一个非常有意思的一个参数,可能很多人不知道,好像没跟大家说过是吧,叫covers。大家知道什么意思吗?画布。帆布啊,我们翻译过来叫画布的意思。那什么是画布呢?其实也非常简单,你这个牌它理解的屏幕。或者说把它理解成我们视图所对应的那块区域。就是画布。画布是不是用来画东西的呀?嗯,它就类似于我们的黑板对吧。其实还有一个类比较有意思,Paint。什么意思,画笔?它就相当于我们的什么粉笔。对不对,或者我们的啊,平常用的笔都是一个意思啊。
03:02
我们最终要绘制出来,它们俩缺一不可。画不画零。好大一个。在这里面呢,有一系列的一些方法。啊,123456是吧。他这是在说什么呢?我的做方法的一个流程。是什么?对吧,先画什么呀。是不是绘制背景啊,OK啊,这个里面如果需要会去画制一些准备一些什么,边缘部分这个不用管,第二步可以不用管,第二步和那个第五步是不太重要的,我们主要看其他几个部看的这一步干什么。内容画了一个什么视图的内容是吧,下面看看它这里面是有有步有一定的步骤的啊,你看第一步老外写的也也不错啊,好看着这一个。
04:00
这是什么?画什么画孩子,什么叫画孩子啊,就是说这个地方,这个方法视图是没有又是没有实现,由谁来去做了,如果是view,如果它是不是涉及到想办法要把孩子通知孩子去画呀。啊,就是画孩子好下面这一个。叫画装饰,什么叫画装饰呢?这个比较严,你看这个就比较明显。就能理解他手上的装饰是什么什么意思,是不是画那个滚那个那个右边的滚动条啊。就画了滚动条啊,能理解了吧。嗯。好了,在这个里面大家看啊。嗯。我们他会有这样一个方法啊,我给他搜一下。
05:01
你看他说现在下面是不是第三部啊。第三步,刚才说画的什么,自己的内容对不对,自己内容用哪个方法去画呀,方法去画好了,我们点过去看一下。现在view里面有什么没有,诶他为什么啥也没有了,因为现在只是一个一般的view对吧?一般的view有什么内容需要画吗?没有。那应该是它的子类去实现吧,来看一下它的子类。这是不是my view my view,你说画什么去?是不是画那个图片呢,画了一个图片,你说画到哪上面去啊。是不是往画布身上画呀?能看到吧,就画到上画布上下去好了。P说我们的text view。
06:01
啊,他写这么多,画什么去?是不是画文字啊,你得画那个文字,把那个文字最终得给它画出来啊,写得很多,你说哇,就画一个文字,画这么多呀。他考虑东西就比较多了,你它是一个整体的,一个全盘的考虑,不像我们我们想象那么简单,就说一个视图,一个文字咔嚓画出来呗,Abcd嘛,不就是对不对。那不是你想象的,比方你不要位置的嘛,对吧,你还有一些字体大小啊样式啊等等一系列的一些布局啊,对吧,你画到哪个地方,以什么方式去画呀。等等它都需要去考虑啊,对系统的API,它写起来肯定要非常非常严谨才行。因为他考虑东西比较多,我们去自定义的时候呢,就稍微要简单一些,可能就画的也比较就不会那么那么的复杂。啊。这是这样一个事,大家需要去知道啊,也就是说现在啊。
07:06
回到这个做,刚才不说了几步嘛,对不对啊,看到这里啊,第三步还有什么呀。是不是第四步啊,大家看看第四步。做什么了吗?是不是啥也没做啊?啊,啥也没做,大家看他说画谁去啊,画孩子,为什么他啥也不做啊?没有孩子们还做啥呀,对吧,好。谁重写了view group重写了呀?这个时候他需要去干嘛了?去画,孩子懂意思吧,让孩子去绘制。就是这样的,一个是大家需要去知道啊。就是这个patch什么意思,本来。分发是不是我们那个分发的时候是从外往里分发吧,就我作为一个定向来说,一个布局来说,我会调用这个方法来分发,是不是调用它们呢。
08:08
就让他们来做,让他们去画,这样才能说把事情简化啊,我只是通知外层的布局去画。外层的布局呢,他又会通知你太里层的吧,如果里层还有。是不是一层管一层呢?我不需要管所有的层次,我只需要管我的直接孩子。我的孙子。我的。更底层的是不用我管的。啊,这是他的一个逻辑,这个逻辑就是为把我的这个业务呢。给它简化了。就是这样一个是大家需要去知道啊。好。那已经给大家说了一下它,下面来说一下它。On draw方法重写此方法绘制自己所需要的样子。
09:01
如果说你想去绘制一个什么东西。那你必须通用这个方法。好,后面我不会跟大家说叫自定义view和自定group吗?制定view,一般都会去重写方法。因为你要画出一个自己想要的样子嘛,那你不同意这个方法,那你什么东西都画不出来呀。对吧,但是一般自定义OPPO是不会同意这个方法的。因为画是归水画呀。大家说是他只用说话呀。对不对,我一般啊,V group一般不会去重写这个方法的,没意义,没什么太大意义,因为我们的v group本身它并不显示什么效果吧。啊,大家说一般group重写的一个方法会比较多。嗯,在后面都会有重写。这个布局。我们布局,我们这个重写这个布局是不是未来控制指view的位置啊,因为我们制定group就会去重写on out的方法会比较多。
10:14
这是这一个啊。啊,需要需要去知道啊好。来啊,看这里重写它,并绘成自己想要的样子。一些具体的view啊,譬如说text view啊,Image view都重写了,此方法刚才也给大家看了啊,就是这样的一个。这是on方法。再问一遍安卓方法谁掉的呀?做方法调的对吧,按尿的方法谁掉的呀的对吧,大家要看得出来啊,还有什么按measure方法谁掉的呀?麦是不是它是不是有规律啊。对啊,而这个里面大家看到不同的视图实现,是不是都去重写了这个方法来去绘制自己的样子。
11:08
这个没问题吧,嗯,他们需要去汇聚资源,那如果我们去制定一个view。肯定要从也纳。啊,就是这样,一个是大家需要去知道一下啊,OK好,现在呢,我们来去。把它。给他测试一下。My taxi,我看一下方法是不是这么调的,一个叫来看它做方法,这个做方法本身来说,我们一般是不会重写它的,我们这里重写呢,主要是看一下方法调用的流程。John。嗯。好,这是这样一个来,还有一个昂。
12:09
明白吧,一般呢,我们会去重写这个方法来绘制自己想要的一个效果,好了,我把它呢也给它打印输出一下。先我们简单的看一下,看是不是我们刚才想的那个样子,走。啊,这个地方是不是要去。重新的启动一个activity,启动一个模拟器是吧,因为刚才不断了吗?就让他重启吧,我们已经走过几遍了,十有八九是不行的。啊,点一下。嗯,可以。看一下啊。来。啊,出来了,好啦,我们来看一下这一个。
13:01
还挺多。大家看到。啊,我把这个给大家给大家给清了啊,清了以后再来一次。走。大家看做什么按住是不是刚刚在这里面很有顺序的啊,先最先是什么。啊,在这里面如果从前面看的话,先是要创建对象。对吧,创新对象以后大家看啊,是不是说布局加载完成了,接着是。Activity方法。你看着安慰,这种方法是不是远远早于我们的什么布局啊,绘制啊,好,下面。什么an attached to window啊,这个的重要性不是特别大,主要看后面,后面其实是三步。对吧,这叫什么呀,测量接着呢。
14:00
布局。接着绘制。不就是三步吗?对吧。好。这个地方为什么测两遍开始第一遍它是一个什么数,改变了它一定要测量到什么呢?不改变为。对吧。不改变位置,后面布局已经确定好了以后。采取什么?是不是绘制啊?嗯。好,这是这一个大家需要去知道一下啊。下面有一个非常非常重要的。叫强制重汇。这个用的比较多。长治重绘是什么意思呢?很简单,我在这里面去来一个button给大家一演示,大家就能知道。
15:04
看着我,我在下面呢,再来一个button。啊,开始是强制重新布局,这个倒用的少,但是强制重绘那是用的非常非常多的。啊,好,叫强制重绘,来,我来定义这样一个方法。那强制重绘用一个什么样的方法来去做呢?大概。很简单,叫invented方法,Invented这个单词呢,本来是叫失效啊的意思。那怎么去想呢?反正我就想着他失效,失效以后不要重新画吗?是这么想的。
16:02
只能这么想,那没有别的太好的一个想法,你们要有别的想法呢,你可以告诉我啊。好,大家看啊,这个地方有两个方法。一个叫一个叫什么呢?Post。它们的区别在哪呢?我先跟大家简单说一下这一个哥们。只能在主线程执行。Post可以在主线程或者。非性能执行。那我一般怎么选择呢?其实一般是这么选择,主线能用它。非性的用它。好来试一下啊,试一下现在我是不是强制重绘吧,那我通过哪个对象去调啊。那要看你想重回谁啊,是我那个定义的my view对象啊。
17:06
调用它的in one的方法对吧,就可以了,诶我怎么知道它有没有重复啊。大家说我调用这个方法,我怎么知道,我怎么去判断它有没有视图,有没有同位呢,画相关的方法,重新调用了吧,嗯,来试一下。走。把这个先去掉。点了吧。找你。大家看做什么?是安卓呀,嗯,好。来看着啊。在这里面我们说过了,除了这一个方法,其实它还有一个方法可以用吧,哪个呀。小post,来把这个写一下,点post in。
18:05
我们看一下它行不行是吧,其实它也可以,也就是在主线程里面呢,其实它也可以的。快速等一下。走是不是有啊。好,这个没什么好说的,但是一般我们都用它下面。我要跟他测另外一种。另一个点start,我启动一个什么呢?分线程。分线这里面去重写一下,让方法可以吧,在这里面大家看啊。我先去用它。我们说过它行吗?这不行呢,好证明他不行呢。运行一下才知道。现在没问题吧?好啦,走。
19:02
是不包括呀,啊,这个里面它就说的是一个什么事情呢,你看到这个异常叫called from rooms right exception。翻译。调用或者调用从一个什么,用错误的线程调用的一个异常吧。也就是说认识单词至关重要啊,其实您用单词的话就能看得出来它什么意思啊,比如说我们现在在分线程,执行了这样一个方法吧,那。我现在我想去在分线上去更新,怎么办呢。我想看是不是用它呀,哎,用下它看行不行啊。走。点。
20:00
是不是可以啊?啊,可以没有问题啊,这个不可以。只能在主线上执行,嗯。它呢是可以在分线条主线可以在嗯,主线程和分线程执行。都是用来去强制重绘的,但是还是有点不一样啊。这个非常有用啊,大家一定要记住这个方法。
我来说两句