當前位置:首頁 » 安卓系統 » androidcanvas大小

androidcanvas大小

發布時間: 2023-05-12 03:06:33

㈠ 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 canvas.drawBitmap() 繪制圖片大小的問題

你繪圖的控制項是不是足夠大?像素密度有沒有計算進去?bitmap直接可以判斷大小的,單位是px。你打log把該輸出的輸出一下看看。

㈢ Android 繪圖之Canvas相關API使用

Android 自定義控制項或多或少都會用到Canvas,那麼我們就需要熟悉它的API。Canvas給我們提供了大量的的DrawXXX方法,通過這些方法我們就可以繪制出我們想要的效果。接下來看看官方是怎麼說的:

大致意思就是說:
Canvas類持有「draw」調用。 要繪制一些東西,你需要4個基本組件:一個點陣圖來保存像素,一張畫布(Canvas)來主持繪圖調用(寫入點陣圖),一個繪圖圖元(如Rect,Path,text,Bitmap)和一支罩判廳畫筆(描述繪圖的顏色和樣式)。

首先介紹下畫筆(Paint)的常用API:

Paint默認的字體大小為12px,在繪制文本時我們往往要考慮密度density設置合適的字體大小。畫筆的默認顏色物隱為黑色,默認的style為FILL,默認的cap為BUTT,默認的線寬為0。

單一顏色填充Canvas畫布

以上就是大部分的繪制操作,當然還有一些沒介紹到,還有一些需要在API21(5.0)以上才能使用,這個使用到的時候可以弄個沖納小demo看下效果,接下來介紹下針對畫布變換和畫布裁剪做一些介紹。

在學習繪制操作的時候很多地方都使用到了translate 和rotate 這里就不再對它們進行操作

1.畫布scale

2.畫布skew

這里針對Canvas的API進行了一些說明,希望對大家有所幫助。沒有添加完整工程上來,但是每一個方法都是實際跑過的,只需要在onDraw中調用就可以看到效果了。

㈣ android canvas 如何以厘米為單位

請參閱 TypedValue | Android Developers 。這個類中的

complexToDimensionPixelSize(int data, DisplayMetrics metrics)

可以把mm轉換成px。

㈤ Android Canvas 方法總結

在自定義 View的時候,我們經常需要繪制一些自己想要的效果。
這里就需要使用Canvas對象。
下面將Canvas對象常用方法做個筆記,方便記憶。

對Canvas的一系列操作,是指對Canvas進行旋轉、平移、縮放等操作。
這些操作可以讓Canvas對象使用起來更加便捷。

Canvas提供了幾個方法,讓我們可以方便的對Canvas的狀態進行更改和還原。
這些方法是: save() 、 restore() 、 restoreToCount(int saveCount) 。

我們在對Canvas進行平移、旋轉、放大等操作時候,可以調用 save() 方法,將當前修改過的Canvas狀態進行保存,調用 restore() 方法後,會將Canvas還原成最近的一個 save() 的狀態。

save() 方法還會有一個返回值,我們也可以調用 restoreToCount(int saveCount) 方法,將這個返回值作為參數傳遞進去,就可以將Canvas還原成某一個特定的 save() 狀態。

㈥ android canvas scale函數能擴大畫布canvas大小嗎

您好,很高興能幫助您
感覺用 canvas scale函授後,canvas上的圖像變大了,但是超出canvas的圖緩租像沒有了.... 是不是scale只改變圖片,不改變canvas大小!
你的采擾喚兆納是我前進的動力,
記得好評和採納,答鏈檔題不易,互相幫助,

㈦ android canvas的drawText方法 如何設置字體大小和格式。

Canvas相當於畫布,字體的大小格式在Paint上設置才正確, Paint 相當於畫筆。代碼如下,沒有具體參數:

Paint paint = new Paint();

paint.setTextSize(textSize);//設置字體大小

paint.setTypeface(typeface);//設置字體類型

canvas.drawText(text, x, y, paint);//使用畫筆paint

@Override

public void onDraw (Canvas canvas) {

Rect targetRect = new Rect(50, 50, 1000, 200);

Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);

paint.setStrokeWidth(3);

paint.setTextSize(80);

String testString = "測試:ijkJQKA:1234";

paint.setColor(Color.CYAN);

canvas.drawRect(targetRect, paint);

paint.setColor(Color.RED);

FontMetricsInt fontMetrics = paint.getFontMetricsInt();

(7)androidcanvas大小擴展閱讀:

Screen Space - Camera

此模式類似Screen Space - Overlay,但區別是此模式將Canvas放置於某個Camera前固定距離。此Camera負責渲染所有UI元素,則攝像機參數(Camera Settings)直接影響UI表現。

比如Camera是透視模式(Perspective),則UI元素會基於Field of View的值而扭曲變形。同樣的,若屏幕解析度變更,或者視覺平截體(CameraFrustrum)改變,則Canvas自動調整自身尺寸作自適應。

㈧ android canvas 是像素嗎

Canvas : 畫布對象,相當於現實生活中畫圖用的 『紙 或 布』。
下面介紹來自於android學習手冊,android學習手冊包含9個章節,108個例子,源碼文檔隨便看,例子都是可交互,可運行,源碼採用android studio目錄結構,高亮顯示代碼,文檔都採用文檔結構圖顯示,可以快速定位。360手機助手中下載,排在第三、四個。
Android畫圖最基本的三個對象(Color,Paint,Canvas)
三個類都存放在 android.graphics包下
1) Color :顏色對象,相當於現實生活中的 『調料』
2) Paint : 畫筆對象,相當於現實生活中畫圖用的 『筆』————主要的還是對『畫筆』進行設置
3) Canvas : 畫布對象,相當於現實生活中畫圖用的 『紙 或 布』
三者相結合,就能畫出基本的圖形

㈨ Android 怎麼使用Bitmap+Canvas 自適應屏幕

我們可以使用Matrix 來放縮我們得到的Bitmap 從而使我們的BItmap適應我們的手機屏幕

首先我們得先獲取我們的手機屏幕的大小

java">WindowManagerwm=(WindowManager)getContext().getSystemService(
Context.WINDOW_SERVICE);
intwidth=wm.getDefaultDisplay().getWidth();
intheight=wm.getDefaultDisplay().getHeight();

然後我們構造一個新的Matrix對象,自己完成寫一個函數,如下:

publicBitmapresizeBitmap(Bitmapbitmap,intw,inth)
{
if(bitmap!=null)
{
intwidth=bitmap.getWidth();
intheight=bitmap.getHeight();
intnewWidth=w;
intnewHeight=h;
floatscaleWight=((float)newWidth)/width;
floatscaleHeight=((float)newHeight)/height;
Matrixmatrix=newMatrix();
matrix.postScale(scaleWight,scaleHeight);
Bitmapres=Bitmap.createBitmap(bitmap,0,0,width,height,matrix,true);
returnres;

}
else{
returnnull;
}
}

這樣我們通過這個函數返回的Bitmap對象就是可以適應我們手機屏幕大小的了。。

㈩ Android 怎麼使用Bitmap+Canvas 自適應屏幕

ndroid 使用Bitmap+Canvas自適應屏幕方法如下:

1、首先得先獲取我們的手機屏幕的大小

3、這樣通過這個函數返回的Bitmap對象就是可以適應手機屏幕大小的了。。

熱點內容
內置存儲卡可以拆嗎 發布:2025-05-18 04:16:35 瀏覽:336
編譯原理課時設置 發布:2025-05-18 04:13:28 瀏覽:378
linux中進入ip地址伺服器 發布:2025-05-18 04:11:21 瀏覽:612
java用什麼軟體寫 發布:2025-05-18 03:56:19 瀏覽:32
linux配置vim編譯c 發布:2025-05-18 03:55:07 瀏覽:107
砸百鬼腳本 發布:2025-05-18 03:53:34 瀏覽:945
安卓手機如何拍視頻和蘋果一樣 發布:2025-05-18 03:40:47 瀏覽:742
為什麼安卓手機連不上蘋果7熱點 發布:2025-05-18 03:40:13 瀏覽:803
網卡訪問 發布:2025-05-18 03:35:04 瀏覽:511
接收和發送伺服器地址 發布:2025-05-18 03:33:48 瀏覽:372