精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

国产亚洲精久久久久久| 国产美女一区| 亚洲第一区第二区| 国产精品欧美激情在线观看| 成人在线免费电影| 国产99久久久国产精品潘金| 日韩美女在线看| 九九热最新地址| 日韩在线影视| 日韩色在线观看| 欧美激情成人网| www.久久ai| 2024国产精品| 成人精品在线视频| 黄色在线免费观看| 欧美一区网站| 一区二区欧美亚洲| 韩国三级视频在线观看| 精品女同一区二区三区在线观看| 亚洲图片欧美综合| 亚洲一区三区电影在线观看| 日本成人动漫在线观看| 日本午夜一区二区| 97视频在线观看成人| 美国黄色特级片| 欧美a大片欧美片| 欧美一级一区二区| 超碰av在线免费观看| h片在线观看视频免费免费| 国产精品毛片a∨一区二区三区| 国产一区二区三区无遮挡| 亚洲一区二区三区网站| 久久狠狠婷婷| 97精品在线视频| 毛片aaaaa| 97视频精品| 亚洲人成电影网站| 双性尿奴穿贞c带憋尿| 日韩中文字幕| 91精品欧美福利在线观看| 天天操天天爽天天射| 亚洲一级少妇| 粉嫩老牛aⅴ一区二区三区| av一区二区三区免费观看| 瑟瑟视频在线| 国产精品久久久久久久久久免费看| 欧美日韩国产精品一区二区| 天堂成人在线观看| 不卡在线观看av| 国产超碰91| 精品人妻午夜一区二区三区四区| 久久精品国产精品青草| 国产精品综合久久久| 中文字幕乱码一区二区| 日本美女一区二区三区视频| 国产成人久久精品| 狠狠狠狠狠狠狠| 日本最新不卡在线| 国产精品网红直播| 911美女片黄在线观看游戏| 久久se这里有精品| 成人在线免费观看视视频| 国产又黄又大又爽| 黑人巨大精品欧美一区| 91在线高清免费观看| 国产成人麻豆精品午夜在线| 国产精品18久久久久久久久久久久| 91麻豆国产语对白在线观看| 国产黄色大片网站| www.av精品| 欧美一区二区三区电影在线观看| 国产精品99999| 亚洲国产精品黑人久久久| 亚洲欧美日韩另类精品一区二区三区 | 国产一区二区三区电影在线观看| 亚洲欧美精品伊人久久| 国产91丝袜美女在线播放| 秋霞欧美视频| 久久亚洲欧美日韩精品专区| 久久这里只有精品免费| 美女诱惑黄网站一区| 国产精品入口福利| 国内老熟妇对白xxxxhd| jizz一区二区| 无遮挡亚洲一区| 成人黄色在线电影| 精品国产鲁一鲁一区二区张丽 | 久久国产精品露脸对白| 91九色偷拍| 性xxxxbbbb| 国产清纯美女被跳蛋高潮一区二区久久w | 久久青草福利网站| 国产精品自拍第一页| 狠狠色综合播放一区二区| 国产精品一区二区在线观看| 免费在线国产| 亚洲欧美日本韩国| 狠狠97人人婷婷五月| 日韩精品一页| 日韩成人av在线| 糖心vlog免费在线观看| 亚洲精品影视| 91精品免费看| 桃花色综合影院| 亚洲婷婷在线视频| 97在线播放视频| 日韩08精品| 一区二区亚洲精品国产| 日韩三级av在线| 激情综合亚洲精品| 欧美午夜欧美| sqte在线播放| 91麻豆精品国产91久久久资源速度 | 国产99精品国产| 亚洲电影免费| 成人动漫一区| 亚洲国产精品久久久久秋霞蜜臀 | 亚洲地区一二三色| www.超碰97.com| 免费精品国产| 69精品小视频| 亚洲精品18在线观看| 国产精品免费久久久久| 37pao成人国产永久免费视频| 成人51免费| 丝袜美腿精品国产二区| 国产精品男女视频| 成人avav影音| 欧美又粗又长又爽做受| 国产色99精品9i| 日韩亚洲一区二区| 免费视频网站在线观看入口| 99视频国产精品| 人人妻人人做人人爽| 欧美日韩中出| 久久成年人免费电影| 91精品国产乱码久久久| 国产欧美va欧美不卡在线| 日韩人妻精品无码一区二区三区| www.成人网| 欧美国产日韩免费| 国产激情久久久久久熟女老人av| 国产精品国产三级国产aⅴ原创| 看欧美ab黄色大片视频免费| 亚洲小说图片| 国产91免费看片| 日本人妖在线| 欧洲中文字幕精品| 欧美激情 一区| 日本欧美韩国一区三区| 亚洲欧洲精品一区| 天堂综合在线播放| 欧美www在线| 国产乱色精品成人免费视频| 亚洲免费观看高清| 国产又粗又猛又爽又黄| 好看不卡的中文字幕| 国产精品日韩高清| 91桃色在线| 日韩精品在线播放| 色老头一区二区| 国产精品美女久久久久av爽李琼 | 国产成人综合在线| 成人免费视频91| 天美av一区二区三区久久| 青青草原成人在线视频| 成人高清网站| 91麻豆精品国产自产在线| 久久久久久久中文字幕| 播五月开心婷婷综合| 日批视频在线免费看| 波多野结衣的一区二区三区| 91精品在线国产| xxx在线免费观看| 亚洲男人天堂网| 亚洲性在线观看| 伊人婷婷欧美激情| 日本少妇色视频| 奇米影视7777精品一区二区| 99亚洲精品视频| 精品资源在线| 国产精品青草久久久久福利99| 黄色网在线看| 亚洲国产精品久久久久| 国产成人a v| 一区二区三区中文字幕精品精品 | 欧美黑人狂野猛交老妇| 亚洲色图21p| 欧美色图第一页| 国产一级片久久| 日本一区二区三区四区| 国产精品熟女一区二区不卡| 一区二区激情| 影音欧美亚洲| 精品一区二区男人吃奶| 成人黄色av免费在线观看| av成人福利| 最近更新的2019中文字幕| 成人毛片视频免费看| 欧美性生活大片视频| www.youjizz.com亚洲| 国产精品亲子伦对白| 超碰男人的天堂| 国产呦萝稀缺另类资源| 黄色高清无遮挡| 中文精品电影| 亚洲不卡1区| 99国产精品久久一区二区三区| 国产精品扒开腿做爽爽爽的视频| 国产网红在线观看| www国产精品视频| 日韩电影免费| 亚洲精品在线观看网站| 亚洲香蕉在线视频| 日本韩国欧美一区| 免费在线观看黄网站| 中文字幕亚洲精品在线观看| 国产成人av一区二区三区不卡| 国产福利一区二区三区视频在线| 伊人国产在线视频| 久久精选视频| 国产精品裸体瑜伽视频| 欧美欧美天天天天操| 亚洲激情图片| 精品一区二区三区的国产在线观看| 国产精品露出视频| 日本成人精品| 国产一区红桃视频| 国产精品蜜月aⅴ在线| 热99精品只有里视频精品| a天堂资源在线| 国语自产精品视频在线看一大j8 | 55夜色66夜色国产精品视频| 日韩av激情| 欧美高清视频在线| bt在线麻豆视频| 久久人人爽人人爽爽久久| 98在线视频| 一区二区三区四区视频| 成人免费高清在线播放| 在线午夜精品自拍| 在线观看精品一区二区三区| 亚洲欧美福利视频| 国产资源在线观看| 亚洲男子天堂网| 精品推荐蜜桃传媒| 亚洲性xxxx| 国产特黄在线| 国产一区二区三区在线看| 国产鲁鲁视频在线观看免费| 亚洲午夜av久久乱码| 国产精品一区在线看| 色妞久久福利网| 麻豆视频网站在线观看| 超薄丝袜一区二区| 影院在线观看全集免费观看| 欧美黄色片在线观看| 国产羞羞视频在线播放| 7m第一福利500精品视频| 亚洲精品**中文毛片| 国产成人精品av在线| 久久精品黄色| 91在线观看免费高清完整版在线观看 | 波多野结衣视频播放| 久久免费看少妇高潮| 精品国产aaa| 亚洲精品国产精品乱码不99| 精品无码久久久久久久| 精品国产91久久久久久老师| 天天射天天干天天| 91麻豆精品国产91久久久使用方法 | 欧美一二三四区在线| 欧美77777| 亚洲精品视频在线播放| www.国产精品.com| 欧美精品少妇videofree| av白虎一区| 国产精品99导航| 久久精品一级| 蜜桃久久影院| 国产精品88久久久久久| www.av毛片| 日本午夜精品视频在线观看| 亚洲精品国产久| 91网站在线观看视频| 四季av中文字幕| 一区二区成人在线视频| 中文字幕日韩免费| 91精品国产色综合久久ai换脸| 日本xxxxxwwwww| 北条麻妃99精品青青久久| freexxx性亚洲精品| 成人av番号网| 欧美精品中文| 视色,视色影院,视色影库,视色网| 夜久久久久久| 91性高潮久久久久久久| 久久老女人爱爱| 免费看一级一片| 欧美日韩中文字幕一区| 十八禁一区二区三区| 色噜噜狠狠色综合网图区| 这里有精品可以观看| 亚洲综合社区网| 欧美另类69xxxxx| av免费观看国产| 国产一区在线不卡| 黄色片网站免费| 天天综合天天综合色| 国产精品老熟女视频一区二区| 亚洲精品视频久久| 123区在线| 91久久精品国产91久久性色tv| 狠狠综合久久av一区二区蜜桃 | xxxx视频在线| 亚洲在线视频福利| 日韩中文欧美| 可以在线看的黄色网址| 成人av午夜影院| 欧美黄色一区二区三区| 欧美日韩黄视频| 二区在线观看| 琪琪第一精品导航| 欧美大胆a级| 成年人网站国产| 国产经典欧美精品| 国产午夜精品理论片| 欧美日韩综合在线| 黄上黄在线观看| 欧美中文字幕在线视频| 欧美一级全黄| 人人干视频在线| 成人高清免费观看| 九九免费精品视频| 日韩欧美一区在线| 18视频在线观看| 91最新在线免费观看| 国产精品久久久久久麻豆一区软件| 91人人澡人人爽人人精品| 国产亚洲精品福利| 亚洲精品国产精品乱码视色| 亚洲欧洲一区二区三区久久| 另类激情视频| 品久久久久久久久久96高清| 久久av在线| 女人又爽又黄免费女仆| 色婷婷国产精品久久包臀| 青青草av免费在线观看| 国产91色在线免费| 免费不卡中文字幕在线| 男人天堂成人在线| 国产精品无码永久免费888| 中文字幕一区二区三区免费看| 中文字幕日韩免费视频| 在线日韩三级| 一本色道久久88亚洲精品综合| 国产盗摄一区二区三区| 久久久久久久久久久97| 亚洲精品久久久久久久久久久久 | 欧美不卡在线| wwwxx日本| 色综合欧美在线| 成a人片在线观看www视频| 成人激情视频在线播放| 国产综合欧美| 日韩片在线观看| 欧美自拍偷拍一区| 国内外激情在线| 国产精品9999久久久久仙踪林| 日韩视频在线一区二区三区| 素人fc2av清纯18岁| 欧美性猛交xxxx乱大交退制版 | 日韩一区日韩二区| www.色婷婷.com| 91爱视频在线| 久久在线视频| 9.1在线观看免费| 91久久精品日日躁夜夜躁欧美| 伊人免费在线| 国产精品免费一区二区| 久久综合图片| 成熟的女同志hd| 精品亚洲国产视频| 亚洲18在线| av7777777| 国产精品国产a级| 欧美一区二区三区激情| 国产精品免费久久久久影院| 综合日韩在线| 自拍偷拍视频亚洲| 日韩午夜激情视频| 性感美女一区二区在线观看| 先锋影音男人资源| 久久久久久久久久看片| a天堂在线观看视频| 秋霞av国产精品一区| 欧美成人一品| 我不卡一区二区| 亚洲国产精品女人久久久| 91精品国产自产观看在线 |