自定義View——繪制背景知識(shí)

  1. Bitmap
    • 作用:像素位圖重绷,是以像素為單位組成的圖像益缎,像素點(diǎn)可根據(jù)不同的排列和顏色(A R G B)以構(gòu)成圖像。因此莫秆,bitmap要點(diǎn)之處不外乎像素排列方式伙菊,像素壓縮編碼格式募舟。
    • Bitmap占用內(nèi)存計(jì)算(byte) = 圖片長度(像素) * 圖片寬度(像素) * 每個(gè)像素點(diǎn)占用的字節(jié)數(shù)(byte)
    • 注意:改變圖片寬高窘俺,像素存儲(chǔ)方式遇八,會(huì)影響占用內(nèi)存大小,但質(zhì)量壓縮虑鼎,如JPEG壓縮算法,只會(huì)減小文件大小,而解碼為Bitmap加載到內(nèi)存占用大小是不變的炫彩。
    • Bitmap.Config:描述像素的存儲(chǔ)方式匾七,通過改變A R G B每個(gè)像素點(diǎn)占用的字節(jié)數(shù)來壓縮內(nèi)存。
      • ALPHA_8:1byte江兢,僅有alpha通道昨忆,不存儲(chǔ)顏色信息。
      • RGB_565:2byte杉允,僅有RGB通道邑贴,其中R占5位(32種R精度),G占6位(64種G精度)叔磷,B占5位(32種B精度)拢驾,圖片可能會(huì)偏綠,可使用Dither添加抖動(dòng)處理改基,如果需要不透明位圖繁疤,它比ARGB_4444的圖片質(zhì)量更高。
      • ARGB_4444:2byte秕狰,不建議使用稠腊,在android4.4以上使用此配置會(huì)默認(rèn)替換為ARGB_8888,A R G B各占4位(16種精度)鸣哀。
      • ARGB_8888:4byte架忌,A R G B各占8位(256種精度),是常見存儲(chǔ)方式中圖片質(zhì)量最高的像素存儲(chǔ)方式我衬。
      • RGBA_F16:8byte叹放,適用于廣色域和HDR內(nèi)容。
      • HARDWARE:當(dāng)位圖僅存儲(chǔ)在圖形內(nèi)存中低飒,如果位圖的唯一操作是繪制到屏幕上许昨,可以考慮使用它。
    • Bitmap.CompressFormat:以JPEG褥赊,PNG糕档,WEBP進(jìn)行圖片質(zhì)量壓縮,在保持像素的前提下拌喉,通過改變圖片位深及透明度來達(dá)到圖片壓縮的目的速那,因此只會(huì)改變生成的文件大小,并不會(huì)改變解碼為Bitmap加載到內(nèi)存中占用的內(nèi)存大小尿背。
    • BitmapFactory:根據(jù)文件端仰,流或字節(jié)數(shù)組創(chuàng)建Bitmap
      • Options
        1. inDensity:圖片本身的像素密度(其實(shí)就是圖片資源所在的哪個(gè)密度文件夾下,如在xxhdpi下就是480田藐,如果在asstes荔烧、網(wǎng)絡(luò)圖片或sd卡下吱七,默認(rèn)是160dpi
        2. inTargetDensity:圖片最終在bitmap里的像素密度,如果沒有賦值鹤竭,會(huì)將inTargetDensity設(shè)置成inScreenDensity
        3. inScreenDensity:手機(jī)本身的屏幕密度
        4. inScaled = TargetDensityinDensity
  2. Canvas
    • 定義:Canvas踊餐,是一種繪制時(shí)的規(guī)則,是Android2D圖形繪制的基礎(chǔ)臀稚。
    • 作用:規(guī)定繪制內(nèi)容時(shí)的規(guī)則 & 內(nèi)容吝岭,繪制內(nèi)容是根據(jù)Canvas的規(guī)則繪制在屏幕上的,Canvas只是繪制時(shí)的規(guī)則吧寺,實(shí)際內(nèi)容是繪制在屏幕上的窜管。
    • 其他:
      • 當(dāng)調(diào)用Canvas.save()/Canvas.restore()會(huì)進(jìn)行圖層以及畫布狀態(tài)的出入棧。
        狀態(tài)棧
      • Canvas是由多個(gè)圖層構(gòu)成的
        1. 在畫布上操作 = 在圖層上操作
        2. 如無設(shè)置稚机,繪制操作和畫布操作是默認(rèn)在默認(rèn)圖層上進(jìn)行
        3. 在通常情況下幕帆,使用默認(rèn)圖層就可滿足需求;若需要繪制復(fù)雜的內(nèi)容(如地圖)抒钱,則需使用更多的圖層
        4. 最終顯示的結(jié)果 = 所有圖層疊在一起的效果


          畫布構(gòu)成 - 圖層
  3. Drawable
    • 作用:可繪制物體的抽象層面蜓肆,其子類表示可以繪制在Canvas上的對(duì)象。設(shè)置背景谋币,點(diǎn)擊效果仗扬,形狀,動(dòng)畫等時(shí)常會(huì)用到其子類蕾额。不過注意的是早芭,他不像View,不能進(jìn)行事件分發(fā)和響應(yīng)用戶操作诅蝶,大多數(shù)都是可以通過res/drawablexml進(jìn)行配置的退个。
  4. 其他要點(diǎn)
    • 屏幕點(diǎn)密度dpi計(jì)算公式:手機(jī)對(duì)角線像素(Pixel) / 手機(jī)對(duì)角線長度(英寸 Inch)
    • px:一個(gè)像素點(diǎn)的長度
    • dp:在dpi=160時(shí),1px的長度调炬,最后根據(jù)實(shí)際設(shè)備的dpi语盈,進(jìn)行像素縮放。因此 px = dp * (dpi / 160)
    • sp:文本大小單位缰泡,與dp同理刀荒,默認(rèn)情況下,等同于dp大小棘钞,僅能用于文字大小單位缠借。
    • res資源目錄對(duì)應(yīng)關(guān)系:
      匹配的資源目錄 屏幕點(diǎn)密度(dpi) 縮放比(對(duì)比mdpi)
      ldpi 120 0.75
      mdpi 160(基準(zhǔn)dpi,默認(rèn)值) 1.0
      hdpi 240 1.5
      xhdpi 320 2.0
      xxhdpi 480 3.0
      xxxhdpi 640 4.0
      nodpi ALL /
      tvdpi ≈213dpi 適用于TV ≈1.33
    • drawblemipmap文件夾
      • 如果在app內(nèi)使用資源宜猜,那么放在drawablemipmap目錄下泼返,系統(tǒng)只會(huì)根據(jù)上表dpi加載匹配的資源目錄下的資源。
      • 如果是在launcher中姨拥,那么放在mipmap下的資源绅喉,launcher會(huì)自動(dòng)選擇更加合適密度的資源渠鸽。
      • 因此,應(yīng)用圖標(biāo)launcher icon必須放在mipmap文件夾下霹疫,且必須保證不同密度的icon拱绑。
      • 其他資源隨意放在哪個(gè)文件夾下,如果有不同密度的圖那最好丽蝎,但如果僅有一張圖,優(yōu)先放在高密度(如xxhdpi)文件夾下膀藐,可以避免 高密度設(shè)備 使用 放在低密度文件夾下的圖片 放大寬高 造成的占用內(nèi)存增加屠阻。
      • 如果是網(wǎng)絡(luò)圖片,assets文件夾底下或者手機(jī)本地文件夾加載的圖片额各,都會(huì)默認(rèn)使用mdpi也就是160dpi的像素密度国觉,如果想改變其縮放比,必須同時(shí)調(diào)整BitmapFactory.Options.inDensityBitmapFactory.Options.inTargetDensity的值才能起作用虾啦。
      • 例子:一個(gè)30 * 30的ARGB_8888圖片放在 hdpi文件夾下麻诀,480dpi的設(shè)備訪問這張圖,那么首先30 * 30的圖片會(huì)被放大成 30 * ( 3 / 2) * 30 * ( 3 / 2) = 45 * 45 大小的圖片 最終加載成bitmap占用內(nèi)存的大小就是 45 * 45 * 4 = 8100(byte)
  5. 繪制圖形基礎(chǔ)以及各api使用
  6. 系列文章
    1. View的背景知識(shí)
    2. View的測量流程
    3. View的布局流程
    4. View的繪制背景知識(shí)
    5. View的繪制流程
    6. View的三大繪制流程總結(jié)
    7. View的事件分發(fā)機(jī)制
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末傲醉,一起剝皮案震驚了整個(gè)濱河市蝇闭,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌硬毕,老刑警劉巖呻引,帶你破解...
    沈念sama閱讀 216,402評(píng)論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異吐咳,居然都是意外死亡逻悠,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門韭脊,熙熙樓的掌柜王于貴愁眉苦臉地迎上來童谒,“玉大人,你說我怎么就攤上這事沪羔〖⒁粒” “怎么了?”我有些...
    開封第一講書人閱讀 162,483評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵任内,是天一觀的道長撵渡。 經(jīng)常有香客問我,道長死嗦,這世上最難降的妖魔是什么趋距? 我笑而不...
    開封第一講書人閱讀 58,165評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮越除,結(jié)果婚禮上节腐,老公的妹妹穿的比我還像新娘外盯。我一直安慰自己,他們只是感情好翼雀,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,176評(píng)論 6 388
  • 文/花漫 我一把揭開白布饱苟。 她就那樣靜靜地躺著,像睡著了一般狼渊。 火紅的嫁衣襯著肌膚如雪箱熬。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,146評(píng)論 1 297
  • 那天狈邑,我揣著相機(jī)與錄音城须,去河邊找鬼。 笑死米苹,一個(gè)胖子當(dāng)著我的面吹牛糕伐,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播蘸嘶,決...
    沈念sama閱讀 40,032評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼良瞧,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了训唱?” 一聲冷哼從身側(cè)響起褥蚯,我...
    開封第一講書人閱讀 38,896評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎雪情,沒想到半個(gè)月后遵岩,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,311評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡巡通,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,536評(píng)論 2 332
  • 正文 我和宋清朗相戀三年尘执,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片宴凉。...
    茶點(diǎn)故事閱讀 39,696評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡誊锭,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出弥锄,到底是詐尸還是另有隱情丧靡,我是刑警寧澤,帶...
    沈念sama閱讀 35,413評(píng)論 5 343
  • 正文 年R本政府宣布籽暇,位于F島的核電站温治,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏戒悠。R本人自食惡果不足惜熬荆,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,008評(píng)論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望绸狐。 院中可真熱鬧卤恳,春花似錦累盗、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至拆融,卻和暖如春蠢琳,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背镜豹。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評(píng)論 1 269
  • 我被黑心中介騙來泰國打工挪凑, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人逛艰。 一個(gè)月前我還...
    沈念sama閱讀 47,698評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像搞旭,于是被迫代替她去往敵國和親散怖。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,592評(píng)論 2 353