<IMG alt="" src=" http://hi.csdn.net/attachment/201112/22/0_1324524713LjvH.gif"><IMG alt="" src="http://hi.csdn.net/attachment/201112/22/0_13245249264F3Z.gif">
package hyz.com.pathpaintcanvasshader; import android.app.Activity; import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapShader; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.ComposeShader; import android.graphics.LinearGradient; import android.graphics.Paint; import android.graphics.Path; import android.graphics.PorterDuff; import android.graphics.RadialGradient; import android.graphics.RectF; import android.graphics.Shader; import android.graphics.SweepGradient; import android.graphics.drawable.BitmapDrawable; import android.os.Bundle; import android.view.View; public class PathPaintCanvasShaderTestActivity extends Activity { private Paint paint ; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); /*设置ContentView为自定义的MyVieW*/ MyView myView=new MyView(this); setContentView(myView); } /* 自定义继承View 的MyView*/ private class MyView extends View { public MyView(Context context) { super(context) ; } /*重写onDraw()*/ @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); paint = new Paint(); /*设置背景为白色*/ canvas.drawColor(Color.WHITE); /*去锯齿*/ paint.setAntiAlias(false); /*设置paint的颜色*/ paint.setColor(Color.RED); /*设置paint的 style 为STROKE:空心*/ paint.setStyle(Paint.Style.STROKE); /*设置paint的外框宽度*/ paint.setStrokeWidth(3); /*写字*/ paint.setTextSize(12); //设定是否使用图像抖动处理,会使绘制出来的图片颜色更加平滑和饱满,图像更加清晰 paint.setDither(true); /* * paint.setFilterBitmap(boolean filter); * 如果该项设置为true,则图像在动画进行中会滤掉对Bitmap图像的优化操作,加快显示 * 速度,本设置项依赖于dither和xfermode的设置 */ /*画一个空心圆形,前3个参数分别表示:圆心距离屏幕最左边的距离、圆心距离屏幕最上边的距离、半径*/ canvas.drawCircle(40, 40, 30, paint); /*画一个空心正方形,前4个参数分别表示:正方形左边离屏幕最左边的距离、正方形上边离屏幕最上边的距离、 *正方形右边离屏幕最左边的距离、正方形下边离屏幕最上边的距离,以下长方形、椭圆同理 。
*4个参数还可以理解为正方形左上角横坐标、左上角纵坐标、右下角横坐标、右下角纵坐标。
*不过要注意,当你设置了边宽paint.setStrokeWidth(n);后,4参数则分别表示各边中间线条与屏幕的距离 */ canvas.drawRect(10, 90, 70, 150, paint); /*画一个空心长方形*/ // 设置绘制的颜色,a代表透明度,r,g,b代表颜色值 paint.setARGB(150, 150, 100, 50); canvas.drawRect(0, 170, 70,200, paint); /*画一个空心椭圆形*/ //设置绘制图形的透明度,和上面setARGB()中的第一个值同一意思 paint.setAlpha(50); canvas.drawOval(new RectF(10,220,70,250), paint); /*画一个空心三角形*/ Path path=new Path(); path.moveTo(10, 330);//三角形左底点距离屏幕最左边和最上边的距离,也是起始画点 path.lineTo(70,330);//从左底点绘画至右底点 path.lineTo(40,270);//从右底点绘画至顶点 path.close();//自动从顶点绘画至左底点 canvas.drawPath(path, paint); /*画一个空心梯形*/ Path path1=new Path(); path1.moveTo(10, 410); path1.lineTo(70,410); path1.lineTo(55,350); path1.lineTo(25, 350); path1.close(); canvas.drawPath(path1, paint); paint.setAntiAlias(true); /*设置paint的颜色*/ paint.setColor(Color.BLUE); /*设置paint 的style为 FILL:实心*/ paint.setStyle(Paint.Style.FILL); /*画一个实心圆*/ canvas.drawCircle(120,40,30, paint); /*画一个实心正方形*/ canvas.drawRect(90, 90, 150, 150, paint); /*画一个实心长方形*/ canvas.drawRect(90, 170, 150,200, paint); /*画一个实心椭圆*/ RectF re2=new RectF(90,220,150,250); canvas.drawOval(re2, paint); /*画一个实心三角形*/ Path path2=new Path(); path2.moveTo(90, 330); path2.lineTo(150,330); path2.lineTo(120,270); path2.close(); canvas.drawPath(path2, paint); /*画一个实心梯形*/ Path path3=new Path(); path3.moveTo(90, 410); path3.lineTo(150,410); path3.lineTo(135,350); path3.lineTo(105, 350); path3.close(); canvas.drawPath(path3, paint); /*Android中提供了Shader类专门用来渲染图像以及一些几何图形,Shader下面包括几个直接子类, *分别是BitmapShader、 ComposeShader、LinearGradient、RadialGradient、SweepGradient。 *BitmapShader主要用来渲染图像,LinearGradient 用来进行梯度渲染,RadialGradient 用来进行环形渲染, *SweepGradient 用来进行梯度渲染,ComposeShader则是一个 混合渲染,可以和其它几个子类组合起来使用. */ /*创建LinearGradient并设置渐变的颜色数组 * 第一个 起始的x坐标 * 第二个 起始的y坐标 * 第三个 结束的x坐标 * 第四个 结束的y坐标 * 第五个 颜色数组 * 第六个 这个也是一个数组用来指定颜色数组的相对位置 如果为null 就沿坡度线均匀分布 * 第七个 渲染模式(3种)-- * REPEAT:沿着渐变方向循环重复 * CLAMP:如果在预先定义的范围外画的话,就重复边界的颜色 * MIRROR:与REPEAT一样都是循环重复,但这个会对称重复 */ Shader mLinearGradient =new LinearGradient(0,0,100,100,new int[]{Color.RED,Color.GREEN,Color.BLUE,Color.YELLOW},null,Shader.TileMode.REPEAT); // 梯度渲染,,就像圆状百分比视图 ,前两参数为中心点 Shader mSweepGradient = new SweepGradient(30,30,new int[]{Color.GREEN,Color.RED,Color.BLUE,Color.WHITE},null); //环形渲染 ,前两参数为中心点 Shader mRadialGradient = new RadialGradient(50,200,50,new int[]{Color.GREEN,Color.RED,Color.BLUE,Color.WHITE}, null,Shader.TileMode.REPEAT); /* Bitmap渲染 */ Bitmap mBit= ((BitmapDrawable) getResources().getDrawable(R.drawable.zm)).getBitmap(); Shader mBitmapShader = new BitmapShader(mBit,Shader.TileMode.REPEAT,Shader.TileMode.MIRROR); /*混合渲染,这里使用了BitmapShader和LinearGradient进行混合*/ Shader mComposeShader = new ComposeShader(mBitmapShader,mLinearGradient,PorterDuff.Mode.DARKEN); paint.setShader(mLinearGradient); canvas.drawText("线性渐变渲染", 240, 50, paint); /*画一个渐变色圆*/ canvas.drawCircle(200,40,30, paint); paint.setShader(mSweepGradient); canvas.drawText("梯度渲染", 240, 120, paint); /*画一个渐变色正方形*/ canvas.drawRect(170, 90, 230, 150, paint); paint.setShader(mRadialGradient); canvas.drawText("环形渐变", 240, 190, paint); /*画一个渐变色长方形*/ canvas.drawRect(170, 170, 230,200, paint); paint.setShader(mBitmapShader); canvas.drawText("Bitmap渲染", 240, 250, paint); /*画一个渐变色椭圆*/ RectF re3=new RectF(170,220,230,250); canvas.drawOval(re3, paint); /*画一个渐变色三角形*/ Path path4=new Path(); path4.moveTo(170,330); path4.lineTo(230,330); path4.lineTo(200,270); path4.close(); // canvas.drawText("三角形", 240, 320, paint); canvas.drawPath(path4, paint); paint.setShader(mComposeShader); canvas.drawText("混合渲染", 240, 390, paint); /*画一个渐变色梯形*/ Path path5=new Path(); path5.moveTo(170, 410); path5.lineTo(230,410); path5.lineTo(215,350); path5.lineTo(185, 350); path5.close(); canvas.drawPath(path5, paint); } } } /*Paint类介绍 * Paint即画笔,在绘图过程中起到了极其重要的作用,画笔主要保存了颜色, * 样式等绘制信息,指定了如何绘制文本和图形,画笔对象有很多设置方法, * 大体上可以分为两类,一类与图形绘制相关,一类与文本绘制相关。 * 1.图形绘制 * setARGB(int a,int r,int g,int b); * 设置绘制的颜色,a代表透明度,r,g,b代表颜色值。 * setAlpha(int a); * 设置绘制图形的透明度。 * setColor(int color); * 设置绘制的颜色,使用颜色值来表示,该颜色值包括透明度和RGB颜色。 * setAntiAlias(boolean aa); * 设置是否使用抗锯齿功能,会消耗较大资源,绘制图形速度会变慢。 * setDither(boolean dither); * 设定是否使用图像抖动处理,会使绘制出来的图片颜色更加平滑和饱满,图像更加清晰 * setFilterBitmap(boolean filter); * 如果该项设置为true,则图像在动画进行中会滤掉对Bitmap图像的优化操作,加快显示 * 速度,本设置项依赖于dither和xfermode的设置 * setMaskFilter(MaskFilter maskfilter); * 设置MaskFilter,可以用不同的MaskFilter实现滤镜的效果,如滤化,立体等 * * setColorFilter(ColorFilter colorfilter); * 设置颜色过滤器,可以在绘制颜色时实现不用颜色的变换效果* * setPathEffect(PathEffect effect); * 设置绘制路径的效果,如点画线等 * * setShader(Shader shader); * 设置图像效果,使用Shader可以绘制出各种渐变效果 * setShadowLayer(float radius ,float dx,float dy,int color); * 在图形下面设置阴影层,产生阴影效果,radius为阴影的角度,dx和dy为阴影在x轴和y轴上的距离,color为阴影的颜色 * setStyle(Paint.Style style); * 设置画笔的样式,为FILL,FILL_OR_STROKE,或STROKE * setStrokeCap(Paint.Cap cap); * 当画笔样式为STROKE或FILL_OR_STROKE时,设置笔刷的图形样式,如圆形样式 * Cap.ROUND,或方形样式Cap.SQUARE * setSrokeJoin(Paint.Join join); * 设置绘制时各图形的结合方式,如平滑效果等 * setStrokeWidth(float width); * 当画笔样式为STROKE或FILL_OR_STROKE时,设置笔刷的粗细度 * setXfermode(Xfermode xfermode); * 设置图形重叠时的处理方式,如合并,取交集或并集,经常用来制作橡皮的擦除效果 * 2.文本绘制 * setFakeBoldText(boolean fakeBoldText); * 模拟实现粗体文字,设置在小字体上效果会非常差 * setSubpixelText(boolean subpixelText); * 设置该项为true,将有助于文本在LCD屏幕上的显示效果 * setTextAlign(Paint.Align align); * 设置绘制文字的对齐方向 * setTextScaleX(float scaleX); * 设置绘制文字x轴的缩放比例,可以实现文字的拉伸的效果 * setTextSize(float textSize); * 设置绘制文字的字号大小 * setTextSkewX(float skewX); * 设置斜体文字,skewX为倾斜弧度 * setTypeface(Typeface typeface); * 设置Typeface对象,即字体风格,包括粗体,斜体以及衬线体,非衬线体等 * setUnderlineText(boolean underlineText); * 设置带有下划线的文字效果 * setStrikeThruText(boolean strikeThruText); * 设置带有删除线的效果 */
/*Canvas类介绍
*<STRONG><SPAN style="BACKGROUND-COLOR: #ffff66">Canvas</SPAN></STRONG>(): 创建一个空的画布,可以使用setBitmap()方法来设置绘制具体的画布。 <STRONG style="COLOR: black; BACKGROUND-COLOR: #ffff66">Canvas</STRONG>(Bitmap bitmap): 以bitmap对象创建一个画布,则将内容都绘制在bitmap上,因此bitmap不得为null。 <STRONG style="COLOR: black; BACKGROUND-COLOR: #ffff66">Canvas</STRONG>(GL gl): 在绘制3D效果时使用,与OpenGL相关。 drawColor: 设置<STRONG style="COLOR: black; BACKGROUND-COLOR: #ffff66">Canvas</STRONG>的背景颜色。 setBitmap: 设置具体画布。 clipRect: 设置显示区域,即设置裁剪区。 isOpaque:检测是否支持透明。 rotate: 旋转画布 setViewport: 设置画布中显示窗口。 skew: 设置偏移量。/
save():旋转画布时会旋转画布上的所有对象,而我们只是需要旋转其中的一个,这时就需要用到save 方法来锁定需要操作的对象,在操作之后通过 restore 方法来解除锁定
invalidate():方法表示重新绘制,重新调用onDraw(),比如在onTouch()下可以考虑用一下这个方法,如果在onDraw()下用了此方法,会不停的循环调用onDraw();
<PRE class=java name="code"> 画曲线:canvas.drawPath(path,pathPaint); 在onTouchEvent(),在刚按下时(MotionEvent.ACTION_DOWN)设置path.moveTo(event.getX(),event.getY()); 在onTouchEvent(),在移动时(MotionEvent.ACTION_MOVE)设置path.quadTo(lastx,lasty,event.getX(),event.getY()); 在onTouchEvent(),在松开时(MotionEvent.ACTION_UN)设置path.reset();</PRE><PRE class=java name="code">在onTouchEvent()中结尾设置lastx=event.getX(),lasty=event.getY();invalidate(); </PRE><BR> <PRE></PRE> <PRE class=java name="code"></PRE><PRE class=java name="code"></PRE> <PRE></PRE>
09-20
09-20