精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Android: 自定義View

移動開發 Android
如果功能布局要求非常定制化,已經不能由Android內置的View創建 —這時候就需要使用自定義View了。而這意味著在大多數情況下,我們將需要相當長的時間來完成它。但這并不意味著我們不應該這樣做,因為實現它是非常令人興奮和有趣的。

簡介

每天我們都會使用很多的應用程序,盡管他們有不同的約定,但大多數應用的設計是非常相似的。這就是為什么許多客戶要求使用一些其他應用程序沒有的設計,使得應用程序顯得獨特和不同。

如果功能布局要求非常定制化,已經不能由Android內置的View創建 —這時候就需要使用自定義View了。而這意味著在大多數情況下,我們將需要相當長的時間來完成它。但這并不意味著我們不應該這樣做,因為實現它是非常令人興奮和有趣的。

我最近面臨了類似的情況:我的任務是使用ViewPager實現Android應用引導頁。不同于iOS,Android并沒有提供這樣的View,所以我不得不編寫一個自定義View來實現它。

我花了一些時間來實現它。幸運的是,時下很多開源項目都有類似可復用的View,這節省了我和其他開發者的時間。我決定基于這種View創建一個公共庫。如果你有類似的功能需求并且缺乏時間實現它,可以在github repo發現它。 

 

 

Sample of using PageIndicatorView 

Sample of using PageIndicatorView

繪制!

因為編寫自定義View比起普通的View更耗時,你應該只在為了實現特定的功能但沒有更簡單的方法情況下使用自定義View,或者你希望通過自定義View解決以下問題:

  1. 性能。如果你布局里面有很多View,你想通自定義View優化它,使其更輕量。
  2. 視圖層次結構復雜。
  3. 一個完全自定義的View,需要手動繪制才能實現。

如果你還沒有嘗試過編寫自定義View,這篇文章將教會你繪制扁平的自定義View的一些技巧。我將會告訴你整體的視圖結構,如何實現具體的功能,不要重犯常見的錯誤,以及實現動畫效果!

我們需要知道的***件事 –View的生命周期。不知出于某種原因,谷歌并沒有提供View生命周期的圖表,由于開發者普遍對其有誤解,導致了一些意想不到的錯誤和問題,所以我們要認清這過程。 

 

 

View生命周期的圖表 

構造函數

每個View的生命都是從構造函數開始。而且這是一個繪制初始化,進行各種計算,設定默認值或做任何我們需要的事情很好的地方。

但是,為了使我們的View更易于使用和配置,Android提供了很有用的AttributeSet接口。它很容易實現,而且絕對值得花時間去了解和實現它,因為它會幫助你(和你的團隊)通過靜態參數來設置View,對于以后新特性加入或者新屏幕拓展性支持也更好。

首先,創建一個新的文件attrs.xml。所有不同的自定義View屬性都可以放在該文件中。正如你看到的這個例子,我們有一個PageIndicatorView和它的唯一屬性piv_count。 

 

 

Custom Attributes sample 

Custom Attributes sample

緊接著在View的構造函數中,你需要獲取這個屬性并使用它,如下圖所示。

  1. public PageIndicatorView(Context context, AttributeSet attrs) { 
  2.     super(context, attrs); 
  3.     TypedArray typedArray = getContext().obtainStyledAttributes(attrs, R.styleable.PageIndicatorView); 
  4.     int count = typedArray.getInt(R.styleable.PageIndicatorView_piv_count,0); 
  5.     typedArray.recycle(); 
  6.  

注意:

  • 在創建自定義屬性使用一個簡單的前綴,以避免與其它View類似的屬性名稱沖突。一般我們使用View名稱縮寫,就像例子中的piv_。
  • 如果你使用的是Android Studio,一旦你使用完屬性,lint會建議你調用recycle()方法 。The reason is just to get rid of inefficiently bound data that’s not gonna be used again。[譯者注:翻譯有點拗口,其實就是回收TypedArray,以便后面重用]

onAttachedToWindow

父View調用addView(View)后,這個View將被依附到一個窗口。在這個階段,我們的View會知道它被包圍的其他view。如果你的View和其他View在相同的layout.xml,這是通過id找到他們的好地方(你可以通過屬性進行設置),同時可以保存為全局(如果需要)的引用。

onMeasure

這意味著我們的自定義View到了處理自己的大小的時候。這是非常重要的方法,因為在大多數情況下,你的View需要有特定的大小以適應你的布局。

當你重寫此方法,需要記得的是,最終要設置setMeasuredDimension(int width, int height) 。 

 

 

onMeasure 

onMeasure

當處理自定義View的大小時候,使用者可能通過layout.xml或者動態設置了具體的大小。要正確地計算它,我們需要做幾件事情。

1.計算你的View內容所需的大小(寬度和高度)。

2.獲取你的View MeasureSpec大小和模式(寬度和高度)。

  1. protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 
  2.         int widthMode = MeasureSpec.getMode(widthMeasureSpec); 
  3.         int widthSize = MeasureSpec.getSize(widthMeasureSpec); 
  4.         int heightMode = MeasureSpec.getMode(heightMeasureSpec); 
  5.         int heightSize = MeasureSpec.getSize(heightMeasureSpec); 
  6.     }  

3.檢查MeasureSpec 設置和調整View(寬度和高度)的尺寸模式。

  1. int width; 
  2.   if (widthMode == MeasureSpec.EXACTLY) { 
  3.      width = widthSize; 
  4.    } else if (widthMode == MeasureSpec.AT_MOST) { 
  5.      width = Math.min(desiredWidth, widthSize); 
  6.   } else { 
  7.     width = desiredWidth; 
  8.   }  

注意:

看看MeasureSpec的值:

  • MeasureSpec.EXACTLY 意味著硬編碼大小值,所以你應該設置指定的寬度或高度。
  • MeasureSpec.AT_MOST 用于表明你的View匹配父View的大小,所以它應該和他想要的大小一樣大。

[譯者注:此時View尺寸只要不超過父View允許的***尺寸即可]

  • MeasureSpec.UNSPECIFIED 實際上是視圖包裝尺寸。因此,你可以使用上面計算所需的大小。

在通過setMeasuredDimension設置最終值之前,以防萬一,可以檢查這些值不為負數。這可以避免在布局預覽時一些問題。

onLayout

此方法分配大小和位置給它的每一個子View。正因為如此,我們正在研究一個扁平的自定義視圖(繼承簡單的View)不具有任何子View,那么就沒有理由重寫此方法。[譯者注:實現可以參考Custom Layouts on Android]

onDraw

這就是發生魔法的地方。在這里,使用Canvas和Paint對象你將可以畫任何你需要的東西。

一個Canvas實例從onDraw參數得來,它一般用于繪制不同形狀,而Paint對象定義形狀顏色。簡單地說,Canvas用于繪制對象,而Paint用于造型。它們無處不在,無論繪制的是一個直線,圓或長方形。 

 

 

onDraw() — methods example 

onDraw() — methods example

使自定義View,要始終牢記onDraw會花費大量的時間。當布局有一些變化,滾動、快速滑動都會導致重新繪制。所以這就是為什么Android Studio也建議:避免在onDraw中進行對象分配的操作,對象應該只創建一次并在將來重用。 

 

 

onDraw() — Paint object recreation 

onDraw() — Paint object recreation 

 

 

onDraw() — Paint object reuse 

onDraw() — Paint object reuse

注意:

  • 在執行繪制時始終牢記重用對象,而不創建新的。不要依賴于IDE高亮一個潛在的問題,而是自己有意識地去做這件事,因為在onDraw調用一個內部會創建對象的方法時,IDE無法識別它。
  • 同時請不要硬編碼View大小。其他開發者在使用時可以定義不同的大小,所以View大小應該取決于它有什么尺寸。

View 更新

從View的生命周期圖可以得知,可以重繪View自身有兩種方法。invalidate()和requestLayout()方法會幫助你在運行時動態改變View狀態。但為什么需要兩個方法?

  • invalidate()用來簡單重繪View。例如更新其文本,色彩或觸摸交互性。View將只調用onDraw()方法再次更新其狀態。
  • requestLayout()方法,你可以看到其將會從`onMeasure()開始更新View。這意味著你的View更新后,它改變它的大小,你需要再次測量它,并依賴于新的大小來重新繪制。

動畫

在自定義View中,動畫是一幀一幀的過程。這意味著,如果你想使一個圓半徑從小變大,你將需要逐步增加半徑并調用invalidate()來重繪它。

在自定義View動畫中,ValueAnimator是你的好朋友。下面這個類將幫助你從任何值開始執行動畫到***,甚至支持Interpolator(如果需要)。

  1. ValueAnimator animator = ValueAnimator.ofInt(0, 100); 
  2. animator.setDuration(1000); 
  3. animator.setInterpolator(new DecelerateInterpolator()); 
  4. animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { 
  5.   public void onAnimationUpdate(ValueAnimator animation) { 
  6.     int newRadius = (int) animation.getAnimatedValue(); 
  7.   } 
  8. });  

注意:

當每一次新的動畫值出來時,不要忘記調用invalidate()。

責任編輯:龐桂玉 來源: 安卓開發精選
相關推薦

2016-11-16 21:55:55

源碼分析自定義view androi

2016-04-12 10:07:55

AndroidViewList

2017-03-02 13:33:19

Android自定義View

2013-05-20 17:33:44

Android游戲開發自定義View

2012-05-18 10:52:20

TitaniumAndroid模塊自定義View模塊

2013-01-06 10:43:54

Android開發View特效

2017-03-14 15:09:18

AndroidView圓形進度條

2021-10-26 10:07:02

鴻蒙HarmonyOS應用

2011-08-02 11:17:13

iOS開發 View

2013-04-01 14:35:10

Android開發Android自定義x

2017-05-19 10:03:31

AndroidBaseAdapter實踐

2017-05-18 12:36:16

android萬能適配器列表視圖

2010-02-07 14:02:16

Android 界面

2015-02-12 15:33:43

微信SDK

2011-08-18 17:32:55

iPhone開發Table Cell

2013-01-09 17:22:38

Android開發Camera

2015-02-12 15:38:26

微信SDK

2013-05-02 14:08:18

2014-12-10 10:37:45

Android自定義布局

2015-02-11 17:49:35

Android源碼自定義控件
點贊
收藏

51CTO技術棧公眾號

日本手机在线视频| 欧美精品video| 已婚少妇美妙人妻系列| 二区在线观看| 韩国精品一区二区| 欧美乱大交xxxxx另类电影| 荫蒂被男人添免费视频| 日本精品不卡| 亚洲女女做受ⅹxx高潮| 久久这里精品国产99丫e6| 一级特黄免费视频| 午夜性色一区二区三区免费视频| 亚洲国产天堂久久国产91| 国产免费毛卡片| 懂色av蜜桃av| 亚洲精品视频一二三| 国产成人精品亚洲日本在线桃色| 日韩在线观看av| 97精品人人妻人人| 国产激情欧美| 亚洲v中文字幕| 日韩欧美亚洲日产国| 国产夫妻性生活视频| 丝袜国产日韩另类美女| 欧美剧在线观看| 美女被到爽高潮视频| 中文字幕区一区二区三| 91国内精品野花午夜精品 | 久久99久久久久久| 国内三级在线观看| va亚洲va日韩不卡在线观看| 成人网在线视频| 久久久久久久亚洲| 亚洲在线免费| 欧美丰满少妇xxxxx| 天堂av网手机版| 91精品视频在线免费观看| 91九色蝌蚪成人| 亚洲乱码国产乱码精品| 在线视频 中文字幕| 成人在线亚洲| 日韩电影大片中文字幕| 国产高清自拍99| 成人毛片视频网站| 91在线视频| www国产精品av| 国产精品国产亚洲精品看不卡15 | 欧美丝袜一区| 国产视频精品xxxx| 精品国产av色一区二区深夜久久| 日韩影片在线观看| 91精品在线麻豆| 久久撸在线视频| 日本一区二区电影| 91久久精品网| 黑森林福利视频导航| av资源在线播放| 亚洲一区二区视频在线观看| 久久免费一级片| www免费在线观看| 亚洲三级理论片| 一区二区三区国产| 91精品国产高清自在线| 色哟哟一一国产精品| 全球成人免费直播| 一区二区成人精品| 91精品啪在线观看国产| 六月婷婷中文字幕| 国产成都精品91一区二区三| 成人激情免费在线| 伊人色综合久久久| 久久精品国内一区二区三区| 国产欧亚日韩视频| 亚洲一二区视频| 麻豆国产一区二区| 成人黄色av网站| 国产美女主播在线观看| 国产精品99久久久久久久女警| 亚洲最大福利网| 亚洲AV无码一区二区三区性| av中文一区二区三区| 麻豆一区区三区四区产品精品蜜桃| 日韩黄色影片| 国产精品福利影院| 中文字幕の友人北条麻妃| 婷婷色在线播放| 精品电影在线观看| 999精品视频在线| 丝袜a∨在线一区二区三区不卡| 日韩一级成人av| 久久久久中文字幕亚洲精品 | 国产福利第一页| 国产v日产∨综合v精品视频| 加勒比在线一区二区三区观看| 日韩欧美在线观看一区二区| 日本一区二区不卡视频| 中文字幕超清在线免费观看| 96av在线| 欧美日韩一区二区在线观看| 女教师高潮黄又色视频| 午夜精品福利影院| www.欧美精品一二三区| 精品少妇theporn| 视频一区欧美日韩| 亚洲综合色激情五月| 天天干,夜夜爽| 国产精品色哟哟| 久久人人爽人人爽人人av| 日韩av首页| 日韩欧美午夜| 色偷偷88888欧美精品久久久| 澳门黄色一级片| 蜜乳av另类精品一区二区| 亚洲jizzjizz日本少妇| 欧美日韩国产中文字幕在线| 亚洲乱码精品一二三四区日韩在线| 精品99在线视频| 精品国产亚洲日本| 国产一区二区三区精品久久久| 欧美黑吊大战白妞| 日韩成人av影视| 精品国产一区二区三区四区vr| 精品麻豆一区二区三区| 色婷婷久久99综合精品jk白丝| 69久久精品无码一区二区| 首页亚洲中字| 久久久免费av| 国产免费黄色录像| 国产精品女人毛片| 久久婷婷国产精品| 国产精品久久久久av蜜臀| www.日韩视频| 波多野结衣理论片| 972aa.com艺术欧美| 9191国产视频| 国产情侣一区在线| 色噜噜狠狠色综合网图区| 久久久免费高清视频| 岛国精品一区二区| 国产精品一二三在线观看| 久久久久久久性潮| 国产一区二区三区直播精品电影| 日韩成人免费观看| 国产不卡高清在线观看视频| 7777在线视频| 精品国产一区二区三区性色av | 成人性生活免费看| 欧美天天在线| av一本久道久久波多野结衣| 超碰免费在线播放| 欧美一区二区三区在线电影| 最新黄色av网址| 久久99在线观看| 在线看无码的免费网站| 日韩欧国产精品一区综合无码| 色妞欧美日韩在线| 国产精品爽爽久久久久久| 17c精品麻豆一区二区免费| 中文字幕国产免费| 天堂美国久久| 91免费精品国偷自产在线| 欧美成年黄网站色视频| 337p亚洲精品色噜噜狠狠| av成人免费网站| 久久66热re国产| 男同互操gay射视频在线看| 欧美激情精品| 久久全国免费视频| 亚洲 国产 欧美 日韩| 色综合久久久久网| 美女100%露胸无遮挡| 麻豆精品一区二区综合av| 在线观看日韩羞羞视频| 蜜桃在线一区| 亚洲91精品在线| 精品资源在线看| 欧美性感一类影片在线播放| 亚洲aaa视频| 国产成人精品一区二区三区四区 | 久久久久亚洲av成人无码电影| 日日噜噜夜夜狠狠视频欧美人| 亚洲精品8mav| 日本精品在线观看| 91精品国产色综合久久不卡98口| 你懂的免费在线观看| 欧美日韩精品一区二区| 欧美日韩国产精品一区二区三区| aaa国产一区| 在线观看的毛片| 亚洲色图插插| 久久伦理网站| 欧美视频在线视频精品| 久久久噜噜噜久久中文字免| 理论在线观看| 欧美一区二区三区影视| 欧美福利视频一区二区| 国产精品国产三级国产aⅴ原创| 男男受被啪到高潮自述| 久久aⅴ国产紧身牛仔裤| 综合视频在线观看| 丝袜美腿综合| 97视频中文字幕| av高清一区| 国语自产在线不卡| av电影在线播放高清免费观看| 欧美本精品男人aⅴ天堂| av片免费观看| 亚洲成人777| 欧美乱大交做爰xxxⅹ小说| 成人三级在线视频| 色婷婷一区二区三区av免费看| 亚洲精品看片| 粉嫩av一区二区三区天美传媒 | 日本乱码一区二区三区不卡| www.xxxx欧美| 免费一级在线观看| 亚洲精品一区二区三区影院| 亚洲最大成人在线视频| 精品欧美激情精品一区| 中文字幕av免费在线观看| 欧美国产1区2区| 在线视频 日韩| 国产成人一区二区精品非洲| 99热这里只有精品在线播放| 99精品国产一区二区青青牛奶| 国产四区在线观看| 日韩成人激情| 免费日韩电影在线观看| 成人直播在线观看| 91免费综合在线| 福利一区二区三区视频在线观看| 欧美一级免费视频| 91探花在线观看| 欧美风情在线观看| 最新超碰在线| 久久这里只有精品视频首页| 在线观看av的网站| 国产亚洲精品久久久久动| 婷婷av一区二区三区| 亚洲成人性视频| 丰满熟妇乱又伦| 精品久久久久av影院| 精品人妻无码一区二区| 91麻豆精品国产91久久久更新时间| jizz国产在线| 欧美中文字幕一区二区三区| 销魂美女一区二区| 色婷婷亚洲精品| 五月天婷婷导航| 一本到不卡免费一区二区| 特级西西444www大精品视频免费看| 亚洲国产成人tv| 久久久全国免费视频| 亚洲综合视频在线| 国产主播在线播放| 亚洲成av人片| 亚洲精品1区2区3区| 欧美视频中文字幕在线| 国产91精品一区| 欧洲在线/亚洲| 亚洲网站在线免费观看| 欧美福利视频一区| 国产av精国产传媒| 亚洲成人教育av| 性插视频在线观看| 国产一区二区三区欧美| 在线播放日本| 九九久久精品一区| 1024在线看片你懂得| 2020国产精品视频| 成人精品国产亚洲| 亚洲999一在线观看www| japanese色系久久精品| 精品91免费| 日韩精品免费一区二区在线观看| 中文字幕欧美日韩一区二区三区| 91精品精品| 欧美久久久久久久久久久久久久| 91久久视频| 黄色一级免费大片| 国产在线播精品第三| 一级黄色电影片| 久久久久久久电影| 一级片一级片一级片| 亚洲午夜三级在线| 国产伦精品一区二区三区视频我| 欧美丰满嫩嫩电影| 色综合视频在线| 中文字幕日韩精品在线| 日韩av激情| 国产成人在线精品| 日韩免费一级| 日韩乱码一区二区三区| 91麻豆免费在线观看| 亚洲天堂岛国片| 亚洲免费av网站| 日本熟妇毛耸耸xxxxxx| 在线免费观看一区| 国产成人精品免费看视频| 日韩久久免费视频| 久草中文在线观看| 91精品国产高清久久久久久91| 欧洲精品一区二区三区| 波多野结衣久草一区| 不卡中文字幕| 丁香花在线影院观看在线播放| 日本sm残虐另类| 在线免费看黄色片| 中文字幕中文字幕中文字幕亚洲无线| 国产污片在线观看| 欧美日本国产视频| 日本大片在线观看| 九九热精品视频国产| 日韩一区二区三区在线免费观看| 高清不卡日本v二区在线| 日韩1区在线| 日韩在线一级片| 国产99久久精品| sm捆绑调教视频| 日韩欧美精品网址| 成人爽a毛片一区二区| 久久国产一区二区三区| 欧美亚洲大片| 精品一区二区视频| 欧美三级第一页| 亚洲最大av在线| 在线视频中文字幕第一页| 97欧美精品一区二区三区| 久久精品国产福利| 蜜桃传媒视频麻豆一区| 激情六月综合| 色播五月综合网| 2欧美一区二区三区在线观看视频| 美女福利视频在线观看| 欧美三级电影在线观看| 可以在线观看的av| 91国内免费在线视频| 成人av综合网| 免费看欧美黑人毛片| 国产精品 欧美精品| 国精品人伦一区二区三区蜜桃| 欧美在线免费观看视频| 黄色国产在线| 国产精品成人国产乱一区| 亚洲午夜久久| 18岁网站在线观看| 91在线porny国产在线看| 日产电影一区二区三区| 精品国产乱码久久久久久老虎 | 国产一区二区三区在线观看免费 | 欧美一区二区三区免费在线看| 国产精品99999| 国产精品91久久久| 黑人操亚洲人| 91人人澡人人爽人人精品| 欧美国产日产图区| 中文字幕男人天堂| 少妇激情综合网| www一区二区三区| 成年丰满熟妇午夜免费视频| 国产精品99久久久久久久vr| 久久免费视频精品| 亚洲国产高清自拍| 性欧美freesex顶级少妇| 欧美精品123| 蜜臀av性久久久久av蜜臀妖精 | 国产探花在线看| 亚洲欧美日韩久久精品| 国产xxxxxx| 久久久久久国产免费| 日韩极品在线| 一区二区三区免费播放| 成人欧美一区二区三区视频网页| 国产精品无码免费播放| 久久91亚洲人成电影网站| 精品三级av| 午夜视频在线瓜伦| 日韩毛片一二三区| 高潮毛片7777777毛片| 欧美综合一区第一页| 日韩理论在线| www日本在线观看| 日韩欧美国产网站| 欧美三级黄网| 粉嫩av四季av绯色av第一区 | www.com污| 一区二区三区不卡在线观看| 亚洲欧美日本在线观看| 国产精品视频在线播放| 韩国欧美一区| 国产aⅴ激情无码久久久无码| 欧美一级理论片| 91久久国产综合久久91猫猫| 婷婷视频在线播放| 99视频精品全部免费在线| 亚洲综合视频在线播放| 91精品国产91久久久久久不卡| 99国产**精品****| 亚洲永久无码7777kkk| 4hu四虎永久在线影院成人|