Android自定义View-Paint详解

Paint的使用

setStyle

  • Paint.Style.FILL:填充模式
  • Paint.Style.STROKE:画线模式
  • Paint.Style.FILL_AND_STROKE:填充+画线

paint.setStyle(Paint.Style.FILL);
canvas.drawCircle(200,100,100,paint);

paint.setStyle(Paint.Style.STROKE);
canvas.drawCircle(200,350,100,paint);

paint.setStyle(Paint.Style.FILL_AND_STROKE);
canvas.drawCircle(200,600,100,paint);

setStrokeCap

设置线头形状:

  • BUFF:平头
  • ROUND:圆头
  • SQUARE:方头

paint.setStrokeWidth(20);

paint.setStrokeCap(Paint.Cap.BUTT);
canvas.drawLine(50, 50, 300, 50, paint);

paint.setStrokeCap(Paint.Cap.ROUND);
canvas.drawLine(50, 100, 300, 100, paint);

paint.setStrokeCap(Paint.Cap.SQUARE);
canvas.drawLine(50, 150, 300, 150, paint);

setShadowLayer

在绘制内容下面加一层阴影

paint.setTextSize(36);
paint.setShadowLayer(10, 0, 0, Color.RED);
canvas.drawText("hello world", 100, 100, paint);

setColor setARGB

paint.setColor(Color.parseColor("#ff0000"));
canvas.drawText("hello", 30, 100, paint);

paint.setARGB(100, 0, 255, 0);
canvas.drawText("hello", 30, 200, paint);

reset

重置Paint的所有属性为默认值,相当于重新new一个,性能更高。

set

把目标Paint的所有属性全部复制过来。

setShader

Shader 这个英文单词很多人没有见过,它的中文叫做「着色器」,也是用于设置绘制颜色的。「着色器」不是 Android 独有的,它是图形领域里一个通用的概念,它和直接设置颜色的区别是,着色器设置的是一个颜色方案,或者说是一套着色规则。当设置了 Shader 之后,Paint 在绘制图形和文字时就不使用 setColor/ARGB() 设置的颜色了,而是使用 Shader 的方案中的颜色。

PorterBuff.Mode

  • 目标图:指底板图
  • 源图:指即将画上的图

LinearGradient 线性渐变

protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    int redColor = Color.RED;
    int greenColor = Color.GREEN;
    //x0 y0 x1 y1:渐变的两个端点的位置
    //color0 color1 是端点的颜色
    //tileMode 辐射辐射范围外的着色模式:CLAMP:端点外延续颜色;MIRROR:镜像模式;REPEAT:重复模式;
    Shader shader = new LinearGradient(100, 100, 500, 500, redColor, greenColor, Shader.TileMode.CLAMP);
    paint.setShader(shader);
    canvas.drawCircle(300, 300, 200, paint);
}

RadialGradient 辐射渐变

Shader shader = new RadialGradient(300, 300, 200, redColor, greenColor, Shader.TileMode.CLAMP);
paint.setShader(shader);
canvas.drawCircle(300, 300, 200, paint);

SweepGradient 扫描渐变

Shader shader = new SweepGradient(300, 300, redColor, greenColor);
paint.setShader(shader);
canvas.drawCircle(300, 300, 200, paint);

BitmapShader 位图填充

Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.a);
Shader shader = new BitmapShader(bitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);
paint.setShader(shader);
canvas.drawCircle(300, 300, 200, paint);

ComposeShader 混合着色器

Bitmap bitmap1 = BitmapFactory.decodeResource(getResources(), R.drawable.a);
Bitmap srcBitmap = Bitmap.createScaledBitmap(bitmap1, 400, 400, true);
Shader shader1 = new BitmapShader(srcBitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);

Bitmap bitmap2 = BitmapFactory.decodeResource(getResources(), R.drawable.b);
Bitmap dstBitmap = Bitmap.createScaledBitmap(bitmap2, 400, 400, true);
Shader shader2 = new BitmapShader(dstBitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);

ComposeShader shader = new ComposeShader(shader1, shader2, PorterDuff.Mode.DST_OUT);
paint.setShader(shader);

canvas.drawRect(0, 0, 400, 400, paint);

setColorFilter

ColorFilter 这个类,它的名字已经足够解释它的作用:为绘制设置颜色过滤。颜色过滤的意思,就是为绘制的内容设置一个统一的过滤策略,然后 Canvas.drawXXX() 方法会对每个像素都进行过滤后再绘制出来。

LightingColorFilter 光照效果

LightingColorFilter 的构造方法是 LightingColorFilter(int mul, int add) ,参数里的 muladd 都是和颜色值格式相同的 int 值,其中 mul 用来和目标像素相乘,add 用来和目标像素相加:

R' = R * mul.R / 0xff + add.R
G' = G * mul.G / 0xff + add.G
B' = B * mul.B / 0xff + add.B
R' = R * mul.R / 0xff + add.R

一个「保持原样」的「基本 LightingColorFilter 」,mul0xffffffadd0x000000(也就是0),那么对于一个像素,它的计算过程就是:

R' = R * 0xff / 0xff + 0x0 = R // R' = R
G' = G * 0xff / 0xff + 0x0 = G // G' = G
B' = B * 0xff / 0xff + 0x0 = B // B' = B

Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.a);
ColorFilter lightingColorFilter = new LightingColorFilter(0x00ffff, 0x000000);
paint.setColorFilter(lightingColorFilter);
canvas.drawBitmap(bitmap, 10, 10, paint);

setXfermode

Xfermode 指的是你要绘制的内容和 Canvas的目标位置的内容应该怎样结合计算出最终的颜色。但通俗地说,其实就是要你以绘制的内容作为源图像,以 View 中已有的内容作为目标图像,选取一个 PorterDuff.Mode 作为绘制内容的颜色处理方案。

使用Xfermode需要设置离屏缓冲

API 说明
ComposeShader 混合两种Shader
PorterBuffColorFilter 增加一个单色的ColorFilter
Xfermode 绘制图层和底部图层的混合计算方式

private Paint paint;
private RectF bounds;
private Bitmap circleBitmap;
private Bitmap squareBitmap;

private void init() {
    paint = new Paint(Paint.ANTI_ALIAS_FLAG);
    bounds = new RectF(0, 0, 300, 300);
    circleBitmap = Bitmap.createBitmap(200, 200, Bitmap.Config.ARGB_8888);
    squareBitmap = Bitmap.createBitmap(200, 200, Bitmap.Config.ARGB_8888);

    Canvas canvas = new Canvas(circleBitmap);
    paint.setColor(Color.RED);
    canvas.drawCircle(100, 100, 100, paint);

    canvas.setBitmap(squareBitmap);
    paint.setColor(Color.BLUE);
    canvas.drawRect(100, 100, 300, 300, paint);
}

@Override
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);

    //设置离屏缓冲
    //离屏缓冲比较消耗资源。可以设置bounds指定区域
    int saved = canvas.saveLayer(bounds, null);

    //绘制dst
    canvas.drawBitmap(circleBitmap, 0, 0, paint);//画圆形

    //绘制src
    Xfermode xfermode = new PorterDuffXfermode(PorterDuff.Mode.SRC_IN);
    paint.setXfermode(xfermode);
    canvas.drawBitmap(squareBitmap, 0, 0, paint);//画矩形

    paint.setXfermode(null);//及时清理Xfermode
    //恢复
    canvas.restoreToCount(saved);
}

以上就是Android自定义View-Paint详解的详细内容,更多关于Android View-Paint的资料请关注我们其它相关文章!

(0)

相关推荐

  • Android自定义View中Paint、Rect、Canvas介绍(一)

    自定义View对于新手而言貌似是一个很复杂的东西.格式,各函数的意义.对于大神经常忘记各函数及一些参数的具体写法及意义,刚好在做一个风车效果,把过程及遇到的问题都写下来 1.如何自定义一个View public class LeafView extends View { private String TAG = "--------LeafView"; public LeafView(Context context, AttributeSet attrs) { super(context

  • Android中区别Drawable Bitmap Canvas Paint

    1.概念区别: 很多网友刚刚开始学习Android平台,对于Drawable.Bitmap.Canvas和Paint它们之间的概念不是很清楚,其实它们除了Drawable外早在Sun的J2ME中就已经出现了,但是在Android平台中,Bitmap.Canvas相关的都有所变化. 首先让我们理解下Android平台中的显示类是View,但是还提供了底层图形类android.graphics,今天所说的这些均为graphics底层图形接口. Bitmap - 称作位图 一般位图的文件格式后缀为bm

  • Android利用Paint自定义View实现进度条控件方法示例

    前言 View的三大流程:测量,布局,绘制,自定义View学的是啥?无非就两种:绘制文字和绘制图像. 我们在上一篇文章<Android绘图之Paint的使用>中学习了Paint的基本用法,但是具体的应用我们还没有实践过.从标题中可知,本文是带领读者使用Paint,自定义一个进度条控件. 效果图 上图就是本文要实现的效果图. 实现过程 既然是自定义控件,本文的该控件是直接继承View,然后重写View的onMeasure和onDraw方法来实现.其中onMeasure主要作用是测量控件的宽/高.

  • Android中Paint类和Canvas类的方法汇总

    Paint类的常用的方法 1.setColor方法,用于设置画笔的颜色, public void setColor(int color)//参数color为颜色值,也可以使用Color类定义的颜色 Color.BLACK:黑色 Color.BLUE:蓝色 Color.CYAN:青绿色 Color.DKGRAY:灰黑色 Color.YELLOW:黄色 Color.GRAY:灰色 Color.GREEN:绿色 Color.LTGRAY:浅绿色 Color.MAGENTA:红紫色 Color.TRAN

  • Android开发之图形图像与动画(一)Paint和Canvas类学习

    Paint类 *Paint类代表画笔,用来描述图形的颜色和风格,如线宽,颜色,透明度和填充效果等信息. *使用Paint类时,需要先创建该类的对象,可以通过该类的构造函数实现.通常情况的实现代码是: *Paintpaint=newPaint(); *创建完Paint对象后,可以通过该对象提供的方法对画笔的默认设置进行改变 Canvas *Canvas类代表画布,通过该类提供的构造方法,可以绘制各种图形. *通常情况下,要在Android中绘图,需要先创建一个继承自View类的视图,并且在该类中重

  • Android画图之抗锯齿paint和Canvas两种方式实例

    在画图的时候,图片如果旋转或缩放之后,总是会出现那些华丽的锯齿.其实Android自带了解决方式. 方法一:给Paint加上抗锯齿标志.然后将Paint对象作为参数传给canvas的绘制方法. paint.setAntiAlias(true); 方法二:给Canvas加上抗锯齿标志. 有些地方不能用paint的,就直接给canvas加抗锯齿,更方便. 复制代码 代码如下: canvas.setDrawFilter(new PaintFlagsDrawFilter(0, Paint.ANTI_AL

  • Android自定义View构造函数详解

    初始Custom View的构造函数 之前写过一篇实现圆形进度条的博客(自定义圆形进度条),通常我们在实现Custom View的时候,都会先继承View并实现View的三个构造函数,例如: import android.content.Context; import android.graphics.Canvas; import android.util.AttributeSet; import android.view.View; public class MyCustomView exte

  • android尺子的自定义view——RulerView详解

    项目中用到自定义尺子的样式: 原代码在github上找的,地址:https://github.com/QQabby/HorizontalRuler 原效果为 因为跟自己要使用的view稍有不同 所以做了一些修改,修改的注释都放在代码中了,特此记录一下. 首先是一个自定义View: public class RuleView extends View { private Paint paint; private Context context; private int maxValue = 500

  • Android 自定义ListView示例详解

    本文讲实现一个自定义列表的Android程序,程序将实现一个使用自定义的适配器(Adapter)绑定 数据,通过contextView.setTag绑定数据有按钮的ListView. 系统显示列表(ListView)时,首先会实例化一个适配器,本文将实例化一个自定义的适配器.实现 自定义适配器,必须手动映射数据,这时就需要重写getView()方法,系统在绘制列表的每一行的时候 将调用此方法. ListView在开始绘制的时候,系统自动调用getCount()函数,根据函数返回值得到ListVi

  • Android 自定义gradle property详解及实例代码

    Android 自定义gradle property 在Android studio上运行项目,gradle的配置是必不可少的,但是随着项目的逐渐成长,迎面而来的就是.各种依赖包的添加,数不胜数的签名,渠道包等,整个gradle变得很乱,这样其实我们可以将gradle的部分内容分离出来放在另一个自定义gradle内. 如这时我们添加的Plugin 就只要对其赋值就可以了. 步骤: 在总项目根目录下创建 dependencies.gradle文件(名字可以自定义) 根目录下创建的自定义内容如下:

  • Android自定义View实现验证码

    本文章是基于鸿洋的Android 自定义View (一)的一些扩展,以及对Android自定义View构造函数详解里面内容的一些转载. 首先我们定义一个declare-styleable标签declare-styleable标签的作用是给自定义控件添加自定义属性用的例如这样 (我们定义了文字的颜色,大小,长度,跟背景的颜色) <declare-styleable name="CustomTitleView"> <attr name="titleColor&q

  • Android自定义View实现体重表盘详解流程

    目录 效果视频 分析 起始角度 圆弧 指针 代码 初始化属性 画布 绘制内圆弧 绘制外圆弧 绘制中间指针 绘制中间文字 绘制左右两边文字 动画 全部代码 下载链接 效果视频 分析 起始角度 如下图所示,起点角度为150,终点角度为240 圆弧 白色圆弧为整个圆弧范围,蓝色圆弧为根据数据变动而覆盖白色圆弧,蓝色圆弧比白色圆弧大一点,突出显示 InnerArcPaint.setStrokeWidth( Width * (float)0.1 ); OuterArcPaint.setStrokeWidt

  • Android自定义view实现滚动选择控件详解

    目录 前言 需求 编写代码 主要问题 前言 上篇文章通过一个有header和footer的滚动控件(Viewgroup)学了下MeasureSpec.onMeasure以及onLayout,接下来就用一个滚动选择的控件(View)来学一下onDraw的使用,并且了解下在XML自定义控件参数. 需求 这里就是一个滚动选择文字的控件,还是挺常见的,之前用别人的,现在选择手撕一个,核心思想如下: 1.有三层不同大小及透明度的选项,选中项放在中间 2.接受一个列表的数据,静态时显示三个值,滚动时显示四个

  • Android自定义View中attrs.xml的实例详解

    Android自定义View中attrs.xml的实例详解 我们在自定义View的时候通常需要先完成attrs.xml文件 在values中定义一个attrs.xml 然后添加相关属性 这一篇先详细介绍一下attrs.xml的属性. <?xml version="1.0" encoding="utf-8"?> <resources> //自定义属性名,定义公共属性 <attr name="titleText" for

  • Android自定义View的实现方法实例详解

    一.自绘控件 下面我们准备来自定义一个计数器View,这个View可以响应用户的点击事件,并自动记录一共点击了多少次.新建一个CounterView继承自View,代码如下所示: 可以看到,首先我们在CounterView的构造函数中初始化了一些数据,并给这个View的本身注册了点击事件,这样当CounterView被点击的时候,onClick()方法就会得到调用.而onClick()方法中的逻辑就更加简单了,只是对mCount这个计数器加1,然后调用invalidate()方法.通过 Andr

  • Android自定义view实现侧滑栏详解

    目录 前言 需求 效果图 编写代码 主要问题 前言 上一篇文章学了下自定义View的onDraw函数及自定义属性,做出来的滚动选择控件还算不错,就是逻辑复杂了一些.这篇文章打算利用自定义view的知识,直接手撕一个安卓侧滑栏,涉及到自定义LayoutParams.带padding和margin的measure和layout.利用requestLayout实现动画效果等,有一定难度,但能重新学到很多知识! 需求 这里类似旧版QQ(我特别喜欢之前的侧滑栏),有两层页面,滑动不是最左侧才触发的,而是从

随机推荐