Android canvas总结

canvas画图需要四大基本要素

1、一个用来保存像素的Bitmap;

2、一个Canvas画布,绘制Bitmap操作;

3、绘制的东西

4、绘制画笔Paint(包括颜色和样式)


 1、如何获得一个Canvas对象。

 

Canvas对象的获取方式有三种:

第一种,重写View.onDraw方法,View中的Canvas对象会以参数方式传递过来,操作这个Canvas,效果会直接反应在View中。

第二种,自己创建一个Canvas对象。一个Canvas对象一定是结合了一个Bitmap对象的,故需要为一个Canvas对象设置一个Bitmap对象。

Bitmap b = Bitmap.createBitmap(100,100, Bitmap.Config.ARGB_8888); //简单配置方式

Canvas c = new Canvas(b);

第三种方式,是调用SurfaceHolder.lockCanvas(),返回一个Canvas对象。

 2、canvas可以绘制的内容

 

  1)填充

      drawARGB(int a, int r, int g, int b)
      drawColor(int color)
      drawRGB(int r, int g, int b)
      drawColor(int color, PorterDuff.Mode mode)

  2)几何图形

     canvas.drawArc (扇形)

     canvas.drawCircle(圆)

     canvas.drawOval(椭圆)

     canvas.drawLine(线)

     canvas.drawPoint(点)

     canvas.drawRect(矩形)

     canvas.drawRoundRect(圆角矩形)

     canvas.drawVertices(顶点)

     cnavas.drawPath(路径)

   3)图片

      canvas.drawBitmap (位图)
      canvas.drawPicture (图片)

   4)文本

       canvas.drawText

 3. Canvas的保存和回滚


为了方便一些转换操作,Canvas还提供了保存和回滚属性的方法(save和restore)。
如:可以先保存目前画纸的位置(save),然后旋转90度,向下移动100像素,再进行一些绘制操作,画完后调用restore方法返回到刚才保存的位置。

saveLayer

Canvas 在一般的情况下可以看作是一张画布,所有的绘图操作如drawBitmap, drawCircle都发生在这张画布上,这张画板还定义了一些属性比如Matrix,颜色等。但是如果需要实现一些相对复杂的绘图操作,比如多层动画,地图(地图可以有多个地图层叠加而成,比如:政区层,道路层,兴趣点层)。Canvas提供了图层(Layer)支持,缺省情况可以看作是只有一个图层Layer。如果需要按层次来绘图,Android的Canvas可以使用SaveLayerXXX, Restore 来创建一些中间层,对于这些Layer是按照“栈结构“来管理的:       



创建一个新的Layer到“栈”中,可以使用saveLayer, savaLayerAlpha, 从“栈”中推出一个Layer,可以使用restore,restoreToCount。
当Layer入栈时,后续的绘制操作都发生在这个Layer上,而Layer退栈时,就会把本层绘制的图像“绘制”到上层或是Canvas上。
在复制Layer到Canvas上时,可以指定Layer的透明度(Layer),在创建Layer时指定的:public int saveLayerAlpha(RectF bounds, int alpha, int saveFlags)。
本例中的Canvas由两个图层(Layer)构成的,缺省图层绘制一个红色的圆,在新的图层画一个蓝色的圆,新图层的透明度为0×88。     

public class Layers extends Activity {

   @Override

   protected void onCreate(Bundle savedInstanceState) {

       super.onCreate(savedInstanceState);

       setContentView(new SampleView(this));

   }

   private static class SampleView extends View {

       private static final int LAYER_FLAGS = Canvas.MATRIX_SAVE_FLAG | Canvas.CLIP_SAVE_FLAG

               | Canvas.HAS_ALPHA_LAYER_SAVE_FLAG | Canvas.FULL_COLOR_LAYER_SAVE_FLAG

               | Canvas.CLIP_TO_LAYER_SAVE_FLAG;

       private Paint mPaint;

       public SampleView(Context context) {

           super(context);

           setFocusable(true);

           mPaint = new Paint();

           mPaint.setAntiAlias(true);

       }

       @Override

       protected void onDraw(Canvas canvas) {

           canvas.drawColor(Color.WHITE);  

           canvas.translate(10, 10);  

           mPaint.setColor(Color.RED);  

           canvas.drawCircle(75, 75, 75, mPaint);  

           canvas.saveLayerAlpha(0, 0, 200, 200, 0x88, LAYER_FLAGS);  

           mPaint.setColor(Color.BLUE);  

           canvas.drawCircle(125, 125, 75, mPaint);  

           canvas.restore();  

        }

   }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值