㈠ android canvas.drawbitmap(bitmap,0,0,null)什麼意思
你是要實現圖畫功能的吧?這個很簡單理解。
canvas.drawbitmap()函數你可以理解為新建一個畫布, 就好比畫家的畫板,當然你不往裡面添加東西,就什麼都沒有,它是空的。現在放入參數, bitmap就是導入你已有的圖片,比如,畫家上次還沒畫完的一張圖片,現在放在畫板上,要繼續工作。參數,0,0,為設置這張畫在畫板上的放置的位置,0,0為x軸和y軸的坐標,如果是(0,0),則默認為從從左上角開始放置。下面的一張圖片為設置不同參數的時候,這種那個圖片放置在這個畫板上的位置的變化,你可以看到我設置為(100,10),也就是x坐標100,圖片離左邊距離為100;y坐標10,圖片離上方距離為10,你可以看到左邊黑色的部分佔了100,上邊部分的黑色佔了10.最後,就是那個null,null的參數是用來設置畫筆的,你沒有畫筆,當然就不用設了,你這個只是簡單的,見圖片顯示在畫板上,並沒有實現要在畫板上畫圖的功能 。你還想實現美妙顯示多少張圖片的話,我只能給你指示簡單的方向,就是你要設置一個定時器,在定時器裡面,加上你的這個函數,然後定時更改參數bitmap變數,這個bitmap是圖片的路徑,實現實現每秒多少貞,就是要設置定時器你每秒,你改變參數bitmap的頻率,關於這個問題,你還得學習下定時器,再說下去內容就多了,你還是自己先琢磨吧……
ps:其實這個函數還比較好理解,不好理解的是要開始實現畫圖的時候,要設置兩個這樣的,實現雙緩沖,這個比較難,多看看書吧,我也只能幫你到這里了。祝你學習快樂哈~我也正在學習。
㈡ android 上用canvas繪圖之後,我想清除怎麼辦
canvas繪圖是在onDraw里觸發的。而每次onDraw的時候,其實是重新繪制canvas數據的,也就是如果你什麼都不畫,canvas上就沒有東西了。因此你只要在每次觸發onDraw之後,把需要畫的內容畫出來即可。比如,假設人頭的數據是bitmapHead,兩種發型分別是bitmapStyle1, bitmapStyle 2,你就可以這樣畫(偽代碼):
java">intcurrentType=0;
onDraw(canvas){
canvas.draw(bitmapHead);//這個是必定要畫的
switch(currentType){
caseSTYLE1:
canvas.draw(bitmapStyle1);
break;
caseSTYLE2:
canvas.draw(bitmapStyle2);
break;
}
}
㈢ DrawArc()方法如何使用
安卓方法DrawArc()用於在畫布上繪制圓弧,主要方法是通過指定圓弧所在的橢圓對象、起始角度、終止角度來實現。
1. 基本語法:
public void drawArc (RectF oval, float startAngle, float sweepAngle, boolean useCenter, Paint paint)
參數說明
oval:圓弧所在的橢圓對象。
startAngle:圓弧的起始角度。
sweepAngle:圓弧的角度。
useCenter:是否顯示半徑連線,true表示顯示圓弧與圓心的半徑連線,false表示不顯示。
paint:繪制時所使用的畫筆。
注意:Rect類使用需要小心,詳見文末附註。
2. 示例
以下代碼示範了如何在畫布上繪制圓弧:
protectedvoidonDraw(Canvascanvas){ //TODOAuto-generatedmethodstub super.onDraw(canvas); paint.setAntiAlias(true);//設置畫筆為無鋸齒 paint.setColor(Color.BLACK);//設置畫筆顏色 canvas.drawColor(Color.WHITE);//白色背景 paint.setStrokeWidth((float)3.0);//線寬 paint.setStyle(Style.STROKE); RectFoval=newRectF();//RectF對象 oval.left=100;//左邊 oval.top=100;//上邊 oval.right=400;//右邊 oval.bottom=300;//下邊 canvas.drawArc(oval,225,90,false,paint);//繪制圓弧 //RectFoval=newRectF();//RectF對象 oval.left=100;//左邊 oval.top=400;//上邊 oval.right=400;//右邊 oval.bottom=700;//下邊 canvas.drawArc(oval,200,135,true,paint);//繪制圓弧 }
代碼中,首先設置了Paint畫筆的顏色,並設置Canvas畫布為白色背景。接著設置畫筆的線寬以及空心效果。然後,定義一個RectF對象,並設置了坐標,調用drawArc方法繪制第一個圓弧,此處設置為不顯示半徑連線。最後,重新設置了RectF對象坐標,調用drawArc方法繪制第二個圓弧,此例顯示半徑連線。運行代碼,可在手機屏幕上看到下圖圖所示顯示效果。
---------------
附註:
Android中的Rect類——奇葩的思維
最近在工作中遇到了一些問題,總結下來就是Android中Rect這個類造成的。不得不說,不知道Android SDK的開發人員是怎麼想的, 這個類設計的太奇葩了。首先介紹一下Rect類:Rect類主要用於表示坐標系中的一塊矩形區域,並可以對其做一些簡單操作。這塊矩形區域,需要用左上右下兩個坐標點表示(left,top,right,bottom),你也可以獲取一個Rect實例的Width和Height。就在這里,奇葩的事情來了,作為一個有一點經驗的做圖像或者矩陣運算或者編程的程序員來說,大家的共識是,如果一個矩陣是MxN的,也就是M行N列,那麼行號是[0,M-1],列號是[0,N-1]。可是奇葩的Rect類並不是這樣的!如果你這么聲明一個Rect類:
Rect rect=newRect(100,50,300,500);那麼右下角(300,500)其實是不在這個矩形裡面的,但是左上角(100,50)在,也就是說,這個矩形實際表示的區域是:(100,50,299,499)。另外,Rect計算出的Height和Width倒是對的。所以,在此告誡各位程序員,在涉及Rect運算的時候,盡量不要使用它的右下角左邊,即right和bottom。因為他們是錯的。當然,在你調用android自己的函數時,是可以使用的,因為Android裡面一直保持這么奇葩的思維。
㈣ Android繪圖之Canvas變換(6)
前面講解了Canvas的基本概念, Android繪圖之Canvas概念理解(5) ,
對Canvas的概念進行了分析,但是沒有說明和屏幕的關系,Canvas不等於屏幕,屏幕不會動的,我們也無法對屏幕進行(平移,縮放等)操作,只能對Canvas進行操作,所以對Canvas進行操作,屏幕不動,最終會導致看到的圖像不同。
下面開始講解Canvas的變幻操作:
包括:translate,rotate,scale,skew,clip,clipout,matrix
先從最簡單的平移開始:
對Canvas進行平移,
dx: x軸方向進行平移,正值向屏幕右側
dy:y軸方向進行平移,正值向屏幕下方
繪制兩個點查看原點位置。
原點顯然改變了,以後再繪制任何形狀都是以translate後的原點開始繪制。
參數說明
sx:橫向的縮放,默認為1,小數縮小,整數放大
sy:縱向的縮放,默認為1,小數縮小,整數放大
px,py,看源碼知道是先translate,執行sx,sy然後再translate反方向。
第二次translate的坐標為(-px sx,-px sy),最終的效果就是px,py是縮放後不動的點。
縮放後坐標減半。
如果想控制縮放後的位置,如何控制呢,這就需要第二個函數。
還可以控制其他位置,例如控制縮放後在中心。
rotate有兩個函數:
rotate(float degrees)
rotate(float degrees, float px, float py)
Degree:旋轉的角度,正值為順時針,負值為逆時針
Px,py:旋轉的中心,如果不指定旋轉中心默認為(0,0)點
指定旋轉中心為矩形中心
參數說明:
sx:畫布在x方向上傾斜相應的角度,sx傾斜角度的tan值,
sy:畫布在y軸方向上傾斜相應的角度,sy為傾斜角度的tan值,
根據矩形或者路徑裁剪畫布,畫布被切割之後,只有部分區域可用,其他區域無法繪制內容。
Clip函數切割的區域可用,clipOut未被切割的區域可用。(過時函數不再講解)
Matrix提供了一些方法來控制變換:
android繪圖之Paint(1)
android繪圖之Canvas基礎(2)
Android繪圖之Path(3)
Android繪圖之drawText繪制文本相關(4)
Android繪圖之Canvas概念理解(5)
Android繪圖之Canvas變換(6)
Android繪圖之Canvas狀態保存和恢復(7)
Android繪圖之PathEffect (8)
Android繪圖之LinearGradient線性漸變(9)
Android繪圖之SweepGradient(10)
Android繪圖之RadialGradient 放射漸變(11)
Android繪制之BitmapShader(12)
Android繪圖之ComposeShader,PorterDuff.mode及Xfermode(13)
Android繪圖之drawText,getTextBounds,measureText,FontMetrics,基線(14)
Android繪圖之貝塞爾曲線簡介(15)
Android繪圖之PathMeasure(16)
Android 動態修改漸變 GradientDrawable
㈤ 求Android中canvas.drawPicture(p);的使用方法求一個簡單的實例
這個可能稍微復雜一點,但是非常實用:
{
DrawingViewdv;
privatePaintmPaint;
=null;
@Override
protectedvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
dv=newDrawingView(this);
setContentView(dv);
mPaint=newPaint();
mPaint.setAntiAlias(true);
mPaint.setDither(true);
mPaint.setColor(Color.GREEN);
mPaint.setStyle(Paint.Style.STROKE);
mPaint.setStrokeJoin(Paint.Join.ROUND);
mPaint.setStrokeCap(Paint.Cap.ROUND);
mPaint.setStrokeWidth(12);
}
{
publicintwidth;
publicintheight;
privateBitmapmBitmap;
privateCanvasmCanvas;
privatePathmPath;
privatePaintmBitmapPaint;
Contextcontext;
privatePaintcirclePaint;
privatePathcirclePath;
publicDrawingView(Contextc){
super(c);
context=c;
mPath=newPath();
mBitmapPaint=newPaint(Paint.DITHER_FLAG);
circlePaint=newPaint();
circlePath=newPath();
circlePaint.setAntiAlias(true);
circlePaint.setColor(Color.BLUE);
circlePaint.setStyle(Paint.Style.STROKE);
circlePaint.setStrokeJoin(Paint.Join.MITER);
circlePaint.setStrokeWidth(4f);
}
@Override
protectedvoidonSizeChanged(intw,inth,intoldw,intoldh){
super.onSizeChanged(w,h,oldw,oldh);
mBitmap=Bitmap.createBitmap(w,h,Bitmap.Config.ARGB_8888);
mCanvas=newCanvas(mBitmap);
}
@Override
protectedvoidonDraw(Canvascanvas){
super.onDraw(canvas);
canvas.drawBitmap(mBitmap,0,0,mBitmapPaint);
canvas.drawPath(mPath,mPaint);
canvas.drawPath(circlePath,circlePaint);
}
privatefloatmX,mY;
privatestaticfinalfloatTOUCH_TOLERANCE=4;
privatevoidtouch_start(floatx,floaty){
mPath.reset();
mPath.moveTo(x,y);
mX=x;
mY=y;
}
privatevoidtouch_move(floatx,floaty){
floatdx=Math.abs(x-mX);
floatdy=Math.abs(y-mY);
if(dx>=TOUCH_TOLERANCE||dy>=TOUCH_TOLERANCE){
mPath.quadTo(mX,mY,(x+mX)/2,(y+mY)/2);
mX=x;
mY=y;
circlePath.reset();
circlePath.addCircle(mX,mY,30,Path.Direction.CW);
}
}
privatevoidtouch_up(){
mPath.lineTo(mX,mY);
circlePath.reset();
//committhepathtoouroffscreen
mCanvas.drawPath(mPath,mPaint);
//killthissowedon'tdoubledraw
mPath.reset();
}
@Override
publicbooleanonTouchEvent(MotionEventevent){
floatx=event.getX();
floaty=event.getY();
switch(event.getAction()){
caseMotionEvent.ACTION_DOWN:
touch_start(x,y);
invalidate();
break;
caseMotionEvent.ACTION_MOVE:
touch_move(x,y);
invalidate();
break;
caseMotionEvent.ACTION_UP:
touch_up();
invalidate();
break;
}
returntrue;
}
}
}
你的手指到哪裡,Canvas就畫到哪裡。圖:
㈥ android中使用canvas.drawText函數可否設置旋轉
使用Paint類的breakText對Text進行分解 然後分別使用Canvas的drawText進行繪制