㈠ 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进行绘制