androidcanvas大小
㈠ 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對象就是可以適應手機屏幕大小的了。。