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