導航:首頁 > 操作系統 > androiddrawablexml

androiddrawablexml

發布時間:2023-03-20 13:32:10

android繪圖基礎--Canvas和Drawable

Github鏈接

畫2D圖形有兩種方法:

Canvas實際上是封裝了各種draw方法的類,調用draw方法把圖形繪制到底層的Surface上,即繪制在Window上。

這個例子中構造了兩個Canvas和一個Bitmap,分別調用其draw方法,先是mCanvas往Bitmap里繪制一個方塊,再在onDraw方法內調用canvas.drawBitmap繪制這個方塊。

思考一個問題,為什麼mCanvas需要設置Bitmap?

很簡單,因為它沒有持有一塊內存地址,自然沒法繪制。來看一下draw的起點ViewRootImpl(軟體繪制,不開啟硬體加速下)。

這個通過mSurface.lockCanvas返回的Canvas是View.draw的canvas變數,所以當1,2情況時,Canvas都持有一個Bitmap,指向共享內存里的某一小塊,當調用Canvas.draw方法時就能繪制出東西。但對於自定義Canvas來說並不是,即使設置一個Bitmap和繪制了Bitmap,但不往共享內存上寫,屏幕上是不會顯示的,SurfaceView同理,通過Surface.lockCanvas獲取持有共享內存的Canvas,繪制完畢後調用Surface.unlockCanvasAndPost把繪制內容顯示到surface上並release掉Canvas。

順帶一提Canvas.save和Canvas.restore方法,如下Demo

效果圖如

畫的是三個顏色和旋轉角度都不同的小方形。

步驟1把默認坐標系旋轉20°,畫出第一個藍色的方形,步驟2保存當前的matrix(旋轉了20°),繼續旋轉20°,此時坐標系已經旋轉了40°,畫出第二個黃色的方塊,步驟3,恢復上一步保存的matrix(旋轉了20°),此時坐標系還是旋轉了20°,步驟4,再旋轉40°,此時坐標系旋轉了60°,畫出第三個黑色方塊。

Canvas.save用於保存當前matrix和clip,Canvas.restore用於恢復上次保存的matrix和clip。

Drawable是一個能畫出來的物體的抽象,使用前需要調用setBounds確定位置和大小,通過getIntrinsicHeight和getIntrinsicWidth取到實際大小。Drawable可以有幾種形式存在:Bitmap、Nine Patch、Vector、Shape、Layers等。

從Resource.getDrawable會判斷是否.xml結尾,不是的話走6,7步,如果從xml中讀取,需要getResource.getDrawable -> ResourceImpl.loadDrawableForCookie -> drawable.createFromXml -> DrawableInflater.inflateFromXmlForDensity -> drawable.inflateFromTag

看一下Shape實現類GradientDrawable的inflate實現,讀取各項屬性並賦值,到draw方法。

調用canvas.drawRect把mRect畫出來,而mRect的賦值在ensureValidRect。[圖片上傳失敗...(image-a25af0-1515826613001)]

bounds在哪裡設置的?答案是ImageView.updateDrawable內,會調用Drawable.getIntrinsicHeight賦值(從xml中size屬性讀取),再調用configureBounds -> setBounds,如果使用的不是ImageView,一定要在draw之前 調用setBounds ,否則size就會出錯。

回到loadDrawableForCookie,再看一下6,7步載入圖片的過程,通過AssetManager讀取圖片流數據,通過Drawable.createFromResourceStream這個我們經常使用的方法獲取到Drawable。

取到屏幕密度之後調用BitmapFactory.decodeResourcesStream,計算密度後調用native創建Bitmap,感興趣的同學可以看下更具體的分析文章(如 理解Bitmap )。

本文探究了兩點

Android 7.1.1 源碼

Android 官方文檔, Canvas and Drawable , Drawable 等

⑵ Android怎麼繪制Drawable資源(Drawable引用的是selector)

定義在XML中的一個可繪制資源,它能夠用指定的距離嵌入到另一個可繪制資源中。這種資源可在View對象需要的背景比它的實際邊界小的時候使用。
文件位置(FILE LOCATION):

res/drawable/filename.xml

文件名被用於資源ID。

編譯資源的數據類型(COMPILED RESOURCE
DATATYPE):

資源指向一個InsetDrawable對象。

資源引用(RESOURCE
REFERENCE):

java代碼中:R.drawable.filename

在XML中:@[package:]drawable/filename

⑶ android的xml中怎麼實現按鈕按下去變顏色

在drawable里新建一個xml,然後寫
<selector>
<item android:state_pressed="true" android:drawable="按下時的樣式"><item>
<item android:state_pressed="false" android:drawable="正常時的樣式"><item>
<selector>

然後可以再去創建兩個drawable來繪制形狀
如果你只是需要改變顏色那麼直接在string.xml里寫這樣兩條也行
<drawable name="正常時的樣式名字">正常時的顏色值</drawable>
 <drawable name="按下時的樣式名字">按下時的顏色值</drawable>

然後名字一一對應就行了

別忘了在控制項里引用
android:background="你之前設置的選擇器"

⑷ 關於Android Studio的drawable下創建xml文件問題

在drawable文件夾處右鍵--new--Drawable resource file即可

⑸ 在android工程中,res目錄下又有anim、drawable、layout、menu、raw、values和xml文件夾,分別用來保存

res目錄主要是存放資源文件的!
layout 布局 這個就是你經常看到的與用戶交互的界面的 xml 文件,就是各個 view 的排列和嵌套,沒什 么好說的啦 風格和主題、 風格主要是指 view 的顯示風格 ;
anim 一般是設置動畫,畫資源分為兩種,一是實現圖片的 translate、scale、rotate、alpha 四種變化。還可以設置 動畫的播放特性;另一種是幀動畫,逐幀播放設置的資源;
drawable 主要是是存放所使用的圖片的!
menu:菜單 菜單即可以從代碼中實現也可以在資源文件中配置;
把圖像文件放在 res/raw/ 目錄下,這樣可以避免被自動優化。
values 是用程序人員設置的一些常量的XML文件,便於修改和使用,一般有Strings,colors等

assets 文件夾是存放不進行編譯加工的原生文件,即該文件夾裡面的文件不會像 xml, java 文件被預編譯,可以存放一些圖片,html,js, css 等文件。

閱讀全文

與androiddrawablexml相關的資料

熱點內容
旅遊業程序員 瀏覽:395
區塊鏈第三代加密數字資產 瀏覽:525
把播放清單放在雲伺服器上 瀏覽:869
phpppt下載 瀏覽:300
1929pdf 瀏覽:366
編譯器是終端嗎 瀏覽:521
pdf改b4 瀏覽:380
命令通道 瀏覽:698
pdf去 瀏覽:543
嵌入式編譯器優化 瀏覽:127
不同品牌安卓一鍵換機用什麼軟體 瀏覽:957
二年下冊運演算法則 瀏覽:137
蘭溪兩級壓縮空壓機 瀏覽:137
網頁如何取回伺服器上的文件 瀏覽:96
linuxphp重啟命令行 瀏覽:575
為什麼我的所有app都登錄不了 瀏覽:579
別樣app海淘怎麼樣 瀏覽:513
聯通app扣費是什麼意思 瀏覽:403
android應用程序管理員許可權 瀏覽:85
石家莊十萬程序員 瀏覽:974