paint_paintevent - CSDN
精华内容
参与话题
  • Paint的用法总结

    2019-02-28 12:52:05
    Paint的用法总结 上一期在总结canvas的用法时候谈到绘制需要的四个组件:一个保存像素的Bitmap,一个主持绘画操作的Canvas(往Bitmap写东西),一个绘制的基本元素(例如Rect,Path,Text,Btimap),一支画笔(用来...

    Paint的用法总结

    上一期在总结canvas的用法时候谈到绘制需要的四个组件:一个保存像素的Bitmap,一个主持绘画操作的Canvas(往Bitmap写东西),一个绘制的基本元素(例如Rect,Path,Text,Btimap),一支画笔(用来描述绘画的颜色与风格)。

    在上一期文章《关于Canvas的用法,这些都只是基操》里总结了canvas的一些用法,那么这次就来总结一下画笔Paint的一些用法。 还是一样的套路,先看看类描述:Paint是持有绘制几何图形、文字、位图等样式、颜色信息的类,那么总结下来可以大致描述,Paint是描述的绘制样式以及颜色信息的类。

    Paint关于颜色信息的描述

    canvas在绘制的时候颜色也不完全由paint决定,canvas在画颜色以及位图的时候,颜色画出来的跟paint的颜色不一致,因为canva在画颜色的时候,颜色信息是直接设置到参数里的,这个颜色由参数的色值来决定;在画bitmap的时候,bitmap中有相关的颜色信息,绘制出来的颜色由bitmap的颜色信息来决定;其余的绘制颜色就由paint来决定。

    Paint设置颜色

    Paint设置颜色有两个方法,setcolor以及setARGB跟canvas的绘制颜色一样,比较简单,另外paint还有一个setAlpha方法,这个是只设置alpha信息的

    Paint设置着色器

    Paint除了直接设置颜色,还可以通过setShader方法设置着色器,其实用过ps的都知道,着色器其实就是一种颜色填充方式,单一的颜色,也可以看做是纯色的着色器,如果设置了着色器,那么颜色填充方式就以着色器的颜色信息为准。使用着色器并不能直接使用Shader类,应该使用其子类:

    LinearGradient线性渐变

    /**
       *
       * @param x0       渐变线开始点的x坐标
       * @param y0       渐变线开始点的y坐标
       * @param x1       渐变线结束点的x坐标
       * @param y1       渐变线结束点的y坐标
       * @param color0   渐变线的起始颜色
       * @param color1   渐变线的结束颜色
       * @param tile     平铺的模式(需要填充的面积大于渐变的区间时的平铺模式)
    */
        val linearGradient = LinearGradient(0f, 0f, 200f, 200f, Color.RED, Color.BLUE, Shader.TileMode.MIRROR)
        mPaint.shader = linearGradient
        canvas?.drawText("kevinxieyeah", 5f, 200f, mPaint)
    复制代码

    还可以指定多个颜色的线性渐变

    /**
     *
     * @param x0          渐变线开始点的x坐标
     * @param y0          渐变线开始点的y坐标
     * @param x1          渐变线结束点的x坐标
     * @param y1          渐变线结束点的y坐标
     * @param colors      颜色的int数组
     * @param positions   位置的float数组
     * @param tile        平铺的模式(需要填充的面积大于渐变的区间时的平铺模式)
    */
    val linearGradient = LinearGradient(0f, 0f, 200f, 200f, intArrayOf(Color.RED, Color.BLUE, Color.GREEN), floatArrayOf(0f, 0.5f, 1f), Shader.TileMode.MIRROR)
    复制代码

    还有一个tile模式,我们指定三个值 MIRROR

    CLAMP
    REPEAT

    RadialGradient环形渐变

    /**
     *
     * @param centerX     渐变的中心点x坐标
     * @param centerY     渐变的中心点y坐标
     * @param radius      渐变的半径
     * @param centerColor 渐变的开始颜色
     * @param edgeColor   渐变的结束颜色
     * @param tileMode    填充模式
     */
    val radialGradient = RadialGradient(300f, 300f, 500f, Color.RED, Color.GREEN, Shader.TileMode.CLAMP)
    mPaint.shader = radialGradient
    canvas?.drawRect(Rect(0, 0, 1000, 1000), mPaint)
    复制代码

    环形渐变也可以指定多个颜色值,跟线性渐变类似,填充模式跟线性渐变也类似

    SweepGradient扫描渐变

    /**
     *
     * @param cx       渐变的中心点x坐标
     * @param cy       渐变的中心点y坐标
     * @param color0   渐变的开始颜色
     * @param color1   渐变的结束颜色
     */
    val sweepGradient = SweepGradient(300f, 300f, Color.RED, Color.GREEN)
    mPaint.shader = sweepGradient
    canvas?.drawRect(Rect(0, 0, 1000, 1000), mPaint)
    复制代码

    扫描渐变也可以指定多个颜色值,跟线性渐变类似,但是没有填充模式

    BitmapShader图片着色器

    /**
     * @param bitmap 要填充的bitmap
     * @param tileX x方向的填充模式
     * @param tileY y方向的填充模式
     */
    val bitmapShader = BitmapShader(bitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP)
    mPaint.shader = bitmapShader
    canvas?.drawRect(Rect(0, 0, 1000, 1000), mPaint)
    复制代码

    改变一下y方向的模式看看效果 REPEAT
    MIRROR

    ComposeShader组合着色器

    val bitmap = BitmapFactory.decodeResource(context.resources, R.mipmap.a)
    val bitmapShader = BitmapShader(bitmap, Shader.TileMode.CLAMP, Shader.TileMode.MIRROR)
    val radialGradient = RadialGradient(300f, 300f, 500f, Color.RED, Color.GREEN, Shader.TileMode.CLAMP)
    /**
     * @param shaderA  目标着色器
     * @param shaderB  源着色器
     * @param mode     混合模式
    */
    val composeShader = ComposeShader(bitmapShader, radialGradient, PorterDuff.Mode.LIGHTEN)
    mPaint.shader = composeShader
    canvas?.drawRect(Rect(0, 0, 1000, 1000), mPaint)
    复制代码

    顾名思义,把着色器混合着用,后面可以传PorterDuff.Mode和XferMode,XferMode其实就是对PorterDuff.Mode的封装,所以还是需要了解每一种混合模式之间的区别。

    PorterDuff.Mode

    混合模式我们对照图来达到我们需要的效果就可以了

    Paint设置ColorFilter

    为绘制的内容提供颜色过滤,他有三个子类LightingColorFilter、PorterDuffColorFilter、ColorMatrixColorFilter,还是逐一使用看看效果先

    LightingColorFilter

    是不是有一种无法预测结果的感觉?其实颜色混合都有其对应的算法去处理颜色,网上看到扔物线大神这个对LightingColorFilter的解释,LightingColorFilter 的构造方法是 LightingColorFilter(int mul, int add) ,参数里的 mul 和 add 都是和颜色值格式相同的 int 值,其中 mul 用来和目标像素相乘,add 用来和目标像素相加

    R' = R * mul.R / 0xff + add.R
    G' = G * mul.G / 0xff + add.G
    B' = B * mul.B / 0xff + add.B
    复制代码

    PorterDuffColorFilter

    val bitmap = BitmapFactory.decodeResource(context.resources, R.mipmap.a)
    mPaint.colorFilter = PorterDuffColorFilter(Color.RED, PorterDuff.Mode.DARKEN)
    canvas?.drawBitmap(bitmap, 50f, 50f, mPaint)
    复制代码

    PorterDuffColorFilter是使用一种特定的颜色对绘制的内容按照PorterDuff.Mode来进行处理

    ColorMatrixColorFilter

    还是借用扔物线大神的解释,ColorMatrixColorFilter 使用一个 ColorMatrix 来对颜色进行处理。 ColorMatrix 这个类,内部是一个 4x5 的矩阵

    [ a, b, c, d, e,
      f, g, h, i, j,
      k, l, m, n, o,
      p, q, r, s, t ]
    复制代码

    通过计算, ColorMatrix 可以把要绘制的像素进行转换。对于颜色 [R, G, B, A] ,转换算法是这样的:

    R’ = a*R + b*G + c*B + d*A + e;
    G’ = f*R + g*G + h*B + i*A + j;
    B’ = k*R + l*G + m*B + n*A + o;
    A’ = p*R + q*G + r*B + s*A + t;
    复制代码

    Paint设置XferMode

    setXfermode其实就是将你绘制的内容作为源图像与canvas已经存在的内容目标图像按照设置的模式进行混合,其实默认的模式是SRC_OVER,也就是像我们常见的后画的内容覆盖先画的内容。

    val xfermode = PorterDuffXfermode(PorterDuff.Mode.DST_OUT)
    canvas?.drawRect(Rect(300, 300, 800, 800), mPaint)
    mPaint.xfermode = xfermode
    mPaint.color = Color.RED
    canvas?.drawCircle(300f, 300f, 100f, mPaint)
    mPaint.xfermode = null
    复制代码

    出现了奇怪的效果,绘制的圆变成了黑色,没有达到我们预期的裁剪效果,解决方法是将设置XferMode的绘制单独放在一个图层,通过saveLayer可以避免奇怪的效果

    Paint关于样式的描述

    Paint的flag配置

    我们在创建paint的时候可以传递一个flag值,这些值对应的设置如下:

    • Paint.ANTI_ALIAS_FLAG :抗锯齿标志
    • Paint.FILTER_BITMAP_FLAG : 使位图过滤的位掩码标志
    • Paint.DITHER_FLAG : 使位图进行有利的抖动的位掩码标志
    • Paint.UNDERLINE_TEXT_FLAG : 下划线
    • Paint.STRIKE_THRU_TEXT_FLAG : 中划线
    • Paint.FAKE_BOLD_TEXT_FLAG : 加粗
    • Paint.LINEAR_TEXT_FLAG : 使文本平滑线性扩展的油漆标志
    • Paint.SUBPIXEL_TEXT_FLAG : 使文本的亚像素定位的绘图标志
    • Paint.EMBEDDED_BITMAP_TEXT_FLAG : 绘制文本时允许使用位图字体的绘图标志

    我们可以通过设置flag来给paint设置这些配置,也可以用一些专门的帮助方法,比如:setAntiAlias、setDither、setLinearText、setSubpixelText、setUnderlineText、setStrikeThruText、setFakeBoldText、setFilterBitmap,这些方法都是对以上flag的帮助设置,用哪种方法都可以。

    Paint的style

    paint可以通过setStyle(Style style)方法来设置style,Style用三种模式,FILL(填充)、STROKE(描边)、FILL_AND_STROKE(填充以及描边)

    val path = Path()
    path.lineTo(0f, 300f)
    path.lineTo(500f, 300f)
    path.lineTo(600f, 0f)
    canvas?.drawPath(path, mPaint)
    复制代码

    从上面两张图对比就可以看出填充和描边的区别,但是记住填充并不是一定要闭合的区间,因为一旦paint的style是填充,那么他会默认将path按照闭合区间来填充

    Paint的描边设置

    我们可以通过setStrokeWidth来设置描边的宽度,用setStrokeCap来设置线条两头的形状

    mPaint.strokeCap = Paint.Cap.BUTT
    canvas?.drawLine(100f, 100f, 500f, 100f, mPaint)
    mPaint.strokeCap = Paint.Cap.ROUND
    canvas?.drawLine(100f, 200f, 500f, 200f, mPaint)
    mPaint.strokeCap = Paint.Cap.SQUARE
    canvas?.drawLine(100f, 300f, 500f, 300f, mPaint)
    复制代码

    还可以通过setStrokeJoin来设置线条相交处的处理

    BEVEL

    ROUND
    MITER

    setStrokeMiter是对于 setStrokeJoin() 的一个补充,它用于设置 MITER 型拐角的延长线的最大值,夹角太小时,就会造成尖角过长时,自动改用 BEVEL 的方式来渲染连接点

    setPathEffect(PathEffect effect)是用来设置描边的效果,看一下有哪些子类

    我们来分别设置看看效果

    • DashPathEffect(floatArrayOf(10f, 10f, 20f, 20f), 0f),第一个参数 intervals 是一个数组,它指定了虚线的格式:数组中元素必须为偶数(最少是 2 个),按照(画线长度、空白长度、画线长度、空白长度)的顺序排列,第二个参数 phase 是虚线的偏移量。

    • PathDashPathEffect(path, 10f, 0f, PathDashPathEffect.Style.ROTATE)是使用指定的Path来绘制描边。

    • CornerPathEffect(30f)就是对路径进行圆角

    • DiscretePathEffect(5f, 5f)是把绘制改为使用定长的线段来拼接,并且在拼接的时候对路径进行随机偏离。segmentLength 是用来拼接的每个线段的长度, deviation 是偏离量。

    • SumPathEffect(dashPathEffect, cornerPathEffect)把两个效果直接叠加在一起

    • ComposePathEffect(dashPathEffect, cornerPathEffect)把两个效果直进行组合成一个新的效果

    Paint的色彩优化

    Paint 的色彩优化有两个方法: setDither(boolean dither) 和 setFilterBitmap(boolean filter) 。它们的作用都是让画面颜色变得更加自然。

    setDither设置抖动,在图像降低色彩深度绘制时,避免出现大片的色带与色块

    setFilterBitmap设置双线性过滤,图像在放大绘制的时候,默认使用的是最近邻插值过滤,这种算法简单,但会出现马赛克现象;而如果开启了双线性过滤,就可以让结果图像显得更加平滑。

    Paint的设置阴影

    mPaint.setShadowLayer(30f, 0f, 0f, Color.RED)
    canvas?.drawText("kevinxie", 50f, 300f, mPaint)
    复制代码

    Paint的设置遮罩过滤

    遮罩其实就是在图像上面附加一层遮盖物,可以使用setMaskFilter(MaskFilter maskfilter)来进行设置,MaskFilter有EmbossMaskFilter、BlurMaskFilter两个子类,我们来使用一下看看效果

    • BlurMaskFilter模糊效果

      四种模糊的style

    • EmbossMaskFilter浮雕效果,相对于之前的BlurMaskFilter来说,EmbossMaskFilter的可用性比较低,因为它实现的效果不是很霸气。正如其名,他可以实现一种类似浮雕的效果,说白了就是让你绘制的图像感觉像是从屏幕中“凸”起来更有立体感一样。

    上述两种效果已经过时,在4.0以上要看到效果需要关闭硬件加速

    恩,差不多,就到这里了!!!

    展开全文
  • Android Paint的使用详解

    万次阅读 多人点赞 2016-06-22 18:02:15
    自定义控件具有很强的灵活性,可以根据你的想法画出各种各样的图案,在Android中如果是自定义控件的话,Paint这个类用的还是较多的,这一篇就来简单介绍Paint这个类的使用,先来看一下这个类的注释/** * The Paint ...

    尊重原创,转载请标明出处    http://blog.csdn.net/abcdef314159

    自定义控件具有很强的灵活性,可以根据你的想法画出各种各样的图案,在Android中如果是自定义控件的话,Paint这个类用的还是较多的,这一篇就来简单介绍Paint这个类的使用,先来看一下这个类的注释

    /**
     * The Paint class holds the style and color information about how to draw
     * geometries, text and bitmaps.
     */
    这个类可以画几何图形,文本和bitmap。由于这个类的native方法和@hide方法比较多,这里就挑一些在工作中可能常用到的方法来讲解。先来看一下Paint的style,共有3种

    Paint.Style.FILL:填充内部
    Paint.Style.FILL_AND_STROKE  :填充内部和描边
    Paint.Style.STROKE  :描边

    我们看一下效果


    FILL_AND_STROKE和FILL区别不是很大。在看一下Cap,也有3种类型,主要是线条的末端,为了直观,下面三个线条我设置的比较粗,我们看一下效果


    我们看一下,其中两条竖线是三条线条的坐标的起始点和终止点,区别很明显。再来看看Join,也是有3种类型,我们看一下


    这个是画的矩形,连接的时候用到的,效果很明显,就不在解释。再看下一个Align,也是有3种类型,看名字大概也能猜的出来,不过还是要来验证一下


    OK,Paint的几种类型已经演示完了,下面主要来看一下他的方法。

    //重置Paint。
    reset()

    //设置一些标志,比如抗锯齿,下划线等等。

    setFlags(int flags)

    //设置抗锯齿,如果不设置,加载位图的时候可能会出现锯齿状的边界,如果设置,边界就会变的稍微有点模糊,锯齿就看不到了。

    setAntiAlias(boolean aa)

    //设置是否抖动,如果不设置感觉就会有一些僵硬的线条,如果设置图像就会看的更柔和一些,

    setDither(boolean dither)

    //这个是文本缓存,设置线性文本,如果设置为true就不需要缓存,

    setLinearText(boolean linearText)

    //设置亚像素,是对文本的一种优化设置,可以让文字看起来更加清晰明显,可以参考一下PC端的控制面板-外观和个性化-调整ClearType文本

    setSubpixelText(boolean subpixelText)

    //设置文本的下划线

    setUnderlineText(boolean underlineText)

    //设置文本的删除线

    setStrikeThruText(boolean strikeThruText)

    //设置文本粗体

    setFakeBoldText(boolean fakeBoldText)

    //对位图进行滤波处理,如果该项设置为true,则图像在动画进行中会滤掉对Bitmap图像的优化操作,加快显示 

    setFilterBitmap(boolean filter)

    //下面这几个就不用说了,上面已经演示过

    setStyle(Style style),setStrokeCap(Cap cap),setStrokeJoin(Join join),setTextAlign(Align align),

    //设置画笔颜色

    setColor(int color)

    //设置画笔的透明度[0-255],0是完全透明,255是完全不透明

    setAlpha(int a)

    //设置画笔颜色,argb形式alpha,red,green,blue每个范围都是[0-255],

    setARGB(int a, int r, int g, int b)

    //画笔样式为空心时,设置空心画笔的宽度

    setStrokeWidth(float width)

    //当style为Stroke或StrokeAndFill时设置连接处的倾斜度,这个值必须大于0,看一下演示结果

    setStrokeMiter(float miter)

    左上角的没有设置setStrokeMiter,右上角setStrokeMiter(2.3f),左下角setStrokeMiter(1.7f),右下角setStrokeMiter(0f)


    //这个没整明白具体干什么用的

    getFillPath(Path src, Path dst)

    //设置着色器,用来给图像着色的,绘制出各种渐变效果,有BitmapShader,ComposeShader,LinearGradient,RadialGradient,SweepGradient几种,这个以后再单独讲

    setShader(Shader shader)

    //设置画笔颜色过滤器,有ColorMatrixColorFilter,LightingColorFilter,PorterDuffColorFilter几种,这个以后再单独分析

    setColorFilter(ColorFilter filter)

    //设置图形重叠时的显示方式,下面来演示一下

    setXfermode(Xfermode xfermode)

    下面是我运行目录D:\Android\adt-bundle-windows\sdk\samples\android-20\legacy\ApiDemos\src\com\example\android\apis\graphics\Xfermodes类的结果


    总共有16种重叠模式,而Mode类中显示的总共有18种,下面是我自己写的一个,只有绿色和红色两种图片(没有黑色),先画的是绿色,后画的是红色,和上面有很大差距,不知道什么原因,有时间得好好研究一下


    //设置绘制路径的效果,有ComposePathEffect,CornerPathEffect,DashPathEffect,DiscretePathEffect,PathDashPathEffect,SumPathEffect几种,以后在单独分析

    setPathEffect(PathEffect effect)

    //对图像进行一定的处理,实现滤镜的效果,如滤化,立体等,有BlurMaskFilter,EmbossMaskFilter几种

    setMaskFilter(MaskFilter maskfilter)

    //设置字体样式,可以是Typeface设置的样式,也可以通过Typeface的createFromAsset(AssetManager mgr, String path)方法加载样式

    setTypeface(Typeface typeface)

    //设置阴影效果,radius为阴影角度,dx和dy为阴影在x轴和y轴上的距离,color为阴影的颜色 ,看一下演示效果,其中第一个是没有阴影的,第二个设置了黑色的阴影

    setShadowLayer(float radius, float dx, float dy, int shadowColor)


    //设置地理位置,比如显示中文,日文,韩文等,默认的显示Locale.getDefault()即可,

    setTextLocale(Locale locale)

    //设置优雅的文字高度,这个设置可能会对FontMetrics产生影响

    setElegantTextHeight(boolean elegant)

    //设置字体大小

    setTextSize(float textSize)

    //设置字体的水平方向的缩放因子,默认值为1,大于1时会沿X轴水平放大,小于1时会沿X轴水平缩小

    setTextScaleX(float scaleX)

    //设置文本在水平方向上的倾斜,默认值为0,推荐的值为-0.25,

    setTextSkewX(float skewX)

    //设置行的间距,默认值是0,负值行间距会收缩

    setLetterSpacing(float letterSpacing)

    //设置字体样式,可以设置CSS样式

    setFontFeatureSettings(String settings)

    //这个Paint的静态内部类,主要用于字体的高度,以后再分析

    FontMetrics

    //下面几个就是测量字体的长度了

    measureText(char[] text, int index, int count),measureText(String text, int start, int end),measureText(String text),measureText(CharSequence text, int start, int end)

    //下面这几个就是剪切显示,就是大于maxWidth的时候只截取指定长度的显示

    breakText(char[] text, int index, int count,float maxWidth, float[] measuredWidth),breakText(CharSequence text, int start, int end,boolean measureForwards,  floatmaxWidth, float[] measuredWidth),breakText(String text, boolean measureForwards,float maxWidth, float[] measuredWidth)

    //提取指定范围内的字符串,保存到widths中,

    getTextWidths(char[] text, int index, int count,float[] widths),getTextWidths(CharSequence text, int start, int end, float[] widths),getTextWidths(String text, int start, int end, float[] widths),getTextWidths(String text, float[] widths)

    //获取文本绘制的路径,提取到Path中,

    getTextPath(char[] text, int index, int count, float x, float y, Path path),getTextPath(String text, int start, int end, float x, float y, Path path)

    //得到文本的边界,上下左右,提取到bounds中,可以通过这计算文本的宽和高

    getTextBounds(String text, int start, int end, Rect bounds) ,getTextBounds(char[] text, int index, int count, Rect bounds)

    OK,剩下的一些就是@hide或是native,或者是get方法,这里就不在一一叙述。


    展开全文
  • Paint基本用法

    千次阅读 2017-06-01 10:53:32
    Paint基本使用: Paint基本的方法主要可以抽象成两大类:   1.1 负责设置获取图形绘制、路径相关的 1.setStyle(Paint.Style style)  设置画笔样式,取值有 Paint.Style.FILL :填充内部 Paint.Style.FILL_...

    Paint基本使用:

    Paint基本的方法主要可以抽象成两大类:  

    1.1 负责设置获取图形绘制、路径相关的
    1.setStyle(Paint.Style style) 
    设置画笔样式,取值有
    Paint.Style.FILL :填充内部
    Paint.Style.FILL_AND_STROKE :填充内部和描边
    Paint.Style.STROKE :仅描边、
    注意STROKE、FILL_OR_STROKE与FILL模式下外轮廓的位置会扩大。
    2.setStrokeWidth(float width) 
    设置画笔宽度 
    3.setAntiAlias(boolean aa) 
    设置画笔是否抗锯齿 
    4.setStrokeCap(Paint.Cap cap) ------demo演示 
    设置线冒样式,取值有Cap.ROUND(圆形线冒)、Cap.SQUARE(方形线冒)、Paint.Cap.BUTT(无线冒) 
    注意:冒多出来的那块区域就是线帽!就相当于给原来的直线加上一个帽子一样,所以叫线帽 

    5.setStrokeJoin(Paint.Join join) ------ demo演示
    设置线段连接处样式,取值有:Join.MITER(结合处为锐角)、Join.Round(结合处为圆弧)、Join.BEVEL(结合处为直线) 

    6.setStrokeMiter(float miter) 
    设置笔画的倾斜度,90度拿画笔与30拿画笔,画出来的线条样式肯定是不一样的吧。(事实证明,根本看不出来什么区别好吗……囧……)


    void reset() 
    清空画笔复位。


    void set(Paint src) 
    设置一个外来Paint画笔。


    7.void setARGB(int a, int r, int g, int b) 
    int getAlpha() 
    void setAlpha(int a) 
    int getColor() 
    void setColor(int color) 
    获取与设置alpha值、颜色、ARGB等。


    final boolean isAntiAlias() 
    8.void setAntiAlias(boolean aa) 
    获取与设置是否使用抗锯齿功能,会消耗较大资源,绘制图形速度会变慢,一般会开启。设置后会平滑一些;


    final boolean isDither() 
    9.void setDither(boolean dither) 
    获取与设定是否使用图像抖动处理,会使绘制出来的图片颜色更加平滑和饱满、图像更加清晰。

    10.setPathEffect(PathEffect effect);   
    * 设置绘制路径的效果,如点画线等 
    (1)、CornerPathEffect——圆形拐角效果 
    paint.setPathEffect(new CornerPathEffect(100));
    利用半径R=50的圆来代替原来两条直线间的夹角
    (2)、DashPathEffect——虚线效果 

    //画同一条线段,偏移值为15  
    paint.setPathEffect(new DashPathEffect(new float[]{20,10,50,100},15));

    intervals[]:表示组成虚线的各个线段的长度;整条虚线就是由intervals[]中这些基本线段循环组成的。比如,我们定义new float[] {20,10};那这个虚线段

    就是由两段线段组成的,第一个可见的线段长为20,每二个线段不可见,长度为10;

    phase:

    开始绘制的偏移值 

    .....

    11.setXfermode(Xfermode xfermode);   
    设置图形重叠时的处理方式,如合并,取交集或并集,经常用来制作橡皮的擦除效果

    12.setMaskFilter(MaskFilter maskfilter);   
    设置MaskFilter,可以用不同的MaskFilter实现滤镜的效果,如滤化,立体等 

    13.setColorFilter(ColorFilter colorfilter);   
    设置颜色过滤器,可以在绘制颜色时实现不用颜色的变换效果
    14.setShader(Shader shader);   
    设置图像效果,使用Shader可以绘制出各种渐变效果   
           
    15.setShadowLayer(float radius ,float dx,float dy,int color);   
    在图形下面设置阴影层,产生阴影效果,radius为阴影的角度,dx和dy为阴影在x轴和y轴上的距离,color为阴影的颜色  



    1.2 负责设置获取文字相关的
    自定义控件之绘图篇(二):路径及文字 
    http://blog.csdn.net/harvic880925/article/details/38926877

    float getFontSpacing() 
    获取字符行间距。
    float getLetterSpacing() 
    void setLetterSpacing(float letterSpacing) 
    设置和获取字符间距

    final boolean isUnderlineText() 
    void setUnderlineText(boolean underlineText) 
    是否有下划线和设置下划线。
    final boolean isStrikeThruText() 
    void setStrikeThruText(boolean strikeThruText) 
    获取与设置是否有文本删除线。

    float getTextSize() 
    void setTextSize(float textSize) 
    获取与设置文字大小,注意:Paint.setTextSize传入的单位是px,TextView.setTextSize传入的单位是sp,注意使用时不同分辨率处理问题。

    Typeface getTypeface() 
    Typeface setTypeface(Typeface typeface) 
    获取与设置字体类型。Android默认有四种字体样式:BOLD(加粗)、BOLD_ITALIC(加粗并倾斜)、ITALIC(倾斜)、NORMAL(正常),我们也可以通过Typeface类 来自定义个性化字体。

    float getTextSkewX() 
    void setTextSkewX(float skewX) 
    获取与设置文字倾斜,参数没有具体范围,官方推荐值为-0.25,值为负则右倾,为正则左倾,默认值为0。

    Paint.Align getTextAlign() 
    void setTextAlign(Paint.Align align) 
    获取与设置文本对齐方式,取值为CENTER、LEFT、RIGHT,也就是文字绘制是左边对齐、右边还是局中的。


    setSubpixelText(boolean subpixelText)
    固定的几个范围:320*480,480*800,720*1280,1080*1920等等;那么如何在同样的分辨率的显示器中增强显示清晰度呢?
    亚像素的概念就油然而生了,亚像素就是把两个相邻的两个像素之间的距离再细分,再插入一些像素,这些通过程序加入的像素就是亚像素。在两个像素间插 入的像素个数是通过程序计算出来的,一般是插入两个、三个或四个。

    所以打开亚像素显示,是可以在增强文本显示清晰度的,但由于插入亚像素是通过程序计算而来的,所以会耗费一定的计算机性能。


    int breakText(String text, boolean measureForwards, float maxWidth, float[] measuredWidth) 

    比如文本阅读器的翻页效果,我们需要在翻页的时候动态折断或生成一行字符串,这就派上用场了~


    计算指定参数长度能显示多少个字符,同时可以获取指定参数下可显示字符的真实长度,譬如:

    private static final String STR = "看风景Beijing";
    mPaint.setTextSize(50);
    float[] value = new float[1];
    int ret = mPaint.breakText(STR, true, 200, value);
    Log.i("YYYY", "breakText="+ret+", STR="+STR.length()+", value="+value[1]);
    //breakText=5, STR=8, value=195.0


    void getTextBounds(char[] text, int index, int count, Rect bounds) 
    void getTextBounds(String text, int start, int end, Rect bounds) 
    获取文本的宽高,通过bounds的Rect拿到整型。


    float measureText(String text) 
    float measureText(CharSequence text, int start, int end) 
    float measureText(String text, int start, int end) 
    float measureText(char[] text, int index, int count) 
    粗略获取文本的宽度,和上面的getTextBounds比较类似,返回浮点数。


    int getTextWidths(String text, int start, int end, float[] widths) 
    int getTextWidths(String text, float[] widths) 
    int getTextWidths(CharSequence text, int start, int end, float[] widths) 
    int getTextWidths(char[] text, int index, int count, float[] widths) 

    精确计算文字宽度,与上面两个类似。

    展开全文
  • 在自定义View中,这两个Paint.setAntiAlias()和Paint.setDither()方法用的很多,都只有一个boolean值,作用大家未必清楚,今天抽了点时间研究下,终于搞清楚了,希望给大家点帮助!Paint.setAntiAlias()该方法作用是...

    在自定义View中,这两个Paint.setAntiAlias()和Paint.setDither()方法用的很多,都只有一个boolean值,作用大家未必清楚,今天抽了点时间研究下,终于搞清楚了,希望给大家点帮助!

    Paint.setAntiAlias()

    该方法作用是抗锯齿,什么意思呢,我们看下效果图,就知道了
    Paint.setAntiAlias()的作用
    左边是没有这只抗锯齿的,右边是设置了抗锯齿的,边界明显变模糊了。

    Paint.setDither()

    该方法是设置防抖动。
    我们先看下没有设置防抖动的绘制出来的图
    Paint.setDither()方法的作用
    然后我们看下设置了防抖动的绘制出来的图
    Paint.setDither()方法的作用
    第二个是不是比第一个图柔和点,这就是防抖动的效果。
    大家是不是对这两个方法的作用一目了然了!!!

    展开全文
  • Paint 全面解析

    千次阅读 2017-06-22 14:15:12
    paint的方法分为两类:负责图形绘制、路径相关setStrokeWidth(float width)设置画笔宽度setStyle(Paint.Style style)设置画笔样式 Style有三类: Paint.Style.FILL :填充内部 Paint.Style.FILL_AND_STROKE :填充...
  • Android Paint Style

    万次阅读 多人点赞 2016-03-20 14:56:44
    Paint.Style.STROKE 只绘制图形轮廓(描边) Paint.Style.FILL 只绘制图形内容 Paint.Style.FILL_AND_STROKE 既绘制轮廓也绘制内容看一下绘制文字的效果图: STROKE和FILL_AND_STROKE的粗细是一样的,FILL最细
  • Paint.setFlags中flag意义及使用方法

    千次阅读 2018-01-11 16:08:32
    Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG); 第二种: Paint paint = new Paint(); paint.setFlags(Paint.ANTI_ALIAS_FLAG); 几种Flag意义 Paint.ANTI_ALIAS_FLAG :抗锯齿标志 Paint.FILTER_BIT
  • 菜鸟学android——paint画虚线的问题

    万次阅读 2014-07-22 14:36:12
    看了网上很多答案,教
  • Canvas:void drawRect(RectF rect, Paint paint) //绘制区域,参数一为RectF一个区域 void drawPath(Path path, Paint paint) //绘制一个路径,参数一为Path路径对象 void drawBitmap(Bitmap bitmap, Rect src, ...
  • Paint画笔及Color

    万次阅读 2012-09-18 17:24:48
    Paint paint = new Paint(); // 设置paint为无锯齿 paint.setAntiAlias(true); // 设置颜色 paint.setColor(Color.RED); // 设置颜色 paint.setColor(Color.rgb(255, 0, 0)); // 设置透明度 paint.setAlpha(256); //...
  • Android 游戏开发之paint画笔

    千次阅读 2012-10-30 16:56:02
    paint画笔的一些方法和应用 canvas = sfh.lockCanvas(); if (canvas != null) { canvas.drawColor(Color.WHITE); //-----设置画笔无锯齿 Paint paint1 = new Paint(); canvas.drawCircle(40, 30, 20, ...
  • Paint X for Mac破解教程

    万次阅读 2019-02-15 11:40:46
    Paint X for Mac(时尚绘图工具) 还在寻找一款专业的绘图工具吗?Paint X for Mac破解版以绘制、着色、编辑图片为主。可以像使用数位板一样使用Paint X制作简单的图片、创意项目、或者将文本和设计添加到您的其他...
  • android paint的抗锯齿效果

    万次阅读 2015-07-14 11:18:05
    前几天在做公司需求的时候用到自定义textview的功能。主要是判断textview在显示完文字之后还有没有足够的空间用来显示一些图片和其他的文字,这里其他的文字是使用cavans.drawtext函数直接draw在textview上的。...
  • 前言:我最近想抽空研究研究android的各种特效,android的特效真是其它平台无法比拟的,而且一个漂亮的UI交互,会给APP增色不少,而学习特效之前,有关graphics绘图的基础知识是必不可少的,下面就分几篇对涉及到的...
  • Android Canvas drawText实现中文垂直居中

    万次阅读 多人点赞 2015-10-27 11:55:45
    目标: 把中文字符绘制到目标矩形的居中位置。 问题: Android的Canvas绘图,drawText里的origin是以baseline为基准的,直接以目标矩形的bottom传进drawText,字符位置会偏下。这样写代码: @Override ...
  • paint设置颜色的问题。

    千次阅读 2011-09-04 19:31:47
    http://da-en.iteye.com/blog/669661 需求: 在屏幕上画text,需要字体为蓝色,并且要有半透明效果 思路: 使用Canvas.drawText() 。 先看下面代码: protected void onDraw(Canvas
  • Paint之setAlpha方法

    万次阅读 2014-07-02 15:33:53
    setAlpha方法:设置透明度 该方法用于设置画笔的透明度,直观上表现为颜色变淡,具有一定的透明效果。该方法经常用于一些图片重叠或者特效显示的场合。
  • Android用Paint计算文字宽度

    万次阅读 2013-08-21 17:05:08
    在Android的UI开发中,如果使用xml的方式来配置layout的话,我们可以很方便地实现不同分辨率的兼容性问题(使用dip的单位来实现).但是,如果在游戏游戏的时候,不能用xml来配置layout,这时候我们去兼容不同分辨率时就会...
  • Paint 去掉锯齿 使用 Style.FILL_AND_STROKE

    千次阅读 2011-02-17 12:14:00
     //消除锯齿 paint.setFlags(Paint.ANTI_ALIAS_FLAG)
  • Android 2D绘图解析之 Canvas,Paint

    万次阅读 多人点赞 2016-05-31 16:15:32
    【Android 2D绘图解析】系列文章将全面介绍Android绘图相关,这是第一篇,简单介绍下如何利用Android API进行一些简单图形的绘制,绘图的前提是需要继承自View,然后重写它的onDraw(Canvas canvas) 方法即可。...
1 2 3 4 5 ... 20
收藏数 143,070
精华内容 57,228
关键字:

paint