Android画图Path的使用

来源:互联网 发布:linux cpu调为高性能 编辑:程序博客网 时间:2024/05/16 11:05



http://www.cnblogs.com/tt_mc/archive/2012/12/07/2807518.html

http://www.cnblogs.com/tt_mc/archive/2012/12/07/2807518.html

http://www.cnblogs.com/tt_mc/archive/2012/12/07/2807518.html

http://www.cnblogs.com/tt_mc/archive/2012/12/07/2807518.html




Android画图Path的使用

复制代码
/**       * 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);       * 设置带有删除线的效果       *        */  
复制代码
复制代码
private class MyView2 extends View {        public MyView2(Context context) {            super(context);        }        @Override        protected void onDraw(Canvas canvas)        {            super.onDraw(canvas);            canvas.drawColor(Color.WHITE);            Paint paint = new Paint();            paint.setAntiAlias(true);            paint.setColor(Color.RED);            paint.setStyle(Paint.Style.STROKE);//设置为空心            paint.setStrokeWidth(3);            canvas.drawCircle(40, 40, 30, paint);            canvas.drawRect(10, 90, 70, 150, paint);            canvas.drawRect(10, 170, 70, 200, paint);            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();//把开始的点和最后的点连接在一起,构成一个封闭图形            /*             * 最重要的就是movtTo和close,如果是Style.FILL的话,不设置close,也没有区别,可是如果是STROKE模式,             * 如果不设置close,图形不封闭。             *              * 当然,你也可以不设置close,再添加一条线,效果一样。             */            canvas.drawPath(path1, paint);                                                            ///////////////////////////////////////第二列            paint.setColor(Color.BLUE);            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);                                    ////////////////////////////////////////////////////第三列                        /*             * LinearGradient shader = new LinearGradient(0, 0, endX, endY, new             * int[]{startColor, midleColor, endColor},new float[]{0 , 0.5f,             * 1.0f}, TileMode.MIRROR);             * 参数一为渐变起初点坐标x位置,参数二为y轴位置,参数三和四分辨对应渐变终点             * 其中参数new int[]{startColor, midleColor,endColor}是参与渐变效果的颜色集合,              * 其中参数new float[]{0 , 0.5f, 1.0f}是定义每个颜色处于的渐变相对位置, 这个参数可以为null,如果为null表示所有的颜色按顺序均匀的分布             */            Shader mShader = new LinearGradient(0, 0, 100, 100,            new int[] { Color.RED, Color.GREEN, Color.BLUE, Color.YELLOW },            null, Shader.TileMode.REPEAT);            // Shader.TileMode三种模式            // REPEAT:沿着渐变方向循环重复            // CLAMP:如果在预先定义的范围外画的话,就重复边界的颜色            // MIRROR:与REPEAT一样都是循环重复,但这个会对称重复            paint.setShader(mShader);// 用Shader中定义定义的颜色来话            canvas.drawCircle(200, 40, 30, paint);            canvas.drawRect(170, 90, 230, 150, paint);            canvas.drawRect(170, 170, 230, 200, 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.drawPath(path4, 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);                        //////////////////////////////////第4列            paint.setTextSize(24);            canvas.drawText("圆形", 240, 50, paint);            canvas.drawText("正方形", 240, 120, paint);            canvas.drawText("长方形", 240, 190, paint);            canvas.drawText("椭圆形", 240, 250, paint);            canvas.drawText("三角形", 240, 320, paint);            canvas.drawText("梯形", 240, 390, paint);        }    }
复制代码











 

抗锯齿方法两种(其一:paint.setAntiAlias(ture);paint.setBitmapFilter(true))

 3034人阅读 评论(1) 收藏 举报
android图形
在Android中,目前,我知道有两种出现锯齿的情况。 ① 当我们用Canvas绘制位图的时候,如果对位图进行了选择,则位图会出现锯齿。 ② 在用View的RotateAnimation做动画时候,如果View当中包含有大量的图形,也会出现锯齿。我们分别以这两种情况加以考虑。 ◆ 用Canvas绘制位的的情况。在用Canvas绘制位图时,一般地,我们使用drawBitmap函数家族,在这些函数中,都有一个Paint参数,要做到防止锯齿,我们就要使用到这个参数。如下:首先在你的构造函数中,需要创建一个Paint。 Paint mPaint = new Paint(); 然后,您需要设置两个参数: 1)mPaint.setAntiAlias(); 2)mPaint.setBitmapFilter(true)。第一个函数是用来防止边缘的锯齿,第二个函数是用来对位图进行滤波处理。最后,在画图的时候,调用drawBitmap函数,只需要将整个Paint传入即可。 ◆ 有时候,当你做RotateAnimation时,你会发现,讨厌的锯齿又出现了。这个时候,由于你不能控制位图的绘制,只能用其他方法来实现防止锯齿。另外,如果你画的位图很多。不想每个位图的绘制都传入一个Paint。还有的时候,你不可能控制每个窗口的绘制的时候,您就需要用下面的方法来处理——对整个Canvas进行处理。 1)在您的构造函数中,创建一个Paint滤波器。 PaintFlagsDrawFilter mSetfil = new PaintFlagsDrawFilter(0, Paint.FILTER_BITMAP_FLAG);第一个参数是你要清除的标志位,第二个参数是你要设置的标志位。此处设置为对位图进行滤波。 2)当你在画图的时候,如果是View则在onDraw当中,如果是ViewGroup则在dispatchDraw中调用如下函数。 canvas.setDrawFilter( mSetfil ); ★ 最后,另外,在Drawable类及其子类中,也有函数setFilterBitmap可以用来对Bitmap进行滤波处理,这样,当你选择Drawable时,会有抗锯齿的效果。










http://www.myext.cn/c/a_7962.html

http://www.myext.cn/c/a_7962.html

http://www.myext.cn/c/a_7962.html

http://www.myext.cn/c/a_7962.html

http://www.myext.cn/c/a_7962.html

http://www.myext.cn/c/a_7962.html





详解Paint的setPathEffect(PathEffe

来源:网络    编辑:admin

一、setPathEffect()

这个方法一看就和path有关,顾名思义,它就是给path设置样式(效果)的。PathEffect这个路径效果类没有具体的实现,效果是由它的六个子类实现的:

这六个子类分别可以实现不同的路径效果:

下面,我们来用代码来具体实现一下。

 

二、测试代码

2.1 代码框架

首先初始化paint和path,然后配置相关属性,最后作画。

package com.kale.cview;public class CustomView extends View {    // 实例化画笔    private Paint mPaint = null;    private Path mPath;// 路径对象    private Context mContext;    public CustomView(Context context) {        super(context);    }    /**     * 当你要给view添加attribute的时候就需要用到这个构造     *      * @param context     * @param attrs     */    public CustomView(Context context, AttributeSet attrs) {        super(context, attrs);        mContext = context;        // 初始化画笔        initPaint();        initPath();    }    private void initPaint() {        // 实例化画笔并打开抗锯齿        // mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);        mPaint = new Paint();        mPaint.setStyle(Paint.Style.STROKE);          mPaint.setStrokeWidth(5);          mPaint.setColor(Color.DKGRAY);      }    private void initPath() {        // 实例化路径        mPath = new Path();        // 定义路径的起点        mPath.moveTo(10, 50);        // 定义路径的各个点        for (int i = 0; i <= 30; i++) {            mPath.lineTo(i * 35, (float) (Math.random() * 100));        }    }    /*     * 绘制view时调用的方法,可能会出现多次调用,所以不建议在这里面实例化对象,也就是不要出现new     *      * @param canvas 一个画布对象,我们可以用paint在上面画画     */    @Override    protected void onDraw(Canvas canvas) {        super.onDraw(canvas);        /*         * 绘制路径         */        // 没有做处理,还没有写代码               canvas.drawPath(mPath, mPaint);    }}

 

2.2 不设置效果

    @Override    protected void onDraw(Canvas canvas) {        super.onDraw(canvas);        // 把画布往下移动250        canvas.translate(0, 250);          /*         * 绘制路径         */        // 没有做处理,显示生硬        mPaint.setPathEffect(null);        canvas.drawPath(mPath, mPaint);    }

 

2.3 CornerPathEffect

CornerPathEffect则可以将路径的转角变得圆滑,CornerPathEffect的构造方法只接受一个参数radius,意思就是转角处的圆滑程度。

    @Override    protected void onDraw(Canvas canvas) {        super.onDraw(canvas);        // 把画布往下移动250        canvas.translate(0, 250);          /*         * 绘制路径         */        mPaint.setPathEffect(new CornerPathEffect(50));        canvas.drawPath(mPath, mPaint);    }

 

2.4 DiscretePathEffect

DiscretePathEffect(离散路径效果)相对来说则稍微复杂点,其会在路径上绘制很多“杂点”的突出来模拟一种类似生锈铁丝的效果。其构造方法有两个参数:

第一个呢指定这些突出的“杂点”的密度,值越小杂点越密集;

第二个参数呢则是“杂点”突出的大小,值越大突出的距离越大反之反之。

    @Override    protected void onDraw(Canvas canvas) {        super.onDraw(canvas);        // 把画布往下移动250        canvas.translate(0, 250);          /*         * 绘制路径         */        mPaint.setPathEffect(new DiscretePathEffect(3.0F, 5.0F));        canvas.drawPath(mPath, mPaint);    }

当我们设置杂点密度很大,突出距离较小时,你会发现线条也变得柔和了起来。

    @Override    protected void onDraw(Canvas canvas) {        super.onDraw(canvas);        // 把画布往下移动250        canvas.translate(0, 250);          /*         * 绘制路径         */        mPaint.setPathEffect(new DiscretePathEffect(10.0F, 2.0F));        canvas.drawPath(mPath, mPaint);    }

 

2.5 DashPathEffect

它的效果相对与上面两种路径效果来说要略显复杂,其虽说也是包含了两个参数:

第一个参数是一个浮点型的数组,那这个数组有什么意义呢?其实是这样的,我们在定义该参数的时候只要浮点型数组中元素个数大于等于2即可,也就是说上面我们的代码可以写成这样的:

    @Override    protected void onDraw(Canvas canvas) {        super.onDraw(canvas);        // 把画布往下移动250        canvas.translate(0, 250);          /*         * 绘制路径         */        mPaint.setPathEffect(new DashPathEffect(new float[] {20, 10}, 1));        canvas.drawPath(mPath, mPaint);    }

loat[] {20, 10}的偶数参数20(注意数组下标是从0开始哦)定义了我们第一条实线的长度,而奇数参数10则表示第一条虚线的长度,如果此时数组后面不再有数据则重复第一个数以此往复循环,整条线就成了[20,10,20,10,20,10…………………………]这么一个状态。当然如果你想要对每个实线和虚线进行设置,你可以这样:

mEffects[3] = new DashPathEffect(new float[] {20, 10, 50, 5, 100, 30, 10, 5}, mPhase);  

而DashPathEffect的第二个参数(phase)我称之为偏移值,动态改变其值会让路径产生动画的效果。

    @Override    protected void onDraw(Canvas canvas) {        super.onDraw(canvas);        // 把画布往下移动250        canvas.translate(0, 250);          /*         * 绘制路径         */        mPaint.setPathEffect(new DashPathEffect(new float[] {20, 10}, phase));        canvas.drawPath(mPath, mPaint);                // 改变偏移值        phase++;        // 重绘,产生动画效果        invalidate();    }

 

2.6 PathDashPathEffect

PathDashPathEffect和DashPathEffect是类似的,不同的是PathDashPathEffect可以让我们自己定义路径虚线的样式,比如我们将其换成一个个小圆组成的虚线:

    @Override    protected void onDraw(Canvas canvas) {        super.onDraw(canvas);        // 把画布往下移动250        canvas.translate(0, 250);          /*         * 绘制路径         */        Path path = new Path();          path.addCircle(0, 0, 3, Direction.CCW);          PathEffect pathEffect = new PathDashPathEffect(path, 12, phase, PathDashPathEffect.Style.ROTATE);                  mPaint.setPathEffect(pathEffect);        canvas.drawPath(mPath, mPaint);                // 改变偏移值        phase++;        // 重绘,产生动画效果        invalidate();    }

 

2.7 ComposePathEffect和SumPathEffect

ComposePathEffect和SumPathEffect都可以用来组合两种路径效果,就是把两种效果二合一。唯一不同的是组合的方式:

ComposePathEffect(PathEffect outerpe, PathEffect innerpe)会先将路径变成innerpe的效果,再去复合outerpe的路径效果,即:outerpe(innerpe(Path));

SumPathEffect(PathEffect first, PathEffect second)则会把两种路径效果加起来再作用于路径。

 

 

本文大部分内容来自:http://blog.csdn.net/aigestudio/article/details/41447349

本人对于原文做了删减和整理,代码均自己敲过。记录在此,仅作学习笔记之用。



0 0