androidcanvasview
『壹』 Android自定義View(3) 《Canvas繪制簡單的圖形》
在Android中,我們經常會需要去繪制一些自己需要的控制項,所以繼承自View的自定義View就產生了。這篇文章主要介紹在View中的重要類,Canvas類。
Canvas是自定義View中幾個最重要的類之一,可以理解為畫布,但是我理解下來,這只是單一的圖層,每次Canvas繪制時其實都是在canvas類所定義出的一個圖層上進行繪制圖形,一旦canvas變化,則圖層也發生變化,圖層變化之前繪制的結果不變,但之後的繪制結果會以新的圖層為基準進行繪制
在這里繪制線條調用Canvas.drawLine(float startX, float startY, float stopX, float stopY,Paint paint)方法,參數分別如下
繪制矩形調用canvas.drawRect(RectF rect, Paint paint),矩形Rect的構造參數的四個參數分別為左邊界,上邊界,右邊界,下邊界的值,單位為px,RectF與Rect不同之處在於構造參數的類型一個全為float,一個全為int,運行結果如下
繪制橢圓主要調用drawOval(RectF oval, Paint paint),以一個矩形的邊界來繪制一個橢圓,運行結果如下
繪制圓主要使用Canvas.drawCircle(float cx, float cy, float radius, Paint paint),
繪制Path的方法比較多,這里只簡單示例繪制線條路徑構建一個三角形的用法,後續會再詳細介紹繪制別的類型路徑的用法,該例運行結果如下
這里我們繪制了一段文字和一根線段這里是為了演示出Canvas中的文字的繪制方法只能實現水平方向上的居中顯示,垂直方向上的垂直是需要我們再進行實現的,繪制文字有很多個,我們這里只簡單調用了設置起始點的繪制方法,關於文字的繪制其實內容還是比較多的,這里我們就只簡單的介紹,後續有時間會專門出一個文字繪制的文章,該示例運行結果如下
今天總結了Canvas中一些簡單圖形的繪制,下篇我們介紹Canvas中的一些其他內容。
『貳』 android canvas怎麼創建
工具/原料
電腦(windows)
eclipse+android編程環境
方法/步驟
首先新建一個android項目名字為CanvasShow,其餘參數可以自己配置,點擊完成,形成項目信息
配置main.xml,在這里main.xml 基本不用修改,只需增加
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:id="@+id/root"
>
</LinearLayout>
CanvasShowInfo中實現方法:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
init();
}
private void init() {
LinearLayout layout=(LinearLayout) findViewById(R.id.root);
final CanvasDraw view=new CanvasDraw(this);
view.setMinimumHeight(500);
view.setMinimumWidth(300);
//通知view組件重繪 這個很重要!
view.invalidate();
layout.addView(view);
}
那麼CanvasDraw.java中實現了什麼呢?
聲明CanvasDraw.java 繼承View,重寫其中的onDraw方法。
比如畫圓:
// 創建畫筆
Paint p = new Paint();
p.setColor(Color.RED);// 設置紅色
canvas.drawText("畫圓:", 10, 20, p);// 畫文本
canvas.drawCircle(40, 40, 15, p);// 分別是 圓心的x,y坐標,15為半徑
p.setAntiAlias(true);// 設置畫筆的鋸齒效果。 true是去除,大家一看效果就明白了
canvas.drawCircle(100, 120, 50, p);// 分別是 圓心的x,y坐標,50為半徑
從圖中可以看見,去除鋸齒的圖形更加圓滑。下面是相對應的效果圖
canvas.drawText("畫矩形:", 10, 90, p);
p.setColor(Color.BLUE);// 設置灰色
p.setStyle(Paint.Style.FILL);//設置填滿
canvas.drawRect(60, 60, 80, 80, p);// 正方形
canvas.drawRect(70, 90, 300, 100, p);// 長方形
// drawRect函數前兩個參數是一個頂點的坐標,後兩個參數是對頂點的坐標,相對應的效果圖
canvas.drawText("畫扇形:", 120, 120, p);
// 設置漸變色 這個扇形的顏色是改變的 /
Shader mShader = new LinearGradient(0, 0, 100, 100,
new int[] { Color.RED, Color.GREEN, Color.BLUE, Color.YELLOW,
Color.LTGRAY }, null, Shader.TileMode.REPEAT); // 一個材質,打造出一個線性梯度沿著一條線。
p.setShader(mShader);
p.setColor(Color.BLUE);
RectF oval2 = new RectF(60, 100, 200, 240);// 設置個新的長方形,掃描測量
canvas.drawArc(oval2, 200, 130, true, p);
// 畫弧,第一個參數是RectF:該類是第二個參數是角度的開始,第三個參數是多少度,第四個參數是真的時候畫扇形,是假的時候畫弧線
其中:
public void drawArc(RectF oval, float startAngle, float sweepAngle, boolean useCenter, Paint paint)
oval :指定圓弧的外輪廓矩形區域。
startAngle: 圓弧起始角度,單位為度。
sweepAngle: 圓弧掃過的角度,順時針方向,單位為度。
useCenter: 如果為True時,在繪制圓弧時將圓心包括在內,通常用來繪制扇形。
paint: 繪制圓弧的畫板屬性,如顏色,是否填充等。
『叄』 android canvas一定要設置具體的畫布嗎canvas是畫在屏幕上還是畫在bitmap上求詳解
簡短的說就像text框要輸入文字一樣,你必須先讓text取得焦點,獲得游標才能進行輸入
bitmap就像畫布,canvas就像畫筆。要畫畫就要知道畫在哪裡,所以必須要畫布。
view的onDraw的canvas是花在view的背景上,也是類似bitmap上。
緩沖是在另一個後台bitmap上畫好在進行展示
以上代表個人通俗理解只做參考理解,不是標准
『肆』 android:如何用canvas在自定義view里畫圖
做安卓開發的話,不會自定義view是不行的,自定定義各種控制項以滿足開發需求,在開發中是很重要的,自定義view通過繼承view,通過重寫ondraw方法實現重繪自己所需要的控制項樣式。
在ondraw方法中,通過canvas來繪制想要的樣式,首先需要定義好畫筆,以及畫筆的各種屬性,比如需要的時候要
抗鋸齒
等等。都准備好了就可以用canvas來實現繪圖了,當然api提供的api肯定是不夠用的,需要多姿多彩的樣式很多時候需要藉助准備好的一些圖片,通過canvas繪制bitmap來實現把准備好的圖片繪制上去。繪制好了當然還是不夠的,控制項都是需要和用戶交互的,所以很多時候樣式是會發生改變的,所以要在其中定義相關方法暴露出來,方法中處理用戶操作或其他的結果改變樣式的重繪,繪制好了調用更新(
invalidate
())方法,實現樣式的改變。做好一個控制項還需要優化性能等等,都需要一步一慢慢實現。
『伍』 請問各位高手,android開發中的View裡面的Ondraw函數的參數Canvas是如何獲得的
Canvascanvas=newdrawSurfaceView(activity).getHolder().lockCanvas(null);//用一個view定義一個canvas
canvas.drawLine(startX,startY,stopX,stopY,paint)//畫線,需要起始坐標和結束坐標
canvas.drawBitmap(bitmap,null,dest,paint);//一樣了,dest定義了起始和結束
canvas是指一個畫布對象,你需要給定大小和「畫」這個動作的起始位置,然後用paint畫筆完成這個動作,比如從(0,0)(1,1)畫了一條線,再從(1,1)到(3,3)又話了一條線,兩條線連起來就是一個曲線了,畫圖的話就是第三行代碼了;如果你沒有得到這個畫布,說明你有個參數是錯誤的,沒有得到大小,或者沒有得到位置,就這樣。
如上所示,
canvas是從SurfaceView控制項裡面得到,上面有注釋,你的大小參數自己定義就行了,別超出了控制項大小
『陸』 android怎麼移動canvas
我們可以把這個Canvas理解成系統提供給我們的一塊內存區域(但實際上它只是一套畫圖的API,真正的內存是下面的Bitmap),而且它還提供了一整套對這個內存區域進行操作的方法,所有的這些操作都是畫圖API。也就是說在這種方式下我們已經能一筆一劃或者使用
Graphic來畫我們所需要的東西了,要畫什麼要顯示什麼都由我們自己控制。
這種方式根據環境還分為兩種:一種就是使用普通View的canvas畫圖,還有一種就是使用專門的SurfaceView的canvas來畫圖。兩種的主要是區別就是可以在SurfaceView中定義一個專門的線程來完成畫圖工作,應用程序不需要等待View的刷圖,提高性能。前面一種適合處理量比較小,幀率比較小的動畫,比如說象棋游戲之類的;而後一種主要用在游戲,高品質動畫方面的畫圖。
Paint 代表了Canvas上的畫筆、畫刷、顏料等等;
Paint類常用方法:
setARGB(int a, int r, int g, int b) // 設置 Paint對象顏色,參數一為alpha透明值
setAlpha(int a) // 設置alpha不透明度,范圍為0~255
setAntiAlias(boolean aa) // 是否抗鋸齒
setColor(int color) // 設置顏色,這里Android內部定義的有Color類包含了一些常見顏色定義
setTextScaleX(float scaleX) // 設置文本縮放倍數,1.0f為原始
setTextSize(float textSize) // 設置字體大小
setUnderlineText(booleanunderlineText) // 設置下劃線
// 1、將會以顏色ARBG填充整個控制項的Canvas背景
//mCanvas.drawARGB(122, 10, 159, 163) ;
// 2、將會以顏色ARBG填充整個控制項的Canvas背景
//mCanvas.drawColor(Color.BLUE) ;
// 3、繪制顏色,但是要制定一個mode
//mCanvas.drawColor(Color.BLUE, Mode.SCREEN) ;
// 4、畫背景,跟2等效
//mCanvas.drawPaint(mPaint) ;
// 5、畫一個點
//mCanvas.drawPoint(23, 23, mPaint) ;
// 6、畫很多點這里的float[] 表示{x0,y0,x1,y1,x2,y2,x3,y3.....}
//mCanvas.drawPoints(new float[]{10,11,10,12,10,13,10,14,10,15,10,16}, mPaint) ;
// 7、畫線
//mCanvas.drawLine(...) ;
// 8、畫長方形 Rect 和RectF的區別?
//精度不一樣,Rect是使用int類型作為數值,RectF是使用float類型作為數值
//Rect r = new Rect(10,10,50,50) ;
//mCanvas.drawRect(r, mPaint) ;
//RectF rf = new RectF(10,10,50,50) ;
//mCanvas.drawRect(rf, mPaint) ;
//mCanvas.drawRect(10, 10, 50, 50, mPaint) ;
// 9、畫橢圓 初始化RectF的參數是(left,top,right,bottom)
//RectF rf = new RectF(100,100 ,200 ,250) ;
//mCanvas.drawOval(rf, mPaint) ;
// 10、畫圓 (圓心x0,圓心y0,半徑,paint)
//mCanvas.drawCircle(100, 100, 50, mPaint) ;
// 11、畫圓弧 RectF對象表明內切矩形的(left,top,right,bottom)
//RectF rf = new RectF(100 ,100 ,200 ,200) ;
// 參數(rf,startAngle ,angle ,sweepAngle ,paint) sweepAngle表明是否顯示圓弧三角形 angle畫多少度
//mCanvas.drawArc(rf, 60, 30, true, mPaint) ;
// 12、繪制圓角矩形 RectF是矩形的(left,top,right,bottom)
//RectF rf = new RectF(100 ,100 ,200 ,200) ;
// 50表明x方向的半徑,20表示y方向的半徑
//mCanvas.drawRoundRect(rf, 50, 20, mPaint) ;
// 13、畫任意多邊形
//Path path = new Path() ;
//path.moveTo(100, 100) ;
//path.lineTo(200, 200) ;
//path.lineTo(300, 200) ;
//mCanvas.drawPath(path, mPaint) ;
// 14、通過Path對象,也可以畫其他的圖形
//Path path = new Path() ;
//path.addCircle(100, 100, 20, Path.Direction.CCW) ;
//mCanvas.drawPath(path ,mPaint);
/*drawBitmap
drawText
drawPicture*/
/*Rect r = new Rect(100,100,200,200) ;
ByteArrayOutputStream out = new ByteArrayOutputStream();
Bitmap bitmap = BitmapFactory.decodeResource(mContext.getResources(), R.drawable.bg) ;
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, out) ;
InputStream in = new ByteArrayInputStream(out.toByteArray()) ;
*/
/*Picture picture = Picture.createFromStream(mContext.getResources().openRawResource(R.raw.bg)) ;
mCanvas.drawPicture(picture) ;*/
// 15、畫bitmap對象
//mCanvas.drawBitmap(BitmapFactory.decodeResource(mContext.getResources(), R.drawable.bg),100, 100, mPaint) ;
// 16、Matrix中包含了對Bitmap的處理操作
/*Matrix m = new Matrix() ;
m.postScale(2, 2) ;
m.postRotate(60) ;
mCanvas.drawBitmap(BitmapFactory.decodeResource(mContext.getResources(), R.drawable.bg), m, mPaint) ;*/
// 17、畫帶Matrix參數的bitmap,經過Matrix對象可以對bitmap做相關的處理,比如旋轉,縮放,移動等《關於Matrix的使用另行總結》
/*Bitmap bitmap = BitmapFactory.decodeResource(mContext.getResources(), R.drawable.bg) ;
Matrix m = new Matrix() ;
m.postScale(2, 2) ;
m.postRotate(60) ;
m.postTranslate(300, 300) ;
mCanvas.drawBitmap(bitmap, m, mPaint) ;*/
//mCanvas.drawBitmap(....) ; 暫不總結
// 18、畫文字
//mCanvas.drawText(123, 10, 10, mPaint) ;
//mCanvas.drawText(....)
『柒』 Android canvas是怎麼初始化的
paint應該在構造方法里賦值的,我在你的代碼裡面沒有看到有賦值的過程。另外你把畫筆的顏色設置為白色,那麼你的布局的背景顏色就不應該用白色的,否則會顯示不出來,這些你應該確認一下。
希望對你有幫助。
『捌』 android中,如何用canvas繪制透明
第一種思路是通過對Bitmap進行操作,將Bitmap的像素值get到一個int[]數組里,因為在android里Bitmap通常是ARGB8888格式,所以最高位就是A通道的值,對齊進行改變後再新建一個Bitmap即可。
第二種思路是通過設置canvas的paint的透明度,然後通過canvas.drawBitmap()來改變View的透明度。
Paint .setAlpha(0);
『玖』 android canvas view重繪 我在一個activity中調用了canvas。在canvas中我點擊事件需要重新繪制當前view
除了SurfaceView,其它的都必須通過調用View.invalidate方法刷新View
所以不能直接執行moren(canvas),需要在onTouchEvent調用invalidate