android自定义控件-paint详解

简介: android自定义控件-paint详解

github代码(所在分支paint)


github.com/ananananzhu…


Paint Api介绍


设置画笔颜色

public void setColor(@ColorInt int color)
复制代码


设置画笔宽度

paint.setStrokeWidth(10)
复制代码

在画笔宽度为0的情况下,仍然能以1像素进行绘制,但是画布缩放的时候绘制线条的宽度不会变 如果画笔的宽度为1那么放大画布一倍的时候,线条的宽度会变为2


抗锯齿

setAntiAlias(true) 
复制代码

true:柔化处理

false:不柔化处理

抗锯齿是指在图像中,物体边缘总会或多或少的呈现三角形的锯齿,而抗锯齿就是指对图像边缘进行柔化处理,使图像边缘看起来更平滑,更接近实物的物体


画笔透明度

public void setAlpha(int a)
复制代码

a:范围0-255

0:透明

255:完全不透明


设置透明度和颜色

public void setARGB(int a, int r, int g, int b)
复制代码

参数范围都是0-255


设置画笔样式

public void setStyle(Style style)
复制代码

Paint.Style.FILL:填充内部(例如这种模式画一个圆圆内部颜色是被填充的)

Paint.Style.STROKE :描边(内部不被填充,可以用来绘制圆环)

Paint.Style.FILL_AND_STROKE :填充内部和描边(展示效果和FILL看起来是一样的)


线条连接处样式

public void setStrokeJoin(Join join)
复制代码
public static enum Join {
  BEVEL,
  MITER,
  ROUND
}
复制代码

BEVEL:连接处是斜线的模式

MITER:直角

ROUND:圆角 样式 效果展示:

image.png


图中第三个写错了,应该是圆角


public void setStrokeMiter

public void setStrokeMiter
复制代码

MITER模式下小角度的情况下会自动把尖角转换为斜线模式 效果展示:

image.png


设置线头的模式

public void setStrokeCap(Cap cap)
复制代码


public static enum Cap {
  BUTT,平头
  ROUND,圆头
  SQUARE  方块
}
复制代码

效果展示:

image.png

拐角变圆角

public PathEffect setPathEffect(PathEffect effect)
复制代码


设置setPathEffect代码示例

paint.pathEffect=CornerPathEffect(40)
复制代码

效果动图展示 如下图中的两个路径,本身两者的路径是相同的,但是我们通过滑动Seekbar后动态改变第二个路径Paint的pathEffect属性,然后第二个路径就逐渐变得圆润了

image.png

设置虚线

paint.pathEffect = DashPathEffect(floatArrayOf(10f, 20f), 50f)
复制代码

DashPathEffect第一个参数数组中数字第0个值表示虚线的长度,第1个值表示两个虚线之间的长度


绘制虚线代码

override fun onDraw(canvas: Canvas?) {
        super.onDraw(canvas)
        path.reset()
        path.apply {
            moveTo(100f, 100f)
            lineTo(300f, 200f)
            lineTo(100f, 400f)
            lineTo(300f, 900f)
            lineTo(80f, 1000f)
            close()
        }
        canvas?.drawPath(path, paint)
    }
复制代码


代码实现效果

image.png


PathDashPathEffect

复制别人博客的代码:

Path dashPath = ...; // 使用一个三角形来做 dash  
PathEffect pathEffect = new PathDashPathEffect(dashPath, 40, 0,  
        PathDashPathEffectStyle.TRANSLATE);
paint.setPathEffect(pathEffect);
...
canvas.drawPath(path, paint);  
复制代码


参考效果:

image.png


DiscretePathEffect() 设置线条随机偏移

image.png


SumPathEffect () 两种线条模式都执行

image.png


Gradient渐变模式

渐变模式的集中模式:

"LinearGradient" 线性渐变

"RadialGradient"  径向渐变

"SweepGradient"  扫描渐变

"BitmapShader"  位图渐变

"ComposeShader"  混合渐变,可以有多个shader混合在一起

image.png


设置阴影

setShadowLayer(float radius, float dx, float dy, int shadowColor)
复制代码

radius 是阴影的模糊范围; dx dy 是阴影的偏移量; shadowColor 是阴影的颜色。


模糊效果的 MaskFilter

一共四个模式:

NORMAL: 内外都模糊绘制

SOLID: 内部正常绘制,外部模糊

INNER: 内部模糊,外部不绘制

OUTER: 内部不绘制,外部模糊

var maskFilter: BlurMaskFilter = BlurMaskFilter(50f, BlurMaskFilter.Blur.SOLID)
 canvas?.translate(measuredWidth / 2f, measuredHeight / 2f)
 canvas?.drawBitmap(bitmap, -200f, -200f, paint)
复制代码


image.png


getTextPath路径

获取文本的路径

代码展示:

override fun onDraw(canvas: Canvas?) {
        super.onDraw(canvas)
        val text = "测试文本 Test"
        val srcPaint = Paint()
        srcPaint.textSize = 100f
        srcPaint.color = Color.BLACK
        srcPaint.style = Paint.Style.STROKE
        canvas?.drawText(text, 50f, 100f, srcPaint)
        //获取文本路径
        canvas?.translate(0f, 150f)
        val desPath = Path()
        val desPaint = Paint()
        desPaint.textSize = 100f
        desPaint.color = Color.RED
        desPaint.strokeWidth = 5f
        desPaint.style = Paint.Style.STROKE
        srcPaint.getTextPath(text, 0, text.length, 50f, 100f, desPath)
        canvas?.drawPath(desPath, desPaint)
    }
复制代码


代码效果展示:

image.png



相关文章
|
XML 前端开发 Java
Android Studio App自定义控件中自定义视图的绘制讲解及实战(附源码 包括自定义绘制各种图形)
Android Studio App自定义控件中自定义视图的绘制讲解及实战(附源码 包括自定义绘制各种图形)
245 1
|
缓存 搜索推荐 Android开发
安卓开发中的自定义控件实践
【10月更文挑战第4天】在安卓开发的海洋中,自定义控件是那片璀璨的星辰。它不仅让应用界面设计变得丰富多彩,还提升了用户体验。本文将带你探索自定义控件的核心概念、实现过程以及优化技巧,让你的应用在众多竞争者中脱颖而出。
|
搜索推荐 Android开发 开发者
安卓应用开发中的自定义控件实践
在安卓应用开发的广阔天地中,自定义控件如同璀璨的星辰,点亮了用户界面设计的夜空。它们不仅丰富了交互体验,更赋予了应用独特的个性。本文将带你领略自定义控件的魅力,从基础概念到实际应用,一步步揭示其背后的原理与技术细节。我们将通过一个简单的例子——打造一个具有独特动画效果的按钮,来展现自定义控件的强大功能和灵活性。无论你是初学者还是资深开发者,这篇文章都将为你打开一扇通往更高阶UI设计的大门。
170 2
|
缓存 搜索推荐 Android开发
安卓开发中的自定义控件基础与进阶
【10月更文挑战第5天】在Android应用开发中,自定义控件是提升用户体验和界面个性化的重要手段。本文将通过浅显易懂的语言和实例,引导你了解自定义控件的基本概念、创建流程以及高级应用技巧,帮助你在开发过程中更好地掌握自定义控件的使用和优化。
277 10
|
前端开发 搜索推荐 Android开发
安卓开发中的自定义控件实践
【10月更文挑战第4天】在安卓开发的世界里,自定义控件如同画家的画笔,能够绘制出独一无二的界面。通过掌握自定义控件的绘制技巧,开发者可以突破系统提供的界面元素限制,创造出既符合品牌形象又提供卓越用户体验的应用。本文将引导你了解自定义控件的核心概念,并通过一个简单的例子展示如何实现一个基本的自定义控件,让你的安卓应用在视觉和交互上与众不同。
|
缓存 前端开发 Android开发
安卓应用开发中的自定义控件
【9月更文挑战第28天】在安卓应用开发中,自定义控件是提升用户界面和交互体验的关键。本文通过介绍如何从零开始构建一个自定义控件,旨在帮助开发者理解并掌握自定义控件的创建过程。内容将涵盖设计思路、实现方法以及性能优化,确保开发者能够有效地集成或扩展现有控件功能,打造独特且高效的用户界面。
|
前端开发 Android开发 UED
安卓应用开发中的自定义控件实践
【10月更文挑战第35天】在移动应用开发中,自定义控件是提升用户体验、增强界面表现力的重要手段。本文将通过一个安卓自定义控件的创建过程,展示如何从零开始构建一个具有交互功能的自定义视图。我们将探索关键概念和步骤,包括继承View类、处理测量与布局、绘制以及事件处理。最终,我们将实现一个简单的圆形进度条,并分析其性能优化。
|
搜索推荐 Android开发 开发者
探索安卓开发中的自定义控件
【9月更文挑战第5天】在安卓开发的海洋中,自定义控件如同一艘精致的小船,让开发者能够乘风破浪,创造出既独特又高效的用户界面。本文将带你领略自定义控件的魅力,从基础概念到实战应用,一步步深入理解并掌握这一技术。
|
Android开发 UED 开发者
安卓开发中的自定义控件基础
【8月更文挑战第31天】在安卓应用开发过程中,自定义控件是提升用户界面和用户体验的重要手段。本文将通过一个简易的自定义按钮控件示例,介绍如何在安卓中创建和使用自定义控件,包括控件的绘制、事件处理以及与布局的集成。文章旨在帮助初学者理解自定义控件的基本概念,并能够动手实践,为进一步探索安卓UI开发打下坚实的基础。
|
存储 缓存 前端开发
安卓开发中的自定义控件实现及优化策略
【8月更文挑战第31天】在安卓应用的界面设计中,自定义控件是提升用户体验和实现特定功能的关键。本文将引导你理解自定义控件的核心概念,并逐步展示如何创建一个简单的自定义控件,同时分享一些性能优化的技巧。无论你是初学者还是有一定经验的开发者,这篇文章都会让你对自定义控件有更深的认识和应用。

热门文章

最新文章