Canvas
来源:互联网 发布:拳皇14出招优化 编辑:程序博客网 时间:2024/06/15 14:49
Canvas画布的正确理解
往常我理解的是我们画的东西就存在一张画布上,那么我们rotate以后为什么原来画上的东西还在原位置显示上。原来当Canvas执行drawXXX的时候就会新建一个画布图层,类似于我们photoshop中的图层概念。
当我们旋转后,新建一个图层会沿用旋转后的坐标
canvas的变换对填充颜色不影响,canvas.drawColor还是会填充整个屏幕,有影响的是那些有坐标的,比如画圆画矩形等
介绍一些不易理解的方法
canvas.drawLines(pts,offset,count,paint);
参数:
- float []pts float数组,四个数据决定一条直线
- int offset 跳过的数据个数,这些数据不参与绘制
- int count 实际参与绘制的数据个数
- Paint paint 画笔
drawLines还有个有两个参数的上面的去掉中间两个参数,绘制一系列直线
在我们自定义Drawable时,一定要重写,因为我们在执行ondraw 方法时drawable的宽高都是零,但他的实际宽高并不为0;我们需要给drawable设置大小才能绘制。为什么我们给ImageView设置背景时imageview就可以直接显示,因为Imageview内部处理了这个问题,他的宽高被设置为ImageView的大小。Drawable的bounds参数就是父类传递过来的大小如果我们在drawable里面画颜色canvas.drawColor(Color.RED);当然不需要在onBoundsChange设置什么了
@Override protected void onBoundsChange(Rect bounds) { // TODO Auto-generated method stub Log.i("width", drawable.getBounds().width()+"height"+drawable.getBounds().height()); drawable.setBounds(bounds); }
而重写另外两个方法能改变我们绘制drawable时的大小,重写这两个方法后onBoundsChanged的height和width和下面的返回值有关,如果不重写则和ImageView(父类)宽高有关
@Override public int getIntrinsicWidth() { //得到Drawable的实际宽度 Log.i("width1",""+drawable.getIntrinsicWidth()); return drawable.getIntrinsicWidth(); } @Override public int getIntrinsicHeight() { Log.i("width2",""+drawable.getIntrinsicHeight()); //得到Drawable的实际高度 return drawable.getIntrinsicHeight(); }
而在Drawable中还有另一个方法也比较重要,我们可以通过setLevel改变level的值,然后就会回掉这个方法,还可以在draw方法中通过getLevel获得值,进行另类的绘制
@Override protected boolean onLevelChange(int level) { // 当设置level的时候回调---提醒自己重新绘制 invalidateSelf(); return true; }
Gravaity中apply方法讲解放,从指定矩形区域划分出来一块矩形
public static void apply(int gravity, int w, int h, Rect container, Rect outRect) { apply(gravity, w, h, container, 0, 0, outRect); }
参数讲解:
- gravity 划分的方向左右上下
- w 水平宽度
- h竖直高度
- container 目标矩形
- outRect 输出矩形
Rect container=new Rect(0, 0,getBounds().width(), getBounds().height()); Rect outRect=new Rect(); Gravity.apply(Gravity.LEFT|Gravity.TOP, getBounds().width()/2, getBounds().height()/2, container, outRect); Paint paint=new Paint(); paint.setColor(Color.BLACK); canvas.drawRect(outRect, paint);
Rect container=new Rect(0, 0,getBounds().width(), getBounds().height()); Rect outRect=new Rect(); Gravity.apply(Gravity.RIGHT, getBounds().width()/2, getBounds().height()/2, container, outRect); Paint paint=new Paint(); paint.setColor(Color.BLACK); canvas.drawRect(outRect, paint);
下面介绍一个canvas的另一个方法与上面的结合使用canvas.clipRect(outRect);//截取一个矩形区域,下面的drawable是一张全屏的图,通过这个方法,可以只绘制一半
@Override public void draw(Canvas canvas) { //drawable.draw(canvas); //canvas.drawColor(Color.RED); Rect container=new Rect(0, 0,getBounds().width(), getBounds().height()); Rect outRect=new Rect(); //划分出一块矩形区域 Gravity.apply(Gravity.RIGHT, getBounds().width()/2, getBounds().height(), container, outRect); Paint paint=new Paint(); paint.setColor(Color.BLACK); canvas.save();//保存画布 canvas.clipRect(outRect);//截取一个矩形区域 //canvas.drawRect(outRect, paint); drawable.draw(canvas);//绘制drawable canvas.restore();//恢复画布 }
- Canvas
- Canvas
- canvas
- Canvas
- Canvas
- canvas
- Canvas
- canvas
- Canvas
- Canvas
- canvas
- canvas
- Canvas
- canvas
- canvas
- Canvas
- Canvas
- canvas
- 基于Python的scrapy框架的广州天气爬虫源码下载
- webService接口搭建
- Gradle构建原理
- input输入框只能输入数字且小数点后只能输入两位数字
- 编辑 Java 中的事务 — JDBC 事务和 JTA 事务
- Canvas
- Net-SNMP的配置
- 微型四轴飞行器(5)九轴姿态融合算法C
- autotrace
- Android Dex编译器汇总
- Java 日期时间
- innerHTML
- Cocos2d-X中使用ProgressTimer实现一些简单的效果
- hadoop搭建过程中设置FQDN(完全限定域名)