精华内容
参与话题
问答
  • Paint

    千次阅读 2015-12-31 15:12:43
    API—Paint | Android 开发者 Paint即画笔,用于设置绘制风格,如:线宽(笔触粗细),颜色,透明度和填充风格等, 大体上可以分为两类,一类与图形绘制相关,一类与文本绘制相关。 嵌套类 Paint.Align ,设置字符位置,...

    Paint即画笔,用于设置绘制风格,如:线宽(笔触粗细),颜色,透明度和填充风格等,
    大体上可以分为两类,一类与图形绘制相关,一类与文本绘制相关。

    1.图形绘制

    setARGB(int a,int r,int g,int b) 设置绘制的颜色,a代表透明度,r,g,b代表颜色值 这个不多说了,还有两个类似的方法,将设置alpha和rgb分割开来了。注意的是这里的a值是0~255的范围,不是小数。
    setAlpha(int a) 设置绘制图形的透明度
    setColor(int color) 设置绘制的颜色,使用颜色值来表示,该颜色值包括透明度和RGB颜色。
    setAntiAlias(boolean aa) 设置是否使用抗锯齿功能,会消耗较大资源,绘制图形速度会变慢。
    setDither(boolean dither) 设定是否使用图像抖动处理,会使绘制出来的图片颜色更加平滑和饱满,图像更加清晰
    setFilterBitmap(boolean filter) 如果该项设置为true,则图像在动画进行中会滤掉对Bitmap图像的优化操作,加快显示速度,本设置项依赖于ditherxfermode的设置
    setMaskFilter(MaskFilter maskfilter) 设置MaskFilter,可以用不同的MaskFilter实现滤镜的效果,如滤化,立体等 MaskFilter 介绍
    setColorFilter(ColorFilter colorfilter) 设置颜色过滤器,可以在绘制颜色时实现不用颜色的变换效果 这个方法也值得试验一下:MaskFilter是对一个Paintalpha通道的转换,而ColorFilter则是对每一个RGB通道应用转换。所有由ColorFilter所派生的类在执行它们的转换时,都会忽略alpha通道。这个貌似比较麻烦,改天再说
    setPathEffect(PathEffect effect) 设置绘制路径的效果,如点画线等 又是一个很好玩的方法:到目前为止,所有的效应都会影响到Paint填充图像的方式;PathEffect是用来控制绘制轮廓(线条)的方式。PathEffect对于绘制Path基本图形特别有用,但是它们也可以应用到任何Paint中从而影响线条绘制的方式。使用PathEffect,可以改变一个形状的边角的外观并且控制轮廓的外表。Android包含了多个PathEffect,包括:1)CornerPathEffect 可以使用圆角来代替尖锐的角从而对基本图形的形状尖锐的边角进行平滑。2)DashPathEffect 可以使用DashPathEffect来创建一个虚线的轮廓(短横线/小圆点),而不是使用实线。你还可以指定任意的虚/实线段的重复模式。3) DiscretePathEffectDashPathEffect相似,但是添加了随机性。当绘制它的时候,需要指定每一段的长度和与原始路径的偏离度。4)PathDashPathEffect 这种效果可以定义一个新的形状(路径)并将其用作原始路径的轮廓标记。下面的效果可以在一个Paint中组合使用多个PathEffect。1)SumPathEffect 顺序地在一条路径中添加两种效果,这样每一种效果都可以应用到原始路径中,而且两种结果可以结合起来。2)ComposePathEffect 将两种效果组合起来应用,先使用第一种效果,然后在这种效果的基础上应用第二种效果。对象形状的PathEffect的改变会影响到形状的区域。这就能够保证应用到相同形状的填充效果将会绘制到新的边界中。使用setPathEffect方法可以把PathEffect应用到Paint对象中,如下所示:1 paint.setPathEffect(new CornerPathEffect(10));其他效果懒得测试了,这个在模拟器上跑的时候效果也不明显,但是真机上跑的时候的确圆滑了许多,看上去很舒服
    setShader(Shader shader) 设置图像效果,使用Shader可以绘制出各种渐变效果
    setShadowLayer(float radius ,float dx,float dy,int color) 在图形下面设置阴影层,产生阴影效果 radius为阴影的角度,dxdy为阴影在x轴和y轴上的距离,color为阴影的颜色
    setStyle(Paint.Style style) 设置画笔的样式,为FILL,FILL_OR_STROKE,或STROKE
    setStrokeCap(Paint.Cap cap) 当画笔样式为STROKEFILL_OR_STROKE时,设置笔刷的图形样式,如圆形样式Cap.ROUND,或方形样式Cap.SQUARE
    setSrokeJoin(Paint.Join join) 设置绘制时各图形的结合方式,如平滑效果等
    setStrokeWidth(float width) 当画笔样式为STROKEFILL_OR_STROKE时,设置笔刷的粗细度 ,单位为px
    setXfermode(Xfermode xfermode) 设置图形重叠时的处理方式,如合并,取交集或并集,经常用来制作橡皮的擦除效果 Xfermode 介绍

    2.文字绘制

    setFakeBoldText(boolean fakeBoldText) 模拟实现粗体文字,设置在小字体上效果会非常差
    setSubpixelText(boolean subpixelText) 设置该项为true,将有助于文本在LCD屏幕上的显示效果
    setTextAlign(Paint.Align align) 设置绘制文字的对齐方向
    setTextScaleX(float scaleX) 设置绘制文字x轴的缩放比例,可以实现文字的拉伸的效果
    setTextSize(float textSize) 设置绘制文字的字号大小,单位为px
    setTextSkewX(float skewX) 设置斜体文字,skewX为倾斜弧度
    setTypeface(Typeface typeface) 设置Typeface对象,即字体风格,包括粗体,斜体以及衬线体,非衬线体等
    setUnderlineText(boolean underlineText) 设置带有下划线的文字效果
    setStrikeThruText(boolean strikeThruText) 设置带有删除线的效果

    嵌套类

    1. Paint.Align ,设置字符位置,字符以坐标(x,y)为源点。
    2. Paint.Cap,线段断点形状(默认Paint.Cap.BUTT):
    3. Paint.FontMetrics,字体属性及测量。
      如需详细了解,请参考:
      Paint—FontMetrics - qq_20198405的博客 - 博客频道 - CSDN.NET
    4. Paint.FontMetricsInt
    5. Paint.Join,设置结合处的样子。
    6. Paint.Style,设置空心(默认Paint.Style.FILL);

    常量

    标记 说明
    ANTI_ALIAS_FLAG 抗锯齿的标志
    DEV_KERN_TEXT_FLAG
    DITHER_FLAG 使位图进行有利的抖动的位掩码标志
    FAKE_BOLD_TEXT_FLAG 文本仿粗体的标志
    FILTER_BITMAP_FLAG 使位图过滤的位掩码标志
    HINTING_OFF
    HINTING_ON
    LINEAR_TEXT_FLAG
    STRIKE_THRU_TEXT_FLAG 文本删除线的标志
    SUBPIXEL_TEXT_FLAG
    UNDERLINE_TEXT_FLAG 文字的下划线的标志

    构造方法

    Paint的构造方法有两种:

    Paint()Paint(int flags)Paint(Paint paint)

    setXXX()方法族:

    • set(Paint src):
      为当前画笔设置一个画笔,说白了就是把另一个画笔的属性设置Copy给我们的画笔。
    • setARGB(int a, int r, int g, int b):
      设置绘制的颜色,a代表透明度,r,g,b代表颜色值。
    • setAlpha(int a):
      设置绘制图形的透明度,设置范围是[0..255]。
    • setAntiAlias(boolean aa):
      消除锯齿(默认不消除锯齿)。
      不消除锯齿:
      这里写图片描述
      消除锯齿:
      这里写图片描述
    • setColor(int color):
      设置画笔颜色。
    • setColorFilter(ColorFilter filter):
      设置颜色过滤,这个方法需要我们传入一个ColorFilter参数同样也会返回一个ColorFilter实例。 如需详细了解,请参考:
      Paint—ColorFilter - qq_20198405的博客 - 博客频道 - CSDN.NET

    • setDither(boolean dither):
      设定是否使用图像抖动处理,会使绘制出来的图片颜色更加平滑和饱满,图像更加清晰
      这玩意用来设置我们在绘制图像时的抗抖动,也称为递色,那什么叫抗抖动呢?在Android中我确实不好拿出一个明显的例子,我就在PS里模拟说明一下:
      这里写图片描述
      大家看到的这张七彩渐变图是一张RGB565模式下图片,即便图片不是很大我们依然可以很清晰地看到在两种颜色交接的地方有一些色块之类的东西感觉很不柔和,因为在RGB模式下只能显示2^16=65535种色彩,因此很多丰富的色彩变化无法呈现,而Android呢为我们提供了抗抖动这么一个方法,它会将相邻像素之间颜色值进行一种“中和”以呈现一个更细腻的过渡色:
      这里写图片描述
      放大来看,其在很多相邻像素之间插入了一个“中间值”:
      这里写图片描述
      抗抖动不是Android的专利,是图形图像领域的一种解决位图精度的技术。

    • setFakeBoldText(boolean fakeBoldText):
      设置文本仿粗体。注意设置在小字体上效果会非常差。
    • setFilterBitmap(boolean filter):
      如果该项设置为true,则图像在动画进行中会滤掉对Bitmap图像的优化操作,加快显示速度,本设置项依赖于dither和xfermode的设置。
    • setFlags(int flags):
      设置标志,还是对paint进行样式的设置。比如
     // 实例化画笔并打开抗锯齿
    mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
    • setHinting(int mode):
      设置画笔的隐藏模式。可以是 HINTING_OFF or HINTING_ON之一。
    • setLinearText(boolean linearText):
      设置是否打开线性文本标识,这玩意对大多数人来说都很奇怪不知道这玩意什么意思。想要明白这东西你要先知道文本在Android中是如何进行存储和计算的。在Android中文本的绘制需要使用一个bitmap作为单个字符的缓存,既然是缓存必定要使用一定的空间,我们可以通过setLinearText (true)告诉Android我们不需要这样的文本缓存。
    • setMaskFilter(MaskFilter maskfilter):
      这个方法可以用来对图像进行一定的处理,实现滤镜的效果,如滤化,立体等。 如需详细了解,请参考:
      Paint—MaskFilter(面具) - qq_20198405的博客 - 博客频道 - CSDN.NET

    • setPathEffect(PathEffect effect):设置绘制路径时的路径效果(ComposePathEffect, CornerPathEffect, DashPathEffect, DiscretePathEffect, PathDashPathEffect, SumPathEffect),如点画线等 。 如需详细了解,请参考:
      Paint—PathEffect(路径效果) - qq_20198405的博客 - 博客频道 - CSDN.NET

    • setRasterizer(Rasterizer rasterizer):
      设置光栅,光栅这东西涉及太多太多物理知识。该方法同样不支持HW在API 21中被遗弃了,所以不推荐使用。
    • setShader(Shader shader):
      设置画笔的填充效果(BitmapShader, ComposeShader, LinearGradient, RadialGradient, SweepGradient),使用Shader可以绘制出各种渐变效果。如需详细了解,请参考:
      Paint—Shader - qq_20198405的博客 - 博客频道 - CSDN.NET
    • setShadowLayer(float radius, float dx, float dy, int color):
      radius表示阴影的扩散半径;dx和dy表示阴影平面上的偏移值;shadowColor就不说了阴影颜色。
      注意: 这个方法不支持硬件加速,所以我们要测试时必须先关闭硬件加速。
    • setStrikeThruText(boolean strikeThruText):
      设置文本删除线。
    • setStrokeCap(Paint.Cap cap):
      设置线段断点形状(默认Paint.Cap.BUTT)
      Paint.Cap.BUTT : 不多不少
      这里写图片描述
      Paint.Cap.ROUND : 多了一个圆头
      这里写图片描述
      Paint.Cap.SQUARE:多了一个方头
      这里写图片描述
    • setStrokeJoin(Paint.Join join):
      设置画笔转弯处的连接风格(BEVEL-直线、MITER -锐角、ROUND-圆弧 )。
    • setStrokeMiter(float miter):
      设置画笔倾斜度。
    • setStrokeWidth(float width):
      当画笔样式为STROKE或FILL_OR_STROKE时,设置笔刷的粗细度。
    • setStyle(Paint.Style style):
      设置空心(默认Paint.Style.FILL)
      Paint.Style.FILL :填充内部
      这里写图片描述
      Paint.Style.STROKE :仅描边
      这里写图片描述
      Paint.Style.FILL_AND_STROKE :填充内部和描边
      这里写图片描述
      再来一张更详细的图:
      这里写图片描述
    • setSubpixelText(boolean subpixelText):
      设置自像素。如果该项为true,将有助于文本在LCD屏幕上的显示效果。
    • setTextAlign(Paint.Align align):
      设置字符位置,字符以坐标(x,y)为源点。

    center表示字符在水平方向上以x中心向左右两边延伸,在垂直方向以y为起点向下延伸;
    left表示字符在水平方向上以x为起点向右延伸,在垂直方向上以y为起点向下延伸;
    right表示字符在水平方向上以x为起点向左延伸,在垂直方向上以y为起点向下延伸。
    这里写图片描述

    • setTextLocale(Locale locale):
      设置地理位置,这里如果你要使用,直接传入Locale.getDefault()即可。它用来设置文本的区域比如中文、日文等。
    • setTextScaleX(float scaleX):
      设置绘制文字x轴的缩放比例,可以实现文字的拉伸的效果。
    • setTextSize(float textSize):
      设置绘制文字的字号大小。
    • setTextSkewX(float skewX):
      设置斜体文字,skewX为倾斜弧度。这个倾斜值没有具体的范围,但是官方推崇的值为-0.25可以得到比较好的倾斜文本效果,值为负右倾值为正左倾,默认值为0。
    • setTypeface(Typeface typeface):
      设置字体类型和样式,上面我们也使用过,Android中字体有四种样式:BOLD(加粗),BOLD_ITALIC(加粗并倾斜),ITALIC(倾斜),NORMAL(正常);而其为我们提供的字体有五种:DEFAULT,DEFAULT_BOLD,MONOSPACE,SANS_SERIFSERIF,这些什么类型啊、字体啊之类的都很简单大家自己去试试就知道就不多说了。 如需详细了解,请参考:
      Paint—Typeface - qq_20198405的博客 - 博客频道 - CSDN.NET
    • setUnderlineText(boolean underlineText):
      设置文字的下划线。
    • setXfermode(Xfermode xfermode):
      设置图像的混合模式,详细使用方式请参考:
      Paint—PorterDuffXfermode - qq_20198405的博客 - 博客频道 - CSDN.NET
      Paint—Xfermode、 PixelXorXfermode - qq_20198405的博客 - 博客频道 - CSDN.NET

    getXXX()方法族:

    • getAlpha()
    • getColor()
    • getColorFilter()
    • getFillPath(Path src, Path dst)
    • getFlags()
    • getFontMetrics(Paint.FontMetrics metrics):
      这个和我们之前用到的getFontMetrics()相比多了个参数,getFontMetrics()返回的是FontMetrics对象,而getFontMetrics(Paint.FontMetrics metrics)返回的是文本的行间距,如果metrics的值不为空则返回FontMetrics对象的值。
    • getFontMetrics():得到一个FontMetrics对象,返回对象中的参数都是float。
    • getFontMetricsInt():返回对象中的参数都是int。
    • getFontMetricsInt(Paint.FontMetricsInt fmi)
    • getFontSpacing():返回字符行间距。
    • getHinting()
    • getMaskFilter()
    • getPathEffect()
    • getRasterizer()
    • getShader()
    • getStrokeCap()
    • getStrokeJoin()
    • getStrokeMiter()
    • getStrokeWidth()
    • getStyle()
    • getTextAlign()
    • getTextBounds(char[] text, int index, int count, Rect bounds)
    • getTextBounds(String text, int start, int end, Rect bounds)
    • getTextLocale()
    • getTextPath(String text, int start, int end, float x, float y, Path path)
    • getTextPath(char[] text, int index, int count, float x, float y, Path path)
    • getTextScaleX()
    • getTextSize()
    • getTextSkewX()
    • getTextWidths(String text, float[] widths)
    • getTextWidths(CharSequence text, int start, int end, float[] widths)
    • getTextWidths(String text, int start, int end, float[] widths)
    • getTextWidths(char[] text, int index, int count, float[] widths)
    • getTypeface()
    • getXfermode()

    isXXX()方法族:

    • isAntiAlias()
    • isDither()
    • isFakeBoldText()
    • isFilterBitmap()
    • isLinearText()
    • isStrikeThruText()
    • isSubpixelText()
    • isUnderlineText()

    其他方法:

    • ascent():返回上坡度的值。
    • descent():返回下坡度的值。
    • clearShadowLayer()

    • breakText(CharSequence text, int start, int end, boolean
      measureForwards, float maxWidth, float[] measuredWidth)

    • breakText(String text, boolean measureForwards, float maxWidth,
      float[] measuredWidth)
    • breakText(char[] text, int index, int count, float maxWidth, float[]
      measuredWidth)

      • 这三个方法让我们设置一个最大宽度,在不超过这个宽度的范围内返回实际测量值否则停止测量。
    text 表示我们的字符串;
    start 表示从第几个字符串开始测量;
    end 表示从测量到第几个字符串为止;
    measureForwards 表示向前还是向后测量;
    maxWidth 表示一个给定的最大宽度在这个宽度内能测量出几个字符;
    measuredWidth 为一个可选项,可以为空,不为空时返回真实的测量值

    这些方法在一些结合文本处理的应用里比较常用,比如文本阅读器的翻页效果,我们需要在翻页的时候动态折断或生成一行字符串,这就派上用场了~

    • measureText(String text)
    • measureText(CharSequence text, int start, int end)
    • measureText(String text, int start, int end)
    • measureText(char[] text, int index, int count)
      • 测量文本宽度,上面我们已经使用过了,这四个方法都是一样的只是参数稍有不同罢了。
    • reset()::恢复画笔到默认配置。

    源码下载
    ApiDemo下载
    博客中用到的网格插件

    引用:
    Android画图Path的使用 - tt_mc - 博客园
    (转)【Android】Paint的效果研究 - wpf814533631 - ITeye技术网站
    自定义控件其实很简单1/4 - AigeStudio - 博客频道 - CSDN.NET
    android paint cap join 理解 图示 - Android移动开发技术文章_手机开发 - 红黑联盟
    android Graphics(一):概述及基本几何图形绘制 - harvic - 博客频道 - CSDN.NET
    Android笔记二十八.Android绘图深度解析-android-爱编程
    用TextPaint来绘制文字 - developer_Kale - 博客园

    其他:
    详解Paint的各种set方法 - 推酷

    展开全文
  • Paint Mix

    2017-04-10 08:56:23
    More specifically, in each iteration you first pour C cups of paint from the black pail into the white pail (and thoroughly mix the paint in the white pail), then pour C cups of paint from the white ...
  • Paint paint 参数

    2013-06-04 13:17:21
    Paint paint = new Paint();  paint.setAntiAlias(true); //防锯齿  paint.setDither(true); //防抖动  paint.setStyle(Paint.Style.STROKE); //画笔类型 STROKE空心 FI
    Paint paint = new Paint();
            paint.setAntiAlias(true);          //防锯齿
            paint.setDither(true);            //防抖动
            paint.setStyle(Paint.Style.STROKE);          //画笔类型 STROKE空心 FILL 实心 FILL_AND_STROKE 用契形填充
            paint.setStrokeJoin(Paint.Join.ROUND);      //画笔接洽点类型 如影响矩形但角的外轮廓
            paint.setStrokeCap(Paint.Cap.ROUND);      //画笔笔刷类型 如影响画笔但始末端
    展开全文
  • paint.net 源码

    热门讨论 2013-06-25 16:15:58
    此为paint.net-3.36的源码,修改了其在VS2010下不能编译的问题,有 需要的可以下载。如有疑问请联系QQ:78499261.
  • Paint的使用

    千次阅读 2013-07-20 22:42:13
    Paint,android,常用绘图类

    要想使用画笔进行操作就必须创建一个类是继承View的,并实现继承他的onDrew方法和构造方法

    class DrawView extends View{


    @Override
    protected void onDraw(Canvas canvas) {
    // TODO Auto-generated method stub
    Paint paint=new Paint();//定义一个默认的画笔
    //线性渐变
    Shader shader=new LinearGradient(0,0,50,50,Color.RED,Color.GREEN,Shader.TileMode.MIRROR);//
    paint.setShader(shader);//为画笔设置渐变器
    canvas.drawRect(10,20,100,150,paint);//绘制矩形
    //径向向变
    shader=new RadialGradient(160,110,50,Color.RED,Color.GREEN,Shader.TileMode.MIRROR);//
    paint.setShader(shader);//为画笔设置渐变器
    canvas.drawRect(150,70,205,150, paint);//绘制矩形
    //角度渐变
    shader=new SweepGradient(265,110,new int[]{Color.RED,Color.GREEN,Color.BLUE},null);//
    paint.setShader(shader);//为画笔设置渐变器
    canvas.drawRect(220,70,310,150, paint);//绘制矩形
    }


    public DrawView(Context context) {
    super(context);
    // TODO Auto-generated constructor stub
    }

    }



    还要在MainActivity里面得到布局管理器,创建一个View的子类,添加到布局里面去

    package com.org.panit;


    import android.os.Bundle;
    import android.app.Activity;
    import android.content.Context;
    import android.graphics.Canvas;
    import android.graphics.Color;
    import android.graphics.LinearGradient;
    import android.graphics.Paint;
    import android.graphics.RadialGradient;
    import android.graphics.Shader;
    import android.graphics.SweepGradient;
    import android.view.Menu;
    import android.view.View;
    import android.widget.LinearLayout;


    public class MainActivity extends Activity {


    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);//设置布局管理

    LinearLayout layout=(LinearLayout)findViewById(R.id.can);//得到布局器
    layout.addView(new DrawView(this));//在布局器里面添加画板
    }


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
    }


    }


    我的main.xml文件里面的内容是:

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        android:id="@+id/can"
         >


        


    </LinearLayout>

    注意用画笔进操作,最重要的就是得到一个View的子类,实现里面的onDraw方法,在把这个子类的View添加到主布局里面去就可以了,图像就可以画出来了

     

     

    展开全文
  • Android Paint详解

    2017-09-01 11:03:01
    Android Paint详解 Android 自定义View之Canvas相关方法说明 Android 自定义View实例(验证码) Android 自定义View实例(进度圆环) Android 源码分析(TextView) Android 自定义View分发流程 Android

    自定义View的相关文章:

    强烈推荐大家直接看 官方文档,看着官方文档然后写demo这是我们正确的学习方式。

    通过官方文档学习是一项很强大的能力。

    这篇文章是Paint的学习,但我更希望大家学会使用官方文档。

    这里写图片描述
    这里面有几个重点地方大家注意:

    • added in API level 1(右上角):相应的方法也会注明api版本,有写方法如果写:added in API level 21,说明此方法在api21及以上版本才有,低于此版本无此方法或者类,所以要特别处理。
    • 看继承关系,Paint继承自Object,直接子类只有TextPaint。
    • 此类的说明:图片中最下面的一行字,这句话是对当前类的高度概括,设置一些注意事项都会写在这,如果你看不懂英文,请直接谷歌翻译。

    这里写图片描述
    这里是Paint的嵌套类

    1. Paint.Align:文本的对其方式

    • LEFT:当前坐标的右边
    • CENTER:当前坐标的中心
    • RIGHT:当前坐标的左边

    这个方法对drawText方法有效。
    这段代码是在 Android 实现一个简单的自定义View 基础上添加的。

     textPaint = new Paint();
            textPaint.setTextSize(30);//设置字体大小
            textPaint.setColor(Color.RED);
            //设置字体对其方式
            switch (textAlign) {
                case TEXTALIGN_LEFT:
                    textPaint.setTextAlign(Paint.Align.LEFT);
                    break;
                case TEXTALIGN_CENTER:
                    textPaint.setTextAlign(Paint.Align.CENTER);
                    break;
                case TEXTALIGN_RIGHT:
                    textPaint.setTextAlign(Paint.Align.RIGHT);
                    break;
                default:
            }
    
    //绘制文案
            canvas.drawText(text,getWidth() / 2, getHeight() / 2,textPaint);

    效果:
    这里写图片描述

    我们在圆心的位置绘制文字的,和我理解有冲突的地方是Left我认为文字绘制在圆心的左边,而实际是右边。
    这里写图片描述
    官方文档的解释和效果是一样,我们就理解为圆心在文字的左边吧。

    2. Paint.Cap

    线段2端的样式,效果图:
    这里写图片描述

    注意绘制不要超过View的大小。

    public class PaintCapView extends View {
    
        private Paint mPaint;
    
        private int cap;
    
        public PaintCapView(Context context) {
            this(context,null);
        }
    
        public PaintCapView(Context context, @Nullable AttributeSet attrs) {
            this(context, attrs,0);
        }
    
        public PaintCapView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
            this(context, attrs, defStyleAttr,0);
        }
    
        public PaintCapView(Context context, @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes) {
            super(context, attrs, defStyleAttr, defStyleRes);
    
            TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.PaintCapView);
            cap = typedArray.getInt(R.styleable.PaintCapView_cap, 0);
            typedArray.recycle();
    
            mPaint = new Paint();
            mPaint.setColor(Color.RED);
            mPaint.setAntiAlias(true);
            mPaint.setStyle(Paint.Style.STROKE);
            switch (cap) {
                case 0:
                    mPaint.setStrokeCap(Paint.Cap.BUTT);
                    break;
                case 1:
                    mPaint.setStrokeCap(Paint.Cap.ROUND);
                    break;
                case 2:
                    mPaint.setStrokeCap(Paint.Cap.SQUARE);
                    break;
                default:
            }
            mPaint.setStrokeWidth(30);
    
        }
    
        @Override
        public void onDraw(Canvas canvas){
            super.onDraw(canvas);
    
            canvas.drawLine(15,getHeight()/2,getWidth()-15,getHeight()/2,mPaint);
        }
    }

    3. Paint.Join

    线条连接处的样式:BEVEL、MITER、ROUND

    看下效果图就明白了:
    这里写图片描述
    这里写图片描述
    这里写图片描述

    看最后一张图,感觉bevel和miter右角的连接处一样啊,其实是不一样的,看下面这张图:
    这里写图片描述

    矩形代表比较宽的线段,1和2分别为2条线段上的顶点

    BEVEL:1和2直线连接
    MITER:1和2的延长线相交,超出View的区域不绘制
    ROUND:1和2连线作为直径画圆

    4. Paint.Style

    直接看效果图:

    这里写图片描述

    下面我们看看几个常用的方法,其他的大家自己看看:

    reset

    重置Paint

    setARGB、setAlpha、setColor

    设置颜色和透明度

    setAntiAlias

    设置抗锯齿,使边界更平滑

    setFakeBoldText

    设置粗体

    setMaskFilter

    对图像效果处理,MaskFilter,后面具体讲解

    setPathEffect

    设置绘制路径的效果,PathEffect,后面具体讲解

    setShader

    设置着色器,可以绘制出各种渐变效果,Shader,后面具体讲解

    setShadowLayer

    设置阴影

    setStrokeCap、setStrokeJoin、setStyle、setTextAlign

    见上面所讲的Cap、Join、Style、Align

    setTextScaleX

    text水平缩放

    setTextSkewX

    text水平倾斜

    setXfermode

    重叠模式,PorterDuff.Mode,后面具体讲解

    代码地址

    展开全文
  • 画布有update、repaint、paint三个方法,一般重写paint方法。现在我想在paint中加一个判断,是否重置画布,只有重置时才刷新整个画布,否则在原有基础上继续画,但这样出现了一个问题,其它弹出的组件会在画布上留下...
  • Android Paint、Canvas、Matrix使用讲解(一、Paint)

    万次阅读 多人点赞 2015-03-24 22:56:42
    好了,前面主要讲了Animation,Animator 的使用,以及桌面火箭效果和水波纹效果,分别使用android框架和自己绘制实现,俗话说,工欲善其事,必先利其器,接下来几篇文章主要讲绘制中...Paint:画笔 Canvas:画布
  • void MyItem3::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) { QPen pen; pen.setWidth(2); int i; for(i=0;i;i++) { pen.setColor(QColor(255,255,255,i*5));...
  • 各位大大好,我是跟着视频自学的java纯新手,在写的...然后就是运行的时候如果去掉paint()里的if else判断直接调用g2.drawImage(this.nowBG.getBgImage(),0,0,this)会出现java.lang.NullPointerException这该如何解决
  • 1.这样直接draw的图形,和用paint事件的图形有什么区别,一直没怎么懂paint的用法 2.后期我想保存文件,使用DrawtoBitmap时,生成的是一张白纸(是不是和没有用paint有关) 3.能对我画的圆进行鼠标拖拽么(基于up...
  • WM_PAINT消息

    千次阅读 2013-01-29 21:44:09
    Windows利用这个机会给窗口消息处理程序发送第一个WM_PAINT消息。这个消息通知窗口消息 处理程序:必须绘制显示区域。此后,窗口消息处理程序应在任何时刻都准备好处理其它WM_PAINT 消息,必要的话,甚至重新...
  • PAINT.NET 插件集

    2010-11-25 23:44:15
    这是一组收集的paint.net 插件 , 发上来给刚开始作图的朋友共享 解压到软件的安装目录下的plugins 就可以用
  • Canvas&Paint[]Paint

    千次阅读 2017-08-25 11:11:38
    【参考链接】 Xfermode篇https://segmentfault.com/a/1190000006753544 androidcanvas layer (图层)详解与进阶...  画布用于控制形状。而画笔用于控制样式。   setStyle 设置是Fill、Stroke还
  • public void Paint(Graphics g){ //调用父类函数完成初始化 //这句话不能少 super.paint(g); System.out.println("321"); //先画一个圆圈 g.drawOval(10, 10, 40, 60); } }
  • paint进阶

    千次阅读 2016-05-11 15:34:37
    概述paint的基本绘制方法已经在前面的基本图形绘制中讲解了,这里做的是进阶讲解,讲解paint的一些进阶方法。例如:setStrokeCap,setStrokeJoin,setPathEffect等。PathDashPathEffect,DiscretePathEffect,...
  • Shader ---着色器,Canvas的drawXXXX这个方法是画具体的形状,画笔的shader定义的就是图形的着色和外观 BitmapShader--位图图像渲染,用BitMap对绘制的图形进行渲染着色,简单来说是用图片对图形进行贴图 ...
  • Paint介绍

    2017-08-24 20:19:03
    欢迎使用Markdown编辑器写博客本Markdown编辑器使用StackEdit修改而来,用它写博客,将会带来全新的体验哦: Markdown和扩展Markdown简洁的语法 代码块高亮 图片链接和图片上传 LaTex数学公式 UML序列图和流程图 ...
  • Paint即画笔,在绘图过程中起到了极其重要的作用,画笔主要保存了颜色,样式等绘制信息,指定了如何绘制文本和图形,画笔对象有很多设置方法,大体上可以分为两类,一类与图形绘制相关,一类与文本绘制相关。...
  • Paint 使用

    2017-08-06 17:53:48
    Paint 用法先申明一下,这个只是自己想对paint有个整体滴认识,所以才整理出来滴,里面的链接其实都是同一个, 比较难滴地方,都是参考这个大神滴文章来进行滴。。。 看到这里,已经实现了引流,哈哈哈,你们可以去...
  • Paint方法

    千次阅读 2016-08-04 08:26:26
    在云课堂里面看到这么个小游戏项目,着手自己做的时候,却出现了问题,理由是我怎么也无法调用出paint()方法,后来经过网友与室友的帮助下,我逐渐理解了paint()方法的“调用”。 package liu.shen.util; ...
  • Paint画笔

    2017-05-08 13:46:04
    1.Paint画笔 Panit(画笔)是绘图额辅助类,其类中包含文字和位图额样式、颜色等属性信息。Paint 的常用方法如下:   setAntiAlias(boolean aa) 作用:设置画笔是否无锯齿 参数:true 表示无锯齿,...
  • Paint练习

    2019-10-03 12:59:25
    Paint paint=new Paint(); paint.setStyle(Paint.Style.STROKE); paint.setStrokeWidth(10); paint.setColor(Color.BLUE); paint.setTextSize(100); canvas...
  • Paint API

    2019-09-28 10:29:54
    // paint恢复为默认设置。 paint.reset(); // 从src目录中装载一种画笔的样式 paint.set(src); // 设置画笔的透明度 paint.setAlpha(a); // 设置画笔的抗锯齿情况,使画笔更为圆滑 ...
  • paint画笔

    2015-10-21 23:29:49
    方法设置 setAntiAlias(boolean aa) //是否抗锯齿 setColor(Color.GREEN)//设置颜色 public void setStrokeWidth (float width)//设置画笔的空心线宽 其中,参数width为线宽,浮点型数据 ...paint.setStyle

空空如也

1 2 3 4 5 ... 20
收藏数 20,368
精华内容 8,147
关键字:

paint