❶ 求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一定要設置具體的畫布嗎canvas是畫在屏幕上還是畫在bitmap上求詳解
簡短的說就像text框要輸入文字一樣,你必須先讓text取得焦點,獲得游標才能進行輸入
bitmap就像畫布,canvas就像畫筆。要畫畫就要知道畫在哪裡,所以必須要畫布。
view的onDraw的canvas是花在view的背景上,也是類似bitmap上。
緩沖是在另一個後台bitmap上畫好在進行展示
以上代表個人通俗理解只做參考理解,不是標准
❸ android Canvas 裁剪clipPath的時候怎麼過濾鋸齒
去除鋸齒有2中方法
1、mPaint.setAntiAlias(true);
2canvas.setDrawFilter(new PaintFlagsDrawFilter(0, Paint.FILTER_BITMAP_FLAG|Paint.ANTI_ALIAS_FLAG));
❹ android Canvas繪制的圖形(如:圓),如何實現繪制完後還能編輯
Canvas有很多方法,比如
Canvas.translate(float dx, float dy) 平移
Canvas.rotate(float degrees, float px, float py) 旋轉
還有狀態的保存與恢復,還可以使用 Matrix 來做自定義變換。
❺ 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在自定義view里畫圖
將構造函數改成這個試試
public iniView01(Context context, AttributeSet attrs) {
super(context, attrs);
// TODO Auto-generated constructor stub
}
本人在寫的時候也遇到過代碼沒問題,但是一到虛擬機裡面運行就崩了,然後將構造函數改成這個就不會了
❼ android canvas怎麼畫圓弧
12345
要實現這個方法,我們要傳5個參數進去。
第一個參數:RectF oval
oval 參數的作用是:定義的圓弧的形狀和大小的范圍
/**
* 這是一個居中的圓
*/
float x = (getWidth() - getHeight() / 2) / 2;
float y = getHeight() / 4;
RectF oval = new RectF( x, y,
getWidth() - x, getHeight() - y); 1234567812345678
第二個參數:float startAngle
這個參數的作用是設置圓弧是從哪個角度來順時針繪畫的
canvas.drawArc(oval,-90,120,false,mPaint);11
canvas.drawArc(oval,90,110,false,mPaint);11
//設置為-180的時候也是這樣
canvas.drawArc(oval,180,140,false,mPaint);1212
//設置為360的時候也是這樣
canvas.drawArc(oval,0,140,false,mPaint);1212
第三個參數:float sweepAngle
這個參數的作用是設置圓弧掃過的角度
我們從上面的代碼就可以知道其中的作用了
第四個參數:boolean useCenter
這個參數的作用是設置我們的圓弧在繪畫的時候,是否經過圓形
值得注意的是,這個參數在我們的 mPaint.setStyle(Paint.Style.STROKE); 設置為描邊屬性的時候,是看不出效果的。
/**
*這里我是偷懶了,建議不要在onDraw()方法里初始化對象
*/
Paint p = new Paint();//這個是畫矩形的畫筆,方便大家理解這個圓弧
p.setStyle(Paint.Style.STROKE);
p.setColor(Color.RED);
mPaint.setAntiAlias(true);//取消鋸齒
mPaint.setStyle(Paint.Style.FILL);//設置畫圓弧的畫筆的屬性為描邊(空心),個人喜歡叫它描邊,叫空心有點會引起歧義
mPaint.setStrokeWidth(mCircleWidth);
mPaint.setColor(Color.CYAN);
/**
* 這是一個居中的圓
*/
float x = (getWidth() - getHeight() / 2) / 2;
float y = getHeight() / 4;
RectF oval = new RectF( x, y,
getWidth() - x, getHeight() - y);
canvas.drawArc(oval,360,140,false,mPaint);//畫圓弧,這個時候,繪制沒有經過圓心
canvas.drawRect(oval, p);//畫矩形2223
//當我們設置為true的時候,繪制的時候就經過圓心了
canvas.drawArc(oval,360,140,true,mPaint);1212
第五個參數:Paint paint
這個參數的作用是設置我們的畫筆對象的屬性
mPaint.setAntiAlias(true);//取消鋸齒
mPaint.setStyle(Paint.Style.FILL);//設置畫圓弧的畫筆的屬性為描邊(空心),個人喜歡叫它描邊,叫空心有點會引起歧義
mPaint.setStrokeWidth(mCircleWidth);
mPaint.setColor(Color.CYAN);12341234
這里還是要強調一下,當 p.setStyle(Paint.Style.STROKE)的時候,我們的第四個參數boolean useCenter,是看不到效果的。
下面是代碼全文
public class CustomProgress extends View{
private Paint mPaint;
/**
* 圓的寬度
*/
private int mCircleWidth = 3;
public CustomProgress(Context context) {
this(context, null);
}
public CustomProgress(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public CustomProgress(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
mPaint = new Paint();
}
@Override
protected void onDraw(Canvas canvas) {
mPaint.setAntiAlias(true);//取消鋸齒
mPaint.setStyle(Paint.Style.FILL);
mPaint.setStrokeWidth(mCircleWidth);
mPaint.setColor(Color.CYAN);
/**
* 這是一個居中的圓
*/
float x = (getWidth() - getHeight() / 2) / 2;
float y = getHeight() / 4;
RectF oval = new RectF( x, y,
getWidth() - x, getHeight() - y);
canvas.drawArc(oval,360,140,true,mPaint);
}
❽ android 使用canvas畫線,如何保證快速畫出圓滑的曲線
[mw_shl_code=java,true] RectF rect = new RectF(0, 0, radii, radii); // 圓形弧度需要的區域(左上角的x,y坐標 ,及右下角x,y坐標) Paint paint = new Paint(); paint.setColor(r.getColor(R.color.bg_color_1)); canvas.drawCircle(radii/2, radii/2, radii/2, paint);[/mw_shl_code]
❾ android中,如何用canvas繪制透明
Bitmap buffer = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_4444);buffer.eraseColor(Color.TRANSPARENT);然後用canvas畫這個buffer看看