Android画图工具——Canvas

在Android中直接加载的bitmap对象是只读的,无法修改,要修改图片只能在内存中创建出一个一模一样的bitmap副本,然后修改副本达到对图片的处理,副本以imageview作为容器装载。

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);


      //这个对象是只读的
        Bitmap bm = BitmapFactory.decodeFile("data/data/com.example.copy/cache/myself.png");

        //创建图片副本
        //1.在内存中创建一个与原图一模一样大小的bitmap对象,创建与原图大小一致的白纸
        Bitmap bmCopy = Bitmap.createBitmap(bm.getWidth(),bm.getHeight(),bm.getConfig());
        //2.创建画笔对象
        Paint paint = new Paint();
        //3.创建画板,将白纸铺在画板上
        Canvas canvas = new Canvas(bmCopy);
        //4.开始作画,把原图内容绘制在白纸上
        canvas.drawBitmap(bm, new Matrix(), paint);
        ImageView iv_src = (ImageView) findViewById(R.id.iv_src);
        ImageView iv_copy = (ImageView) findViewById(R.id.iv_copy);

        iv_src.setImageBitmap(bm);
        iv_copy.setImageBitmap(bmCopy);
    }   
}

使用canvas实现一些图片的特效
本质:图片的特效都是对图片这个矩阵的操作使其发生改变
首先还是加载出图片,定义好画笔,画板,将白纸在画板上,然后对白纸进行操作,完成需要的特效然后将图片绘制在定义好的画板上

//这里的矩阵不要定义在drawbitmap中,因为需要对矩阵进行操作才能实现特效,所以直接定义出矩阵对象。
Matrix mt = new Matrix();
        //平移
        //mt.setTranslate(20, 40);

        //缩放,sx是水平方向的缩放比例,sy是竖直方向的缩放比例
        //mt.setScale(2, 0.5f);
        //该缩放是后面两个参数是缩放点的位置
       // mt.setScale(0.5f, 0.5f, bm.getWidth() / 2,bm.getHeight() / 2);

        //旋转
        //mt.setRotate(45);

        //镜面
        mt.setScale(-1, 1);
        mt.postTranslate(bm.getWidth(), 0);

        //倒影
        mt.setScale(1, -1);
        mt.postTranslate(0, bm.getHeight());

        canvas.drawBitmap(bm, mt , paint);
        //canvas.drawLine(10, 10, 40, 40, paint);
        ImageView iv_src = (ImageView) findViewById(R.id.iv_src);
        ImageView iv_copy = (ImageView) findViewById(R.id.iv_copy);

        iv_src.setImageBitmap(bm);
        iv_copy.setImageBitmap(bmCopy);

图画板实例,可以在白板上通过手指的触摸滑动作出自己想要的图形。

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //加载画板的背景图
        Bitmap bm = BitmapFactory.decodeResource(getResources(), R.drawable.bg);
        //创建背景图的副本
        copy= Bitmap.createBitmap(bm.getWidth(), bm.getHeight(), bm.getConfig());
        paint = new Paint();
        canvas = new Canvas(copy);
        canvas.drawBitmap(bm, new Matrix(), paint);
        iv = (ImageView) findViewById(R.id.iv);
        iv.setImageBitmap(copy);
        //设置触摸侦听
        iv.setOnTouchListener(new OnTouchListener() {

            //触摸事件产生时此方法调用
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                // TODO Auto-generated method stub
                int action = event.getAction();
                switch (action) {
                //用戶手指摸到屏幕
                case MotionEvent.ACTION_DOWN:
                    startx = (int) event.getX();
                    starty = (int) event.getY();
                    break;                  
                //用戶手指正在滑动
                case MotionEvent.ACTION_MOVE:
                    int x = (int) event.getX();
                    int y = (int) event.getY();
                    //System.out.println(x+" "+y);
                    canvas.drawLine(startx, starty, x, y, paint);
                    iv.setImageBitmap(copy);
                    startx = x;
                    starty = y;
                    break;
                //用户手指离开屏幕
                case MotionEvent.ACTION_UP:

                    break;
                default:
                    break;
                }
                //返回true:告诉系统,触摸事件我来处理
                //返回false:告诉系统,触摸事件我不处理,返回给imageview父节点处理
                return true;
            }
        });
    }

改变画笔颜色

paint.setColor(Color.RED);

改变画笔大小

//其中的数字就是画笔的大小
paint.setStrokeWidth(7);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值