導航:首頁 > 操作系統 > 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相關的資料

熱點內容
不能從文件夾看到迅雷 瀏覽:138
編程處理表格有意義嗎 瀏覽:438
java字元串回車換行 瀏覽:155
普通分體空調是什麼壓縮機 瀏覽:824
數控車床牙刀滾花編程實例 瀏覽:944
辦公室pdf 瀏覽:279
自動化測量和編程 瀏覽:588
827編程教學 瀏覽:726
跳轉到文件夾 瀏覽:518
文件夾怎麼解壓並安裝 瀏覽:402
壓縮機維修論壇 瀏覽:8
加密碼的筆記本app 瀏覽:685
伺服器ac是怎麼填 瀏覽:474
編譯原理短語可以是句子嗎 瀏覽:652
電腦版燈塔app怎麼下載 瀏覽:554
我的魂斗羅歸來怎麼安卓轉蘋果 瀏覽:150
iphone怎麼隱藏app內容 瀏覽:954
移動手機怎麼修改登錄密碼app 瀏覽:582
兩點間中點垂直線cad命令 瀏覽:32
dpdk編程開發 瀏覽:978