Android自定义view利用PathEffect实现动态效果
作者:计蒙不吃鱼 发布时间:2023-08-17 09:35:00
本文实例为大家分享了Android自定义view利用PathEffect实现动态效果的具体代码,供大家参考,具体内容如下
前言
在上一篇此类型的文章中是改变偏移量实现动态效果,借助的方法是drawArc,这篇文章依然是改变偏移量,而借助的是PathEffect的子类。
效果图:
一、首先介绍下PathEffect的一些子类
CornerPathEffect:将Path的各个连接线段之间的夹角用一种更平滑的方式连接,类似于圆弧与切线的效果。 参数radius则是指定圆弧的半径。
DashPathEffect:将Path的线段虚线化,intervals为虚线的ON和OFF的数组,数组中元素数目需要 >= 2; 而phase则为绘制时的偏移量。
DiscretePathEffect:打散Path的线段,使得在原来路径的基础上发生打散效果。 segmentLength指定最大的段长,deviation则为绘制时的偏离量。
PathDashPathEffect:使用Path图形来填充当前的路径,shape指的填充图形,advance是每个图形间的间隔, phase为绘制时的偏移量。,style则是该类自由的枚举值,有三种情况:ROTATE、MORPH和TRANSLATE。ROTATE情况下:线段连接处的图形转换以旋转到与下一段移动方向相一致的角度进行连接。MORPH情况下:图形会以发生拉伸或压缩等变形的情况与下一段相连接。TRANSLATE情况下:图形会以位置平移的方式与下一段相连接。
ComposePathEffect:组合效果
SumPathEffect:叠加效果,和ComposePathEffect不同,在表现时会将两个参数的效果都独立的表现出来, 接着将两个效果简单的重叠在一起显示出来
二、看看子类具体的一些代码
private static void makeEffects(PathEffect[] e, float phase) {
e[0] = null; // 无效果
e[1] = new CornerPathEffect(30);//CornerPathEffect
e[2] = new DashPathEffect(new float[] {10, 5, 5, 5}, phase);//DashPathEffect
e[3] = new PathDashPathEffect(makePathDash(), 12, phase,
PathDashPathEffect.Style.ROTATE);//PathDashPathEffect
e[4] = new ComposePathEffect(e[2], e[1]);//ComposePathEffect
e[5] = new ComposePathEffect(e[3], e[1]);//ComposePathEffect
}
三、案例实现(CornerPathEffect,PathDashPathEffect,ComposePathEffect)
实现的效果是上序代码的e[5],使用CornerPathEffect实现圆弧效果,而重点是PathDashPathEffect。
PathDashPathEffect里面有几个参数:
new PathDashPathEffect(makePathDash(), 12, phase,
PathDashPathEffect.Style.ROTATE);
第一个参数为小path图形,案例中博主画的是菱形:
private static Path makePathDash() {
Path p = new Path();
p.moveTo(0, 0);
p.lineTo(4, 4);
p.lineTo(8, 0);
p.lineTo(4, -4);
p.moveTo(0, 0);
return p;
}
第二个参数为每个图形间的间隔。
第三个参数为绘制时的偏离量
第四个参数为样式,博主选择的是ROTATE情:线段连接处的图形转换以旋转到与下一段移动方向相一致的角度进行连接。
最后使用ComposePathEffect进行组合。
绘制运动路径
private static Path makeFollowPath() {
Path p = new Path();
p.moveTo(0, 0);
p.lineTo(400,0);
p.lineTo(400,400);
p.lineTo(0,400);
p.lineTo(0,0);
return p;
}
修改偏移量实现动态效果
mPhase += 1;
invalidate();
四、源码
public class SampleView extends View {
private Paint mPaint;
private Path mPath;
private PathEffect[] mEffects;
private int mColors;
private float mPhase;
private static void makeEffects(PathEffect[] e, float phase) {
e[0] = null;
e[1] = new CornerPathEffect(30);
e[2] = new DashPathEffect(new float[] {10, 5, 5, 5}, phase);
e[3] = new PathDashPathEffect(makePathDash(), 12, phase,
PathDashPathEffect.Style.ROTATE);
e[4] = new SumPathEffect(e[3], e[1]);
e[5] = new ComposePathEffect(e[3], e[1]);
}
public SampleView(Context context) {
super(context);
setFocusable(true);
setFocusableInTouchMode(true);
mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
mPaint.setStyle(Paint.Style.STROKE);
mPaint.setStrokeWidth(6);
mPath = makeFollowPath();
//初始化PathEffect[]
mEffects = new PathEffect[6];
mColors = Color.BLACK;
}
@Override
protected void onDraw(Canvas canvas) {
canvas.drawColor(Color.WHITE);
RectF bounds = new RectF();
mPath.computeBounds(bounds, false);
canvas.translate(10 - bounds.left, 10 - bounds.top);
makeEffects(mEffects, mPhase);
mPhase += 1;
invalidate();
//选择样式
mPaint.setPathEffect(mEffects[5]);
mPaint.setColor(mColors);
canvas.drawPath(mPath, mPaint);
canvas.translate(0, 28);
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
switch (keyCode) {
case KeyEvent.KEYCODE_DPAD_CENTER:
mPath = makeFollowPath();
return true;
}
return super.onKeyDown(keyCode, event);
}
//绘制跑动路径
private static Path makeFollowPath() {
Path p = new Path();
p.moveTo(0, 0);
p.lineTo(400,0);
p.lineTo(400,400);
p.lineTo(0,400);
p.lineTo(0,0);
return p;
}
//绘制跑动的小图标
private static Path makePathDash() {
Path p = new Path();
p.moveTo(0, 0);
p.lineTo(4, 4);
p.lineTo(8, 0);
p.lineTo(4, -4);
p.moveTo(0, 0);
return p;
}
}
来源:https://blog.csdn.net/qq_42761395/article/details/119876461
猜你喜欢
- 前言本文准确来讲是探讨如何用 Jackson 来序列化 Apache avro 对象,因为简单用 Jackson 来序列化 Apache a
- 背景介绍在实际项目中,特别是一些管理后台类的项目,会遇到底层数据是按照一对多关系的数据表存储的管理界面。列表页是一对多关系中一对应的数据列表
- 使用正则表达式,效率较高public boolean canParseInt(String str){if(str == null){ //
- 摘 要1. 生成多个防伪码,防伪码的长度和个数由用户指定。2. 防伪码由"0123456789ABCDEFGHJKLMNPQRST
- 目录创建线程管理线程销毁线程创建线程线程是通过扩展 Thread 类创建的。扩展的 Thread 类调用 Start() 方法来开
- 本文实例为大家分享了C#实现验证码功能的具体代码,供大家参考,具体内容如下分析需要四个字符(字母(大小写)+数字)将四个字符连接成字符串将连
- 本文实例介绍了手机号码归属地接口调用基于C#实现,分享给大家供大家参考,具体内容如下using System;using System.Co
- ztree生成树状图ztree官网前台导入js和css包下载地址前端页面 ztree.jsp<%@ page contentType=
- 一:讲故事上一篇介绍的 6 个特性从园子里的反馈来看效果不错,那这一篇就再带来 6 个特性同大家一起欣赏。二:特性分析1. 像弱类型语言一样
- 在编程中经常需要使用到表格(报表)的处理主要以Excel表格为主。下面给出用java写入数据到excel表格方法:1.添加jar文件java
- 1 实战前的理论基础1.1 Spring Batch是什么Spring Batch 是一个轻量级、全面的批处理框架,旨在支持开发对企业系统日
- 看了这个排行榜, 小编只想说:流水的编程语言,铁打的Java,C/C++!!人工智能的前景已经不用多说了,越来越多的人看重人工智能的前景,想
- 前言项目使用redis作为缓存数据,但面临着问题,比如,项目A,项目B都用到redis,而且用的redis都是一套集群,这样会带来一些问题。
- 本文实例为大家分享了Android九宫格图片展示的具体代码,供大家参考,具体内容如下推荐视频:尚硅谷Spring Data JPA视频教程,
- 目录1、Java Application 源程序的主类是指包含有( )方法的类。2、如果定义一种表达式结构:(+ 6 3)的值为9,(- 6
- 1 修饰属性或者变量无论属性是基本类型还是引用类型,作用都是变量里面存放的“值”不可变经常和static关键字一起使用,作为常量1 基本类型
- 前言:在日常的Android开发中会经常和控件打交道,有时Android提供的控件未必能满足业务的需求,这个时候就需要我们实现自定义一些控件
- 一、前言又见面了哈,今天为大家介绍时钟、钟表的实现方法教程。实现的方法有很多,这里只是提供了一个思路,本着抛砖引玉的心态,希望能和大家共同学
- 摘要 想必大家对小榕时光等扫描器都非常熟悉了,有没有自己写一个的冲动。最近微软推实施了.NET战略方案,C#是主推语言,你们是否
- import java.io.BufferedReader;import java.io.InputStreamReader;import