《Android實(shí)戰(zhàn)基礎(chǔ)教程》課件第九章_第1頁(yè)
《Android實(shí)戰(zhàn)基礎(chǔ)教程》課件第九章_第2頁(yè)
《Android實(shí)戰(zhàn)基礎(chǔ)教程》課件第九章_第3頁(yè)
《Android實(shí)戰(zhàn)基礎(chǔ)教程》課件第九章_第4頁(yè)
《Android實(shí)戰(zhàn)基礎(chǔ)教程》課件第九章_第5頁(yè)
已閱讀5頁(yè),還剩77頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

目錄9.1ViewRoot和DecorView9.2理解MeasureSpec9.3View的工作流程9.4自定義View

九、View的工作原理九、View的工作原理ViewRoot對(duì)應(yīng)于ViewRootImpl類(lèi),它是連接WindowManager和DecorView的紐帶,View的三大流程均是通過(guò)ViewRoot來(lái)完成的。在ActivityThread中,當(dāng)Activity對(duì)象被創(chuàng)建完畢后,會(huì)將DecorView添加到Window中,同時(shí)會(huì)創(chuàng)建ViewGroup對(duì)象,并將ViewRootImpl對(duì)象和DecorView建立關(guān)系。View的繪制流程是從ViewRoot的performTraversals方法開(kāi)始的,它經(jīng)過(guò)measure、layout和draw三個(gè)過(guò)程才能最終將一個(gè)View繪制出來(lái),其中measure用來(lái)測(cè)量View的寬高,layout用來(lái)確定View在父容器中的放置位置,而draw則負(fù)責(zé)將View繪制在屏幕上。針對(duì)performTraversals的大致流程,如圖9.1所示。9.1ViewRoot和DecorView九、View的工作原理圖9.1九、View的工作原理performTraversals會(huì)移除調(diào)用performMeasure、performLayout和performDraw,這三個(gè)方法分別完成頂級(jí)View的measure、layout和draw這三大流程,其中在performMeasure中會(huì)調(diào)用measure方法,在measure方法中又會(huì)調(diào)用onMeasure方法,在onMeasure方法中則會(huì)對(duì)所有的子元素進(jìn)行measure過(guò)程,這個(gè)時(shí)候measure流程就從父容器傳遞到子元素了,這樣就完成了一次measure過(guò)程。接著子元素會(huì)重復(fù)父容器的measure過(guò)程,如此反復(fù)就完成了整個(gè)View樹(shù)的遍歷。同理,performLayout和perform的傳遞流程和performMeasure是類(lèi)似的,唯一不同的是,performDraw的傳遞過(guò)程是在draw方法中通過(guò)dispatchDraw來(lái)實(shí)現(xiàn)的。九、View的工作原理Measure過(guò)程中決定了View的寬高,Measure完成之后,可以通過(guò)getMeasureWidth和getMeasureHeight方法來(lái)獲得View的測(cè)量寬高,在幾乎所有的情況下它都等同于View的最終寬高,特殊情況除外。Layout過(guò)程決定了View的四個(gè)頂點(diǎn)的坐標(biāo)和實(shí)際的View的寬高,完成以后,可以通過(guò)getTop、getBottom、getLLeft、getRight來(lái)得到View的四個(gè)頂點(diǎn)的位置,并可以通過(guò)getWidth和getHeight來(lái)得到View的最終寬高。Draw過(guò)程則決定了View的顯示,只有Draw方法完成以后View的內(nèi)容才能呈現(xiàn)在屏幕上。九、View的工作原理

如圖9.2所示,DecorView作為View,一般情況下它內(nèi)部包含了一個(gè)豎直方向的LineraLayout,在這個(gè)LinearLayout里面有上下兩個(gè)部分,上面為標(biāo)題欄,下面為內(nèi)容欄。在Activity中我們通過(guò)setContentView所設(shè)置的布局文件其實(shí)就是被加到內(nèi)容欄中去了。圖9.2九、View的工作原理MeasureSpec代表一個(gè)32位int值。高2位代表SpecMode,低30位代表SpecSize。SpecMode是指測(cè)量模式,而SpecSize指在某種測(cè)量模式下的規(guī)格大小。9.2理解MeasureSpec9.2.1MeasureSpec九、View的工作原理九、View的工作原理

MeasureSpec通過(guò)將SpecMode和SpecSize打包成一個(gè)int值來(lái)避免過(guò)多的對(duì)象內(nèi)存分配。為了方便操作,其提供了打包和解包操作,SpecMode和SpecSize也是一個(gè)int值。SpecMode有三類(lèi):。

UNSPECIFIED:父容器不對(duì)View有任何限制,要多大給多大,這種情況一般用于系統(tǒng)內(nèi)部,表示一種測(cè)量的狀態(tài)。

EXACTLY:父容器已經(jīng)檢測(cè)出View所需要的精確大小,這個(gè)時(shí)候最終大小就是SpecSize所指定的值,它對(duì)應(yīng)于LayoutParams中的matchparent和具體的數(shù)值兩種模式。

AT_MOST:父容器指定了一個(gè)可用的大小即SpecSize,View的大小不能大于這個(gè)值,具體是多大看不同的View的具體實(shí)現(xiàn)。它對(duì)應(yīng)于LayoutParams中的wrap_content。九、View的工作原理

在View測(cè)量的時(shí)候,系統(tǒng)會(huì)將LayoutParams在父容器的約束下轉(zhuǎn)換成對(duì)應(yīng)的MeasureSpec,然后再根據(jù)這個(gè)MeasureSpec來(lái)確定View測(cè)量后的寬高。

對(duì)于DecorView來(lái)說(shuō),在ViewRootImpl(注意這個(gè)類(lèi)是隱藏的,需要在resoure文件中去找)中的measureHierarchy方法中有如下一段代碼,它展示了DecorView的MeasureSpec的創(chuàng)建過(guò)程,其中desiredWindowWidth和desiredWindowHeight是屏幕的尺寸。9.2.2MeasureSpec和Layoutparams的對(duì)應(yīng)關(guān)系九、View的工作原理

九、View的工作原理DecorView的MeasureSpec的產(chǎn)生過(guò)程遵守了如下規(guī)則,根據(jù)它的LayoutParams中的寬高的參數(shù)來(lái)劃分。

?LayoutParams.MATCH_PARENT:精確模式,大小就是窗口的大??;

?LayoutParams.WRAP_CONTENT:最大模式,大小不定,但是不能超過(guò)窗口的大小;

固定大小:精確模式,大小為L(zhǎng)ayoutParams中指定的大小。

對(duì)于普通的View來(lái)說(shuō),這里是指我們布局中的View,View的measure過(guò)程由ViewGroup傳遞而來(lái),ViewGroup的measureChildWithMargins方法:九、View的工作原理

上述方法會(huì)對(duì)子元素進(jìn)行measure,在調(diào)用子元素的measure方法之前會(huì)先通過(guò)getChildMeasureSpec方法得到資源的MeasureSpec。從代碼來(lái)看,很顯然,子元素的MeasureSpec的創(chuàng)建與父容器的MeasureSpec和子元素自身的LayoutParams有關(guān),此外還和View的margin和padding有關(guān)。具體看ViewGroup的getChildMeasureSpec方法。如下所示:九、View的工作原理

九、View的工作原理九、View的工作原理九、View的工作原理

上述方法主要作用是根據(jù)父容器的MeasureSpec同時(shí)結(jié)合View本身的LayoutParams的參數(shù)來(lái)確定子元素的MeasureSpec,參數(shù)中的padding是指父容器已占用的控件大小,因此子元素可用的大小為父容器的尺寸減去padding,具體的代碼如下:getChildMeasureSpec清楚地展示了普通View的MeasureSpec的創(chuàng)建規(guī)則。表9.1對(duì)getChildMeasureSpec的工作原理進(jìn)行了梳理。表中的ParentSize是指父容器中目前可用的大小。九、View的工作原理childLayoutParamsparentSpecModeEXACTLYAT_MOSTUNSPECIFIEDdp/pxEXACTLYchildSizeEXACTLYchildSizeEXACTLYchildSizeMatch_parentEXACTLYparentSizeAT_MOSTparentSizeUNSPECIFIEDoWarp_contentAT_MOSTparentSizeAT_MOSTparentSizeUNSPECIFIEDo表9.1普通View的MeasureSpec的創(chuàng)建規(guī)則

只要提供父容器的MeasureSpec和子元素的LayoutParams,就可以快速地確定子元素的MeasureSpec了,有了MeasureSpec就可以進(jìn)一步確定出子元素測(cè)量的大小了。九、View的工作原理

1.View的Measure過(guò)程View的Measure過(guò)程由其Measure方法來(lái)完成。Measure方法是一個(gè)final類(lèi)型的方法,意味著子類(lèi)不能重寫(xiě)此方法。在View的Measure方法中會(huì)去調(diào)用View的onMeasure方法,因此只需要看onMeasure的實(shí)現(xiàn)即可。View的onMeasure方法如下:9.3View的工作流程9.3.1Measure過(guò)程九、View的工作原理

getDefaultSize方法:九、View的工作原理getDefaultSize返回的大小就是measureSpec中的specSize,而這個(gè)specSize就是View測(cè)量后的大小。這里多次提到測(cè)量后的大小,是因?yàn)閂iew最終的大小是在layout階段確定的,所以這里必須要加以區(qū)分,但不是所有情況下的View的測(cè)量大小都與最終大小相等。UNSPECIFIED一般用于系統(tǒng)內(nèi)部的測(cè)量過(guò)程,在這種情況下,View的大小為getDefaultSize的第一個(gè)參數(shù),即寬高分別為getSuggestedMinimumWidth和getSuggestedMinimumHeight這兩個(gè)方法的返回值,看一下它們的源碼:九、View的工作原理

可以看出,如果View沒(méi)有設(shè)置任何背景,那么View的寬度為mMinWidth,而mMinWidth對(duì)應(yīng)于android:minWidth這個(gè)屬性所指定的值,因此View的寬度即為android:minWidth屬性所指定的值。這個(gè)屬性如果不知道,那么mMinWidth則默認(rèn)為0;如果View指定了背景,則View的寬度為max(mMinWidth,mBackground.getMinimumWidth())。我們看一下Drawable的getMinimumWidth()方法,如下所示:九、View的工作原理

可以看出,getMinimumWidth返回的就是Drawable的原始寬度,前提是這個(gè)Drawable有原始寬度,否則就返回0。那么Drawable在什么情況下有原始寬度呢?ShapeDrawable無(wú)原始寬高,而B(niǎo)itmapDrawable有原始寬高。

從getDefault方法的實(shí)現(xiàn)來(lái)看,View的寬高由SpecSize決定,所以我們可以得出以下結(jié)論:直接繼承View的自定義控件需要重寫(xiě)onMeasure方法并設(shè)置wrap_content時(shí)的自身參數(shù),否則在布局文件中使用wrap_content就相當(dāng)于match_parent。九、View的工作原理

2.ViewGroup的measure過(guò)程

對(duì)于ViewGroup來(lái)說(shuō),除了完成自己的measure過(guò)程以外,還會(huì)去調(diào)用所有子元素的measure方法,各個(gè)子元素再遞歸去執(zhí)行這個(gè)過(guò)程。和View不同的是,ViewGroup是一個(gè)抽象類(lèi),因此它沒(méi)有重寫(xiě)View的onMeasure方法,但是它提供了一個(gè)叫measureChildren的方法:九、View的工作原理ViewGroup在measure時(shí)會(huì)對(duì)每一個(gè)子元素進(jìn)行measure,measureChild方法的實(shí)現(xiàn):measureChild就是取出子元素的LayoutParams,然后再通過(guò)getChildMeasureSpec來(lái)創(chuàng)建子元素的MeasureSpec,接著MeasureSpec直接傳遞給View的measure方法來(lái)進(jìn)行測(cè)量。九、View的工作原理

不同的ViewGroup子類(lèi)有不同的布局特性,這導(dǎo)致它們的測(cè)量細(xì)節(jié)都不相同。LinearLayout的onMeasure方法:

上述代碼對(duì)不同的布局方向做了不同的測(cè)量,選擇查看垂直布局的LinearLayout測(cè)量過(guò)程,即measureVertical方法。measureVertical方法中重要代碼如下:九、View的工作原理

系統(tǒng)會(huì)遍歷子元素并對(duì)子元素執(zhí)行measureChild-BeforeLayout方法,調(diào)用子元素的measure方法,各個(gè)子元素就開(kāi)始依次進(jìn)入measure過(guò)程,并且系統(tǒng)會(huì)通過(guò)mTotalLength這個(gè)變量來(lái)存儲(chǔ)LinearLayout在豎直方向的初步高度。每測(cè)量一個(gè)子元素,mTotalLength就會(huì)增加包括子元素的高度以及子元素在豎直方向上的margin等。當(dāng)子元素測(cè)量完畢后,LinearLayout會(huì)測(cè)量自己的大小,源碼如下:九、View的工作原理

當(dāng)子元素測(cè)量完畢后,LinearLayout會(huì)根據(jù)子元素的情況來(lái)測(cè)量自己的大小,針對(duì)豎直的LinearLayout而言,它在水平方向的測(cè)量過(guò)程遵循View的測(cè)量過(guò)程,在豎直方向的測(cè)量過(guò)程與View有所不同。最終高度還需要考慮其他在豎直方向的padding,這個(gè)過(guò)程可以進(jìn)一步參看源碼:九、View的工作原理九、View的工作原理如果在Activity已啟動(dòng)的時(shí)候就做一個(gè)任務(wù),但是這個(gè)任務(wù)需要獲取這個(gè)View的寬高。實(shí)際上在onCreate或者onStart、onResume中均無(wú)法正確得到某個(gè)View的寬高信息,這是因?yàn)閂iew的measure和Activity的生命周期方法不是同步執(zhí)行的,一次無(wú)法保證Activity執(zhí)行了onCreate、onStart、onResume時(shí)某個(gè)View已經(jīng)測(cè)量完畢。如果View還沒(méi)有測(cè)量完畢,那么獲得的寬高就是0。給出四種方法來(lái)解決這個(gè)問(wèn)題。九、View的工作原理1)?onWindowFocusChangedView已經(jīng)初始化完畢了,寬高已經(jīng)準(zhǔn)備好了,這個(gè)時(shí)候去獲取寬高沒(méi)有問(wèn)題。onWindowFocusChanged會(huì)被調(diào)用多次,當(dāng)Activity的窗口得到焦點(diǎn)和失去焦點(diǎn)時(shí)均會(huì)被調(diào)用一次。當(dāng)Activity繼續(xù)執(zhí)行和暫停執(zhí)行時(shí),onWindowFocusChanged均會(huì)被調(diào)用,如果頻繁地進(jìn)行onResume和onPause,那么onWindowFocusChanged也會(huì)被頻繁地調(diào)用。2)?View.post(runnable)

通過(guò)post可以將一個(gè)runnable投遞到消息隊(duì)列的尾部,然后等待Looper調(diào)用此runnable的時(shí)候,View也已經(jīng)初始化了。典型代碼如下:九、View的工作原理3)?ViewTreeObserver

使用ViewTreeObserver的眾多回調(diào)方法可以完成這個(gè)功能,比如使用onGlobalLLayoutListener這個(gè)接口,當(dāng)View樹(shù)的狀態(tài)發(fā)生改變或者View樹(shù)內(nèi)部的View可見(jiàn)性發(fā)生改變時(shí),onGlobalLyaout方法將被回調(diào),因此這是獲取View寬高的一個(gè)很好的時(shí)機(jī)。需要注意的是,伴隨View樹(shù)的狀態(tài)改變等,onGlobalLayout會(huì)被調(diào)用多次。典型代碼如下:九、View的工作原理九、View的工作原理Layout的作用是ViewGroup用來(lái)確定子元素的位置,當(dāng)ViewGroup的位置被確定后,它在onLayout中會(huì)遍歷所有的子元素并調(diào)用其Layout方法。在Layout方法中onLayout方法會(huì)被調(diào)用。Layout過(guò)程比measure過(guò)程簡(jiǎn)單,在Layout方法中確定View本身的位置,而onLayout方法則會(huì)確定所有子元素的位置。View的Layout方法如下所示:9.3.2Layout過(guò)程九、View的工作原理九、View的工作原理

Layout方法的大致流程:首先通過(guò)setFrame方法來(lái)設(shè)定View的四個(gè)頂點(diǎn)的位置,即初始化mLeft、mRight、mTop、mBottom這四個(gè)值。View的四個(gè)頂點(diǎn)一旦確定,那么View在父容器中的位置就確定了,接著會(huì)調(diào)用onLayout方法。這個(gè)方法的用途是父容器確定子元素的位置,和onMeasure方法類(lèi)似,onLayout的具體實(shí)現(xiàn)同樣和具體的布局相關(guān),那么View和ViewGroup均沒(méi)有真正實(shí)現(xiàn)onLayout。接下來(lái),我們可以看一下LinearLayout的onLayout方法,如下所示:九、View的工作原理

LinearLayout中的Layout的實(shí)現(xiàn)邏輯和onMeasure的實(shí)現(xiàn)邏輯類(lèi)似:九、View的工作原理九、View的工作原理

此方法會(huì)遍歷所有子元素并調(diào)用setChildFrame方法來(lái)為子元素指定對(duì)應(yīng)的位置,其中childTop會(huì)慢慢增大,這就意味著后面的子元素會(huì)被放置在靠下的位置,這剛好符合豎直方向的linearLayout的特性。至于setChildFrame,它僅僅是調(diào)用子元素的layout方法而已,這樣父元素在子元素layout方法中完成自己的定位以后,就通過(guò)onlayout方法去調(diào)用子元素的layout方法,子元素又會(huì)通過(guò)自己的layout方法來(lái)確定自己的位置,這樣一層一層地傳遞下去就完成了整個(gè)View樹(shù)的layout過(guò)程。setChildFrame方法的實(shí)現(xiàn)如下所示:九、View的工作原理

在setChildFrame中的width和height實(shí)際上就是子元素的測(cè)量寬高。九、View的工作原理

Draw過(guò)程的作用是將View繪制到屏幕上面。View的繪制過(guò)程遵循如下幾步:(1)繪制背景background.draw(canvas)。(2)繪制自己(onDraw)。(3)繪制children(dispatchDraw)。(4)繪制裝飾(onDrawScrollBars)。

當(dāng)需要使用自定義View時(shí),都需要實(shí)現(xiàn)該方法,9.3.3Draw過(guò)程九、View的工作原理

繼承View主要用于實(shí)現(xiàn)一些不規(guī)則的效果,即這些效果不方便通過(guò)布局的組合方式來(lái)達(dá)到,往往需要靜態(tài)或者動(dòng)態(tài)地顯示一些不規(guī)則的圖形。很顯然這需要通過(guò)繪制的方式來(lái)實(shí)現(xiàn),即重寫(xiě)onDraw方法。采用這種方式需要自己支持wrap_content,并且padding也需要自己處理。9.4自定義View9.4.1繼承View九、View的工作原理

定義一個(gè)MyCustomView類(lèi),該類(lèi)繼承了View:九、View的工作原理九、View的工作原理

在MyCustomView的構(gòu)造方法中得到了background.png圖片的位圖對(duì)象,在onDraw方法里創(chuàng)建了一個(gè)paint對(duì)象,同時(shí)繪制一塊矩形,該矩形的大小由viewWidth、viewHeight決定,viewWidth以及viewHeight在第一次加載MyCustomView時(shí)得到它們的初始值,也就是通過(guò)onSizeChanged()方法得到它的值。最后通過(guò)canvus.drawBitmap()把圖片繪制到指定的區(qū)域。我們需要將該View放入布局文件中去,Activity_main.xml代碼如下:九、View的工作原理九、View的工作原理

在布局文件中部署該自定義View的時(shí)候,需要將包名以及類(lèi)名都寫(xiě)進(jìn)去。如果僅僅是寫(xiě)入MyCustomView將會(huì)出現(xiàn)錯(cuò)誤。

運(yùn)行程序,出現(xiàn)如這樣的結(jié)果:圖9.3九、View的工作原理

如圖9.3所示,在textView的區(qū)域下面繪制了一塊紅色區(qū)域,在該區(qū)域的左上角有一個(gè)圖片,即background.xml,這樣簡(jiǎn)單地實(shí)現(xiàn)了自定義View。接下來(lái)我們將在此基礎(chǔ)上更加復(fù)雜化。我們希望上圖中那塊灰色的區(qū)域能夠填充整個(gè)紅色區(qū)域:九、View的工作原理九、View的工作原理

在修改部分,使用雙層for循環(huán),在外層循環(huán),繪制圖片的寬度,內(nèi)層循環(huán)繪制圖片的高度。

執(zhí)行上述修改后的代碼可以看到,整個(gè)區(qū)域都已經(jīng)填充該圖片。接下來(lái),我們將在這些圖片上繪制圖9.4,并且居中。在以往的布局文件中,我們可以通過(guò)控件的屬性設(shè)置控件的位置。在自定義控件內(nèi),沒(méi)有這些屬性設(shè)置,需要我們自己去計(jì)算。圖9.4九、View的工作原理

計(jì)算這個(gè)自定義View的中間位置,在onDraw()方法中添加如下代碼:九、View的工作原理

整個(gè)過(guò)程共分為三步:首先需要得到該圖片的位圖對(duì)象;同時(shí)需要繪制的坐標(biāo)信息;當(dāng)有了上述兩個(gè)條件之后,通過(guò)canvus方法就可繪制圖片、顯示圖片上的文字了。類(lèi)似于Android自定義的TextView,運(yùn)行結(jié)果:圖9.5九、View的工作原理

如圖9.5所示,在自定義View上加載了“瘋狂英語(yǔ)”文字,接下來(lái),動(dòng)態(tài)的顯示文字,在上述demo中,在界面的底部逐個(gè)顯示一行字。文字圖片如圖:圖9.6九、View的工作原理

想要“隨時(shí)隨地學(xué)英語(yǔ)”這幾個(gè)字慢慢地顯示出來(lái),而不是一下全部顯示出來(lái),這樣就形成了一個(gè)動(dòng)態(tài)的效果。在傳統(tǒng)的控件中,TextView無(wú)法實(shí)現(xiàn)該效果,而在自定義View中可以完成:九、View的工作原理運(yùn)行程序:圖9.7九、View的工作原理

結(jié)果如圖9.7所示,動(dòng)態(tài)文字內(nèi)容顯示出來(lái),繼續(xù)修改,用到線程:九、View的工作原理

讓MyCustomView實(shí)現(xiàn)Runnable接口,定義一個(gè)圖片顯示區(qū)域控制模塊參數(shù)index。利用線程刷新index參數(shù),從而控制圖片顯示區(qū)域。讓圖片中的文字達(dá)到慢慢顯示的后果。線程代碼如下:九、View的工作原理

在主線程刷新UI使用的是Invalidate()方法,在此案例中index的變化是在子線程中,故使用的是postInvalidate();。

在MyCustomView的構(gòu)造方法中開(kāi)啟線程,代碼如下:九、View的工作原理

當(dāng)加載該自定義View時(shí),開(kāi)啟工作線程,改變index值的大小,同時(shí)調(diào)用postInvalidate()方法刷新UI,每次刷新UI時(shí)都將重新調(diào)用onDraw()方法,從而動(dòng)態(tài)顯示文字。在onDraw()中增加代碼如下:九、View的工作原理案例:使用自定義View來(lái)實(shí)現(xiàn)一個(gè)復(fù)雜的控件——繪制股票的趨勢(shì)圖。1.實(shí)時(shí)股價(jià)-時(shí)間界面

一個(gè)股票趨勢(shì)圖包含有時(shí)間、價(jià)格以及趨勢(shì)走向等因素,我們一個(gè)一個(gè)來(lái)完成它。首先完成在屏幕下方繪制時(shí)間。模擬一組數(shù)據(jù)用于繪制時(shí)間。

自定義View類(lèi)代碼如下:九、View的工作原理九、View的工作原理九、View的工作原理

在自定義View類(lèi)中,我們定義了一個(gè)集合lists保存股票價(jià)格點(diǎn),在lists中保存的是HashMap對(duì)象。之所以用到HashMap,是由于股票價(jià)格點(diǎn)同時(shí)包含了時(shí)間及價(jià)格。在自定義類(lèi)還自定義了setData()方法,該方法用于設(shè)置股票價(jià)格數(shù)據(jù)。在onSizeChanged()方法中得到自定義控件的長(zhǎng)度。最好在onDraw()方法中繪制時(shí)間。

注意:在每個(gè)方法中都利用Log做了日志輸出,當(dāng)運(yùn)行程序時(shí)可以更直觀地看到程序運(yùn)行的大致方法調(diào)用過(guò)程。MainActivity.java文件代碼如下:九、View的工作原理九、View的工作原理

九、View的工作原理Activity_main.xml代碼如下:九、View的工作原理運(yùn)行結(jié)果:圖9.8九、View的工作原理2.實(shí)時(shí)股價(jià)-價(jià)格界面

我們需要知道股價(jià)最大值,只有根據(jù)股價(jià)的最大值,才能得到每一時(shí)間點(diǎn)股價(jià)與最大值的比例,從而計(jì)算出該點(diǎn)在自定義View中的位置,所以首先我們需要計(jì)算出這些時(shí)刻點(diǎn)的最大股價(jià)。九、View的工作原理九、View的工作原理九、View的工作原理九、View的工作原理九、View的工作原理運(yùn)行程序:圖9.10九、View的工作原理

3.實(shí)時(shí)股價(jià)-動(dòng)態(tài)展示界面

如圖9.10所示,股票的時(shí)間點(diǎn)、價(jià)格、連線都已經(jīng)連接起來(lái)了。如何讓數(shù)據(jù)動(dòng)態(tài)的顯示,是我們接下來(lái)的任務(wù)。在上面的代碼中,數(shù)據(jù)來(lái)源于MainActivity的onCreate()方法,固定的數(shù)據(jù),我們需要?jiǎng)討B(tài)顯示它。此處用到的是Random對(duì)象。在getDate()中修改代碼如下:九、View的工作原理九、View的工作原理

通過(guò)調(diào)用Random對(duì)象的nextInt(n)對(duì)象,來(lái)產(chǎn)生一個(gè)大于等于0小于n的隨機(jī)數(shù),這樣就實(shí)現(xiàn)了動(dòng)態(tài)數(shù)據(jù)。在真實(shí)的項(xiàng)目中,用到的是網(wǎng)絡(luò)數(shù)據(jù),需要在MyCustomView顯示:九、View的工作原理九、View的工作原理運(yùn)行程序,出現(xiàn)動(dòng)態(tài)的實(shí)時(shí)股市圖:圖9.11九、View的工作原理

這種方法主要用于實(shí)現(xiàn)自定

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論