PathPaintCanvasShaderTest

<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>











   

你可能感兴趣的:(PathPaintCanvasShaderTest)