Android自定义View画图的步骤及关于CanvasBitmapPaint的关系

Posted LQS_Android

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android自定义View画图的步骤及关于CanvasBitmapPaint的关系相关的知识,希望对你有一定的参考价值。

/**
 * 作画的步骤 
 * ①.创建画笔Paint对象,设置画笔属性
 * ②.如果需要保存、解析图片,则创建位图 Bitmap.createBitmap()
 * ③.创建拥有绘制图形方法的Canvas对象
 * ④.调用Canvas绘制图形的方法作画
 * ⑤.将位图Bitmap对象设置给View组件显示
 *
 */

Bitmap 译为“位图”,用于存储 png、jpg、gif 等格式的图片数据很多时候如果需要在 android中对图片进行处理,需要先将图片读入 Bitmap 对象,接着调用相关的 API对图片进行处理和加工,图片读取操作是由 BitmapFactory 类完成的,该类定义了若干方法用于读取图片数据。

我们也可以创建一张空白图片,下列的代码创建了一个 400*400 的 ARGB_8888 类型的空白位图对象:

Bitmap bmp = Bitmap.createBitmap(400, 400, Config. ARGB_8888);

这个空白图片需要指定宽度、高度和存储格式(ARGB_4444、ARGB_8888、ALPHA_8)(数据的存储格式,这里应了第一句话,也是重点)等信息,Bitmap 中用来创建空白图片最简单的方法就是这个方法:

 public static Bitmap createBitmap(int width, int height, Config config)

该方法是 static 方法,不需要创建 Bitmap 对象即可直接调用。

从计算机二进制数据的角度来看,我们要得到一幅画,不管是自己画还是从网上获取存储下来,都需要用到Bitmap位图来保存数据,我们要在Canvas画布上作画,实际上是在Bitmap创建的位图区域内作画,Bitmap创建的位图区域越大,被存储到这里的图片资源在实际的View组建中显得越小。

也就是说在Canvas 类封装了大量的绘图方法,Canvas对象的作用就是调用自己的绘图方法在Bitmap创建的区域内作画。

屏幕显示与 Canvas 的关系?

很多初学的开发者一直以为显示所绘图形的屏幕就是Canvas,其实这是一种非常错误的理解,比

如下面这段代码。在这段代码中,同一个矩形,在画布平移前后各画一次,结果会怎样?

 实际的效果图如下:

 书面的解释如下:

对上面的知识做一个总结:

 在Activity中绘制画图:

package com.youcai.mycustomcomponents;


import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.os.Bundle;
import android.widget.ImageView;

public class MainActivity extends Activity {
    private ImageView imageView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
//        imageView = (ImageView) findViewById(R.id.img_iv);
//        //创建空白位图
//        Bitmap bmp = Bitmap.createBitmap(400, 400, Bitmap.Config.ARGB_8888);
//        //创建画布
//        Canvas canvas = new Canvas(bmp);
//        //绘制文字
//        Paint paint = new Paint();
//        paint.setAntiAlias(true);
//        paint.setStyle(Paint.Style.FILL);
//        paint.setTextAlign(Paint.Align.LEFT);
//        int sp = 14;
//        paint.setTextSize(sp);
//        paint.setTextSkewX(0.5f);
//        paint.setUnderlineText(true);
//        paint.setFakeBoldText(true);
//        canvas.drawText("韬睿科技,移动互联网卓越领导者!", 10, 100, paint);
//        //绘制图形
//        paint.setStyle(Paint.Style.STROKE);
//        paint.setColor(Color.RED);
//        paint.setStrokeWidth(20);
//        paint.setStrokeJoin(Paint.Join.BEVEL);//请修改枚举值查看效果
//        //绘制一个矩形
//        canvas.drawRect(new Rect(10, 200, 350, 350), paint);
//
//        //绘制完成后,通过 ImageView 组件的setImageBitmap()方法显示在该组件上
//        imageView.setImageBitmap(bmp);
/**
 * 绘制图片
 */
        ImageView imageView = (ImageView) findViewById(R.id.img_iv);
        //创建一张能存储数据的空白图片,空白图片需要指定宽度、高度和存储格式(ARGB_4444、ARGB_8888、ALPHA_8)等信息
        Bitmap bmpBuffer = Bitmap.createBitmap(500, 800,Bitmap.Config.ARGB_8888);

        Canvas canvas = new Canvas(bmpBuffer);
        //从 Android 的 drawable 资源(res/drawable)目录中读取图片数据并转换成 Bitmap 对象
        Bitmap bmp = BitmapFactory.decodeResource(getResources(),R.mipmap.ic_launcher);

        /**
         * 将bmp原大小图片的绘制在画布上,这个bmp被绘制存储在Bitmap bmpBuffer位图上了
         */
        canvas.drawBitmap(bmp, 0, 0, null);
         //对图片进行缩放
        int bmpWidth = bmp.getWidth();
        int bmpHeight = bmp.getHeight();

        //在Bitmap中绘制的区域,参数顺序:左、上、右、下
        Rect src = new Rect(0, 0, bmpWidth, bmpHeight);
        //在Bitmap中绘制的区域,放大了3倍
        Rect dst = new Rect(0, bmpHeight, bmpWidth * 3, bmpHeight * 3 + bmpHeight);

        /**
         * 从 bitmap 中抠出一块大小区域为 src 的图片,并绘制到 canvas 的 dst 处
         */
        canvas.drawBitmap(bmp, src, dst, null);
        imageView.setImageBitmap(bmpBuffer);
    }
}

上面的代码演示只是在Activity中进行的。真正的自定义View是需要在View的子类中去实现。这里只说明Paint、Bitmap、Canvas的关系,以便形成正确的思维。

更多内容请参见,我的其他关于自定义View的文章。点击头像进入即可查看以往和最新的文章。

以上是关于Android自定义View画图的步骤及关于CanvasBitmapPaint的关系的主要内容,如果未能解决你的问题,请参考以下文章

android:如何用canvas在自定义view里画图

自定义view画图

Android之自定义画图文字动画

Android自定义View基础

一个自定义View中canvas画图的问题

Android自己定义组件系列——自己定义View及ViewGroup