Android学习笔记:Canvas,Drawable,Bitmap

本文深入探讨Android中的图形处理,包括Canvas的使用,如new Canvas、View.onDraw、SurfaceView上的绘制及各种绘图函数;Drawable的各种类型如XML Bitmap、Nine-Patch等;以及Bitmap的获取与显示,特别是位图的缩放与Matrix操作。
摘要由CSDN通过智能技术生成

这一节总结一下关于图形处理相关的知识。Android中2D图形处理引擎主要有以下几个重要部分组成:

  • Canvas:hold the”draw”calls. 画布,执行画图的操作函数(实际Canvas是画家的角色,Bitmap才是真正的画布)
  • Bitmap:hold the pixels. 存放位图数据
  • Paint:describe the colors and styles for the drawing 画笔的样式(颜色,粗细)
  • drawing primtive: 绘图的原始内容

Canvas

在应用中当需要绘制特殊的图像或者动画时,Android系统提供了一个Canvas类,他包含很多的draw函数,可以把图象直接绘制到与界面绑定的Bitmap中。
Canvas(画布)必须和Bitmap绑定才可以进行操作,画布所有的绘制操作都会绘制到绑定的bitmap上面。
有三种形式可以获得Canvas类

new Canvas

我们可以直接创建一个Canvas对象。同时我们需要创建一个Bitmap绑定到Canvas类中。

Bitmap b = Bitmap.createBitmap(100, 100, Bitmap.Config.ARGB_8888);
Canvas c = new Canvas(b);

通过Canvas类绘制的内容会保存的Bitmap里面,然后我们可以使用Canvas.draw(Bitmap, …)函数将Bitmap中的内容绘制到与系统界面绑定的Canvas中。

View.onDraw

通过自定义View,在onDraw()函数中系统会提供一个初始化完成的Canvas,我们可以直接调用draw函数绘制。

class CustomView1 extends View{   

        ...

        //在这里我们将测试canvas提供的绘制图形方法   
        @Override   
        protected void onDraw(Canvas canvas) {   
          RectF rect = new RectF(0, 0, 100, 100);   

          canvas.drawArc(rect, //弧线所使用的矩形区域大小   
                  0,  //开始角度   
                  90, //扫过的角度   
                  false, //是否使用中心   
                  paint);                                                                                                                         
        }                                                                                                                         
    }   

使用onDraw提供的Canvas参数,我们直接调用canvas.draw()或者其他draw函数时使用canvas作为参数。onDraw函数完成后,系统会自动将Canvas绘制的内容加载到view上。

on a SurfaceView

public class OpenCvonAndroidGTDforHOGActivity extends Activity 
implements SurfaceHolder.Callback{
   

    private SurfaceHolder _surfaceHolder;
    private SurfaceView _surfaceView;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        _surfaceView = (SurfaceView)findViewById(R.id.imagesurface);
        _surfaceHolder = _surfaceView.getHolder();
        _surfaceHolder.addCallback(this);
        _surfaceView.setWillNotDraw(false);

    }

    protected void onDraw(Canvas canvas) {
        canvas.drawRGB(255, 0, 255);            
    }

    public void surfaceCreated(SurfaceHolder holder) {
        Canvas canvas = null;
        try {
            canvas = holder.lockCanvas();
            synchronized(holder) {
                onDraw(canvas);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (canvas != null) {
                holder.unlockCanvasAndPost(canvas);
            }
        }
    }
}

函数

save() resotre()

save:用来保存Canvas的状态。save之后,可以调用Canvas的平移、放缩、旋转、错切、裁剪等操作。
restore:用来恢复Canvas之前保存的状态。防止save后对Canvas执行的操作对后续的绘制有影响。

save和restore要配对使用(restore可以比save少,但不能多),如果restore调用次数比save多,会引发Error。save和restore之间,往往夹杂的是对Canvas的特殊操作。

clipXXX()

在当前的画图区域裁剪(clip)出一个新的画图区域,这个画图区域就是canvas对象的当前画图区域了。

drawXXX()

以一定的坐标值在当前画图区域画图。

translate(float dx, float dy)

rotate(float degrees)

Drawable

something that can be drawn.

Drawable就是一个可画对象的抽象。不同的资源类型代表着不同的Drawable类型。Android内置以下几种Drawable类型:ColorDrawable、GradientDrawable、BitmapDrawable、 NinePatchDrawable、InsetDrawable、ClipDrawable、ScaleDrawable、RotateDrawable、AnimationDrawable、LayerDrawable、LevelListDrawable、StateListDrawable、TransitionDrawable。

XML Bitmap

BitmapDrawable 是对bitmap的一种包装,可以设置它包装的bitmap在BitmapDrawable区域内的绘制方式,如平铺填充、拉伸填充或者保持图片原始大小,也可以在BitmapDrawable区域内部使用gravity指定的对齐方式。

<?xml version="1.0" encoding="utf-8"?>
<bitmap
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:src="@[package:]drawable/drawable_resource"
    android:antialias=["true" | "false"]
    android:dither=["true" | "false"]
    android:filter=["true" | "false"]
    android:gravity=["top" | "bottom" | "left" | "right" | "center_vertical" |
                      "fill_vertical" | "center_horizontal" | "fill_horizontal" |
                      "center" | "fill" | "clip_vertical" | "clip_horizontal"]
    android:mipMap=["true" | "false"]
    android:tileMode=["disabled" | "clamp" | "repeat" | "mirror"] />
  • android:antialias 锯齿效果
  • android:dither 当图片像素和屏幕像素不匹配时,是否启用抖动效果
  • android:filter 过滤效果
  • android:gravity 位置
  • android:tileMode

XML Nine-Patch

Android 平台特殊的图片格式 “点九图“,当图片需要伸缩时,可以按照我们的需求放大图片的某个部分。

<?xml version="1.0" encoding="utf-8"?>
<
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值