PathPaintCanvasShaderTest

来源:互联网 发布:java管理系统模板 编辑:程序博客网 时间:2024/05/19 07:28
<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渲染 */             BitmapmBit= ((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>



	
				
		
原创粉丝点击