自定義View面試總結(jié)

本著針對面試,不負(fù)責(zé)任的態(tài)度,寫下《面試總結(jié)》系列虱颗。本系列記錄面試過程中各個知識點芳悲,而不是入門系列,如果有不懂的自行學(xué)習(xí)萎馅。


轉(zhuǎn)載請標(biāo)明出處,本文地址: http://www.reibang.com/p/a13458744a02

不負(fù)責(zé)任系列


自定義View三種方式,組合現(xiàn)有控件熄浓,繼承現(xiàn)有控件,繼承View

本文只針對繼承View的方式省撑,另兩種自行學(xué)習(xí)赌蔑。

1. 重寫方法

onMeasure俯在、 onLayout、onDraw娃惯、onTouchEvent

onMeasure

可能多次觸發(fā)跷乐,在measure的過程中注意MeasureSpec,specMode石景、specSize
講到LinearLayout劈猿、RelativeLayout源碼

MeasureSpec

MeasureSpec,specMode潮孽、specSize

  1. EXACTLY

表示父布局希望子布局的大小應(yīng)該是由specSize的值來決定的揪荣,系統(tǒng)默認(rèn)會按照這個規(guī)則來設(shè)置子布局的大小,開發(fā)人員當(dāng)然也可以按照自己的意愿設(shè)置成任意的大小往史。

  1. AT_MOST

表示子布局最多只能是specSize中指定的大小仗颈,開發(fā)人員應(yīng)該盡可能小得去設(shè)置這個布局,并且保證不會超過specSize椎例。系統(tǒng)默認(rèn)會按照這個規(guī)則來設(shè)置子布局的大小挨决,開發(fā)人員當(dāng)然也可以按照自己的意愿設(shè)置成任意的大小。

  1. UNSPECIFIED

表示開發(fā)人員可以將布局按照自己的意愿設(shè)置成任意的大小订歪,沒有任何限制脖祈。這種情況比較少見,不太會用到刷晋。

childParams/parentMode EXACTLY AT_MOST UNSPECIFIED
dp/px EXACTLY(childsize) EXACTLY(childsize) EXACTLY(childsize)
match_parent EXACTLY(parentsize) AT_MOST(parentsize) UNSPECIFIED(0)
wrap_content AT_MOST(parentsize) AT_MOST(parentsize) UNSPECIFIED(0)

上圖表摘自https://blog.csdn.net/singwhatiwanna/article/details/38426471

onLayout

在ViewGroup中盖高,只觸發(fā)一次,決定子View的位置

onDraw

繪制內(nèi)容眼虱,Canvas.drawxxx()喻奥,paint

onTouchEvent

處理點擊事件

2. 自定義view與viewgroup的區(qū)別

  1. onDraw(Canvas canvas)

View類中用于重繪的方法,這個方法是所有View捏悬、ViewGroup及其派生類都具有的方法,也是Android UI繪制最重要的方法撞蚕。開發(fā)者可重載該方法,并在重載的方法內(nèi)部基于參數(shù)canvas繪制自己的各種圖形过牙、圖像效果甥厦。

  1. onLayout()

重載該類可以在布局發(fā)生改變時作定制處理,這在實現(xiàn)一些特效時非常有用寇钉。View中的onLayout不是必須重寫的矫渔,ViewGroup中的onLayout()是抽象的,自定義ViewGroup必須重寫摧莽。

  1. dispatchDraw()

ViewGroup類及其派生類具有的方法庙洼,控制子View繪制分發(fā),重載該方法可改變子View的繪制,進(jìn)而實現(xiàn)一些復(fù)雜的視效油够,典型的例子可參見Launcher模塊Workspace的dispatchDraw重載蚁袭。

  1. drawChild()

ViewGroup類及其派生類具有的方法,直接控制繪制某局具體的子view石咬,重載該方法可控制具體某個具體子View揩悄。

3. View方法執(zhí)行過程

三次measure,兩次layout和一次draw
http://blog.csdn.net/u012422440/article/details/52972825

Android視圖樹的根節(jié)點是DecorView,而它是FrameLayout的子類鬼悠,所以就會讓其子視圖繪制兩次删性,所以onMeasure函數(shù)會先被調(diào)用兩次。

  • onResume(Activity)
  • onPostResume(Activity)
  • onAttachedToWindow(View)
  • onMeasure(View)
  • onMeasure(View)
  • onLayout(View)
  • onSizeChanged(View)
  • onMeasure(View)
  • onLayout(View)
  • onDraw(View)
  • dispatchDraw()

4. invalidate()焕窝、postInvalidate()蹬挺、requestLayout()

invalidate()

/**
     * Invalidate the whole view. If the view is visible,
     * {@link #onDraw(android.graphics.Canvas)} will be called at some point in
     * the future.
     * <p>
     * This must be called from a UI thread. To call from a non-UI thread, call
     */
    public void invalidate() {
        invalidate(true);
    }

invalidate方法會執(zhí)行draw過程,重繪View樹它掂。
當(dāng)改變view的顯隱性巴帮、背景、狀態(tài)(focus/enable)等虐秋,這些都屬于appearance范疇榕茧,都會引起invalidate操作。需要更新界面顯示客给,就可以直接調(diào)用invalidate方法用押。

注意:

View(非容器類)調(diào)用invalidate方法只會重繪自身,ViewGroup調(diào)用則會重繪整個View樹靶剑。

postInvalidate()

/**
     * <p>Cause an invalidate to happen on a subsequent cycle through the event loop.
     * Use this to invalidate the View from a non-UI thread.</p>
     *
     * <p>This method can be invoked from outside of the UI thread
     * only when this View is attached to a window.</p>
     */
    public void postInvalidate() {
        postInvalidateDelayed(0);
    }

在子線程中被調(diào)用蜻拨,刷新UI。

requestLayout()

 /**
     * Call this when something has changed which has invalidated the
     * layout of this view. This will schedule a layout pass of the view
     * tree. This should not be called while the view hierarchy is currently in a layout
     * pass ({@link #isInLayout()}. If layout is happening, the request may be honored at the
     * end of the current layout pass (and then layout will run again) or after the current
     * frame is drawn and the next layout occurs.
     *
     * <p>Subclasses which override this method should call the superclass method to
     * handle possible request-during-layout errors correctly.</p>
     */
    @CallSuper
    public void requestLayout() {
        }

當(dāng)View的寬高抬虽,發(fā)生了變化官觅,不再適合現(xiàn)在的區(qū)域纵菌,調(diào)用requestLayout方法重新對View布局阐污。
當(dāng)View執(zhí)行requestLayout方法,會向上遞歸到頂級父View中咱圆,再執(zhí)行這個頂級父View的requestLayout笛辟,所以其他View的onMeasure,onLayout也可能會被調(diào)用序苏。
3

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末手幢,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子忱详,更是在濱河造成了極大的恐慌围来,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,968評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異监透,居然都是意外死亡桶错,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評論 2 382
  • 文/潘曉璐 我一進(jìn)店門胀蛮,熙熙樓的掌柜王于貴愁眉苦臉地迎上來院刁,“玉大人,你說我怎么就攤上這事粪狼⊥诵龋” “怎么了?”我有些...
    開封第一講書人閱讀 153,220評論 0 344
  • 文/不壞的土叔 我叫張陵再榄,是天一觀的道長狡刘。 經(jīng)常有香客問我,道長不跟,這世上最難降的妖魔是什么颓帝? 我笑而不...
    開封第一講書人閱讀 55,416評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮窝革,結(jié)果婚禮上购城,老公的妹妹穿的比我還像新娘。我一直安慰自己虐译,他們只是感情好瘪板,可當(dāng)我...
    茶點故事閱讀 64,425評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著漆诽,像睡著了一般侮攀。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上厢拭,一...
    開封第一講書人閱讀 49,144評論 1 285
  • 那天兰英,我揣著相機與錄音,去河邊找鬼供鸠。 笑死畦贸,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的楞捂。 我是一名探鬼主播薄坏,決...
    沈念sama閱讀 38,432評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼寨闹!你這毒婦竟也來了胶坠?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,088評論 0 261
  • 序言:老撾萬榮一對情侶失蹤繁堡,失蹤者是張志新(化名)和其女友劉穎沈善,沒想到半個月后乡数,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,586評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡闻牡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,028評論 2 325
  • 正文 我和宋清朗相戀三年瞳脓,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片澈侠。...
    茶點故事閱讀 38,137評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡劫侧,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出哨啃,到底是詐尸還是另有隱情烧栋,我是刑警寧澤,帶...
    沈念sama閱讀 33,783評論 4 324
  • 正文 年R本政府宣布拳球,位于F島的核電站审姓,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏祝峻。R本人自食惡果不足惜魔吐,卻給世界環(huán)境...
    茶點故事閱讀 39,343評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望莱找。 院中可真熱鬧酬姆,春花似錦、人聲如沸奥溺。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽浮定。三九已至相满,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間桦卒,已是汗流浹背立美。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留方灾,地道東北人建蹄。 一個月前我還...
    沈念sama閱讀 45,595評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像迎吵,于是被迫代替她去往敵國和親躲撰。 傳聞我的和親對象是個殘疾皇子针贬,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,901評論 2 345

推薦閱讀更多精彩內(nèi)容