androidcanvas大小
㈠ Android绘图基础--Canvas和Drawable
Github链接
画2D图形有两种方法:
Canvas实际上是封装了各种draw方法的类,调用draw方法把图形绘制到底层的Surface上,即绘制在Window上。
这个例子中构造了两个Canvas和一个Bitmap,分别调用其draw方法,先是mCanvas往Bitmap里绘制一个方块,再在onDraw方法内调用canvas.drawBitmap绘制这个方块。
思考一个问题,为什么mCanvas需要设置Bitmap?
很简单,因为它没有持有一块内存地址,自然没法绘制。来看一下draw的起点ViewRootImpl(软件绘制,不开启硬件加速下)。
这个通过mSurface.lockCanvas返回的Canvas是View.draw的canvas变量,所以当1,2情况时,Canvas都持有一个Bitmap,指向共享内存里的某一小块,当调用Canvas.draw方法时就能绘制出东西。但对于自定义Canvas来说并不是,即使设置一个Bitmap和绘制了Bitmap,但不往共享内存上写,屏幕上是不会显示的,SurfaceView同理,通过Surface.lockCanvas获取持有共享内存的Canvas,绘制完毕后调用Surface.unlockCanvasAndPost把绘制内容显示到surface上并release掉Canvas。
顺带一提Canvas.save和Canvas.restore方法,如下Demo
效果图如
画的是三个颜色和旋转角度都不同的小方形。
步骤1把默认坐标系旋转20°,画出第一个蓝色的方形,步骤2保存当前的matrix(旋转了20°),继续旋转20°,此时坐标系已经旋转了40°,画出第二个黄色的方块,步骤3,恢复上一步保存的matrix(旋转了20°),此时坐标系还是旋转了20°,步骤4,再旋转40°,此时坐标系旋转了60°,画出第三个黑色方块。
Canvas.save用于保存当前matrix和clip,Canvas.restore用于恢复上次保存的matrix和clip。
Drawable是一个能画出来的物体的抽象,使用前需要调用setBounds确定位置和大小,通过getIntrinsicHeight和getIntrinsicWidth取到实际大小。Drawable可以有几种形式存在:Bitmap、Nine Patch、Vector、Shape、Layers等。
从Resource.getDrawable会判断是否.xml结尾,不是的话走6,7步,如果从xml中读取,需要getResource.getDrawable -> ResourceImpl.loadDrawableForCookie -> drawable.createFromXml -> DrawableInflater.inflateFromXmlForDensity -> drawable.inflateFromTag
看一下Shape实现类GradientDrawable的inflate实现,读取各项属性并赋值,到draw方法。
调用canvas.drawRect把mRect画出来,而mRect的赋值在ensureValidRect。[图片上传失败...(image-a25af0-1515826613001)]
bounds在哪里设置的?答案是ImageView.updateDrawable内,会调用Drawable.getIntrinsicHeight赋值(从xml中size属性读取),再调用configureBounds -> setBounds,如果使用的不是ImageView,一定要在draw之前 调用setBounds ,否则size就会出错。
回到loadDrawableForCookie,再看一下6,7步加载图片的过程,通过AssetManager读取图片流数据,通过Drawable.createFromResourceStream这个我们经常使用的方法获取到Drawable。
取到屏幕密度之后调用BitmapFactory.decodeResourcesStream,计算密度后调用native创建Bitmap,感兴趣的同学可以看下更具体的分析文章(如 理解Bitmap )。
本文探究了两点
Android 7.1.1 源码
Android 官方文档, Canvas and Drawable , Drawable 等
㈡ Android canvas.drawBitmap() 绘制图片大小的问题
你绘图的控件是不是足够大?像素密度有没有计算进去?bitmap直接可以判断大小的,单位是px。你打log把该输出的输出一下看看。
㈢ Android 绘图之Canvas相关API使用
Android 自定义控件或多或少都会用到Canvas,那么我们就需要熟悉它的API。Canvas给我们提供了大量的的DrawXXX方法,通过这些方法我们就可以绘制出我们想要的效果。接下来看看官方是怎么说的:
大致意思就是说:
Canvas类持有“draw”调用。 要绘制一些东西,你需要4个基本组件:一个位图来保存像素,一张画布(Canvas)来主持绘图调用(写入位图),一个绘图图元(如Rect,Path,text,Bitmap)和一支罩判厅画笔(描述绘图的颜色和样式)。
首先介绍下画笔(Paint)的常用API:
Paint默认的字体大小为12px,在绘制文本时我们往往要考虑密度density设置合适的字体大小。画笔的默认颜色物隐为黑色,默认的style为FILL,默认的cap为BUTT,默认的线宽为0。
单一颜色填充Canvas画布
以上就是大部分的绘制操作,当然还有一些没介绍到,还有一些需要在API21(5.0)以上才能使用,这个使用到的时候可以弄个冲纳小demo看下效果,接下来介绍下针对画布变换和画布裁剪做一些介绍。
在学习绘制操作的时候很多地方都使用到了translate 和rotate 这里就不再对它们进行操作
1.画布scale
2.画布skew
这里针对Canvas的API进行了一些说明,希望对大家有所帮助。没有添加完整工程上来,但是每一个方法都是实际跑过的,只需要在onDraw中调用就可以看到效果了。
㈣ android canvas 如何以厘米为单位
请参阅 TypedValue | Android Developers 。这个类中的
complexToDimensionPixelSize(int data, DisplayMetrics metrics)
可以把mm转换成px。
㈤ Android Canvas 方法总结
在自定义 View的时候,我们经常需要绘制一些自己想要的效果。
这里就需要使用Canvas对象。
下面将Canvas对象常用方法做个笔记,方便记忆。
对Canvas的一系列操作,是指对Canvas进行旋转、平移、缩放等操作。
这些操作可以让Canvas对象使用起来更加便捷。
Canvas提供了几个方法,让我们可以方便的对Canvas的状态进行更改和还原。
这些方法是: save() 、 restore() 、 restoreToCount(int saveCount) 。
我们在对Canvas进行平移、旋转、放大等操作时候,可以调用 save() 方法,将当前修改过的Canvas状态进行保存,调用 restore() 方法后,会将Canvas还原成最近的一个 save() 的状态。
save() 方法还会有一个返回值,我们也可以调用 restoreToCount(int saveCount) 方法,将这个返回值作为参数传递进去,就可以将Canvas还原成某一个特定的 save() 状态。
㈥ android canvas scale函数能扩大画布canvas大小吗
您好,很高兴能帮助您
感觉用 canvas scale函授后,canvas上的图像变大了,但是超出canvas的图缓租像没有了.... 是不是scale只改变图片,不改变canvas大小!
你的采扰唤兆纳是我前进的动力,
记得好评和采纳,答链档题不易,互相帮助,
㈦ android canvas的drawText方法 如何设置字体大小和格式。
Canvas相当于画布,字体的大小格式在Paint上设置才正确, Paint 相当于画笔。代码如下,没有具体参数:
Paint paint = new Paint();
paint.setTextSize(textSize);//设置字体大小
paint.setTypeface(typeface);//设置字体类型
canvas.drawText(text, x, y, paint);//使用画笔paint
@Override
public void onDraw (Canvas canvas) {
Rect targetRect = new Rect(50, 50, 1000, 200);
Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
paint.setStrokeWidth(3);
paint.setTextSize(80);
String testString = "测试:ijkJQKA:1234";
paint.setColor(Color.CYAN);
canvas.drawRect(targetRect, paint);
paint.setColor(Color.RED);
FontMetricsInt fontMetrics = paint.getFontMetricsInt();
(7)androidcanvas大小扩展阅读:
Screen Space - Camera
此模式类似Screen Space - Overlay,但区别是此模式将Canvas放置于某个Camera前固定距离。此Camera负责渲染所有UI元素,则摄像机参数(Camera Settings)直接影响UI表现。
比如Camera是透视模式(Perspective),则UI元素会基于Field of View的值而扭曲变形。同样的,若屏幕分辨率变更,或者视觉平截体(CameraFrustrum)改变,则Canvas自动调整自身尺寸作自适应。
㈧ android canvas 是像素吗
Canvas : 画布对象,相当于现实生活中画图用的 ‘纸 或 布’。
下面介绍来自于android学习手册,android学习手册包含9个章节,108个例子,源码文档随便看,例子都是可交互,可运行,源码采用android studio目录结构,高亮显示代码,文档都采用文档结构图显示,可以快速定位。360手机助手中下载,排在第三、四个。
Android画图最基本的三个对象(Color,Paint,Canvas)
三个类都存放在 android.graphics包下
1) Color :颜色对象,相当于现实生活中的 ‘调料’
2) Paint : 画笔对象,相当于现实生活中画图用的 ‘笔’————主要的还是对‘画笔’进行设置
3) Canvas : 画布对象,相当于现实生活中画图用的 ‘纸 或 布’
三者相结合,就能画出基本的图形
㈨ Android 怎么使用Bitmap+Canvas 自适应屏幕
我们可以使用Matrix 来放缩我们得到的Bitmap 从而使我们的BItmap适应我们的手机屏幕
首先我们得先获取我们的手机屏幕的大小
java">WindowManagerwm=(WindowManager)getContext().getSystemService(
Context.WINDOW_SERVICE);
intwidth=wm.getDefaultDisplay().getWidth();
intheight=wm.getDefaultDisplay().getHeight();
然后我们构造一个新的Matrix对象,自己完成写一个函数,如下:
publicBitmapresizeBitmap(Bitmapbitmap,intw,inth)
{
if(bitmap!=null)
{
intwidth=bitmap.getWidth();
intheight=bitmap.getHeight();
intnewWidth=w;
intnewHeight=h;
floatscaleWight=((float)newWidth)/width;
floatscaleHeight=((float)newHeight)/height;
Matrixmatrix=newMatrix();
matrix.postScale(scaleWight,scaleHeight);
Bitmapres=Bitmap.createBitmap(bitmap,0,0,width,height,matrix,true);
returnres;
}
else{
returnnull;
}
}
这样我们通过这个函数返回的Bitmap对象就是可以适应我们手机屏幕大小的了。。
㈩ Android 怎么使用Bitmap+Canvas 自适应屏幕
ndroid 使用Bitmap+Canvas自适应屏幕方法如下:
1、首先得先获取我们的手机屏幕的大小
3、这样通过这个函数返回的Bitmap对象就是可以适应手机屏幕大小的了。。