androidcanvas绘制
1. 如何用android 画出三角形
。支支吾吾也没说出来,哎,回家一想太可气 了,就找到方法。原来是android.graphics.Path这个类,实现的。Api里的描述如下:The Path class encapsulates compound (multiple contour) geometric paths consisting of straight line segments, quadratic curves, and cubic curves. It can be drawn with canvas.drawPath(path, paint), either filled or stroked (based on the paint's Style), or it can be used for clipping or to draw text on a path. 它大概的意思是说path类包含了多种组件,比如直线段,二次曲线,三次曲线,它可以在画布上绘制,无论是填充或笔画。下面举例说明: package cn.lgl.draw; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.LinearGradient; import android.graphics.Paint; import android.graphics.Path; import android.graphics.RectF; import android.graphics.Shader; import android.view.View; public class MyView extends View { public MyView(Context context) { super(context); // TODO Auto-generated constructor stub } @Override protected void onDraw(Canvas canvas) { // TODO Auto-generated method stub super.onDraw(canvas); /*设置背景为白色*/ canvas.drawColor(Color.WHITE); Paint paint=new Paint(); /*去锯齿*/ paint.setAntiAlias(true); /*设置paint的颜色*/ paint.setColor(Color.RED); /*设置paint的 style 为STROKE:空心*/ paint.setStyle(Paint.Style.STROKE); /*设置paint的外框宽度*/ paint.setStrokeWidth(3); /*画一个空心三角形*/ Path path=new Path(); path.moveTo(10,330); path.lineTo(70,330); path.lineTo(40,100); path.close(); canvas.drawPath(path, paint); /*设置paint 的style为 FILL:实心*/ paint.setStyle(Paint.Style.FILL); /*设置paint的颜色*/ paint.setColor(Color.BLUE); /*画一个实心三角形*/ Path path2=new Path(); path2.moveTo(90,330); path2.lineTo(150,330); path2.lineTo(120,270); path2.close(); canvas.drawPath(path2, paint); Shader mShader=new LinearGradient(0,0,100,100, new int[]{Color.RED,Color.GREEN,Color.BLUE,Color.YELLOW}, null,Shader.TileMode.REPEAT); paint.setShader(mShader); /*画一个渐变色三角形*/ Path path4=new Path(); path4.moveTo(170,330); path4.lineTo(230,330); path4.lineTo(200,270); path4.close(); canvas.drawPath(path4,paint); } }
2. android:如何用canvas在自定义view里画图
将构造函数改成这个试试
public iniView01(Context context, AttributeSet attrs) {
super(context, attrs);
// TODO Auto-generated constructor stub
}
本人在写的时候也遇到过代码没问题,但是一到虚拟机里面运行就崩了,然后将构造函数改成这个就不会了
3. Android绘图之Canvas变换(6)
前面讲解了Canvas的基本概念, Android绘图之Canvas概念理解(5) ,
对Canvas的概念进行了分析,但是没有说明和屏幕的关系,Canvas不等于屏幕,屏幕不会动的,我们也无法对屏幕进行(平移,缩放等)操作,只能对Canvas进行操作,所以对Canvas进行操作,屏幕不动,最终会导致看到的图像不同。
下面开始讲解Canvas的变幻操作:
包括:translate,rotate,scale,skew,clip,clipout,matrix
先从最简单的平移开始:
对Canvas进行平移,
dx: x轴方向进行平移,正值向屏幕右侧
dy:y轴方向进行平移,正值向屏幕下方
绘制两个点查看原点位置。
原点显然改变了,以后再绘制任何形状都是以translate后的原点开始绘制。
参数说明
sx:横向的缩放,默认为1,小数缩小,整数放大
sy:纵向的缩放,默认为1,小数缩小,整数放大
px,py,看源码知道是先translate,执行sx,sy然后再translate反方向。
第二次translate的坐标为(-px sx,-px sy),最终的效果就是px,py是缩放后不动的点。
缩放后坐标减半。
如果想控制缩放后的位置,如何控制呢,这就需要第二个函数。
还可以控制其他位置,例如控制缩放后在中心。
rotate有两个函数:
rotate(float degrees)
rotate(float degrees, float px, float py)
Degree:旋转的角度,正值为顺时针,负值为逆时针
Px,py:旋转的中心,如果不指定旋转中心默认为(0,0)点
指定旋转中心为矩形中心
参数说明:
sx:画布在x方向上倾斜相应的角度,sx倾斜角度的tan值,
sy:画布在y轴方向上倾斜相应的角度,sy为倾斜角度的tan值,
根据矩形或者路径裁剪画布,画布被切割之后,只有部分区域可用,其他区域无法绘制内容。
Clip函数切割的区域可用,clipOut未被切割的区域可用。(过时函数不再讲解)
Matrix提供了一些方法来控制变换:
android绘图之Paint(1)
android绘图之Canvas基础(2)
Android绘图之Path(3)
Android绘图之drawText绘制文本相关(4)
Android绘图之Canvas概念理解(5)
Android绘图之Canvas变换(6)
Android绘图之Canvas状态保存和恢复(7)
Android绘图之PathEffect (8)
Android绘图之LinearGradient线性渐变(9)
Android绘图之SweepGradient(10)
Android绘图之RadialGradient 放射渐变(11)
Android绘制之BitmapShader(12)
Android绘图之ComposeShader,PorterDuff.mode及Xfermode(13)
Android绘图之drawText,getTextBounds,measureText,FontMetrics,基线(14)
Android绘图之贝塞尔曲线简介(15)
Android绘图之PathMeasure(16)
Android 动态修改渐变 GradientDrawable
4. Android canvas 如何绘制字体大小为25的一行文本
Canvas相当于画布,字体的大小格式在Paint上设置才正确, Paint 相当于画笔。代码如下,没有具体参数:希望能帮到你 Paint paint = new Paint(); paint.setTextSize(textSize);//设置字体大小 paint.setTypeface(typeface);//设置字体类型
5. Android在canvas中实现高性能的烟花/粒子特效
新年到了,本文将展示通过自定义view绘制烟花效果的案例,同时介绍一种优化canvas绘制时的性能的方法.
每点击一下屏幕会产生一枚烟花,烟花飞到最上空会炸裂成60~100个碎片,
同屏可能有上千个粒子在不停更新它的位置.
github
这时候功能基本实现了,剩下的就是将每一个烟花绘制在canvas上,通常我们会这样写
然而你会发现性能很糟糕,帧数随着粒子数的增加直线下降直到个位数,优化如下
some codes were from Daniel Shiffman
6. Android canvas绘制的可滑动刻度尺
首先放上所有成员变量
以上用到的方法
本Demo是使用Canvas进行绘制刻度,为了适配不同宽度的屏幕,所以小的刻度使用从中心指针处向两边绘制到屏幕边界的方法,使用GestureDetector接管View的触摸事件,在onScroll中修改体重值并不断进行重绘,达到刻度尺滚动的效果。并在onFling中接收抛动的事件,开启一个属性动画达到平滑的效果。由于我没有在GestureDetector中找到能响应不fling的up事件,所以要自己手动在onTouchEvent中写ACIONT_UP时的动作
遮罩层的实现方式,是drawRec 一个整个画布大小的白色矩形,使用线性渐变,两边不透明到中间透明。注意,由于使用了PorterDuff.Mode.MULTIPLY来合成,所以需要使用到离屏缓冲,关于离屏缓冲可以看看 HenCoder
最后附上github: https://github.com/Pro47x/BodyWeightScaleTableView
7. Android 画板canvas如何画五角星
这个应该不难吧 用path path.moveTo(xx,xx);
path.lineTo(xx,xx);
算下这个五角星个点坐标就行了。