我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Android自定义view Path 的高级用法之搜索按钮动画

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Android自定义view Path 的高级用法之搜索按钮动画

关于Path之前写的也很多了,例如path绘制线,path绘制一阶,二阶和三阶贝塞尔路径,这些都是path的基本用法。今天我要带大家看的是Path 的高级用法,先上图,再吹。

Android自定义view Path 的高级用法之搜索按钮动画

效果大致是这样的。看着是不是挺好。话不多说,切入正题:

既然今天要谈Path的高级用法,那就先来讲一讲(Path -- 中文 )就是“路径”既然是路径,从我们面向对象的想法的话,我们就容易想到 路径 的长度,路径的某一点等。想到这里我们就引出今天 的主要 类--------PathMeasure,字面意思很容易理解--翻译成 路径测量。对这就是我们用来测量路径的类。既然是一个类,我们就要看他集体有哪些方法和属性。

1.构造方法:

一个是有参数,一个无参数。

无参数就很容易理解就是直接创建对象,那有参数呢?

PathMeasure(Path path, boolean forceClosed) ;第一个参数 Path  咿 !这不就是我们的Path 了吗。对既然是测量类,那就是要确定需要测量的那个路径,那第二个参数呢?

第二个参数是用来确保 Path 闭合,如果设置为 true, 则不论之前Path是否闭合,都会自动闭合该 Path(如果Path可以闭合的话)。

2.方法:

这方法还挺多,都是干啥的呢?就找几个重要的,常用的讲讲:

第一个那就是 setPath(Path path, boolean forceClosed)

这方法一看就知道设置path 路径的,就是如果我们创建 PathMeasure,时用的是无参的构造方法时 ,这时候就要用此方法,告诉PathMeasure 当前需要测量的是哪一个path路径。(个人喜欢用无参,比较灵活)。

第二个那就是getLength(),很容易理解就是 获得 path 的总长度。

第三个:getSegment(float startD, float stopD, Path dst, boolean startWithMoveTo),这个方法非常重要,截取片段,截取的结果就是,我们的path路径。参数也很好理解。第一个是开始的距离,第二个是结束的距离(相对于起点==既然是起点,我们怎么找他们的起点呢,其实就是我们绘制图画笔开始的哪一点)。第三个参数就是返回的路径。第四个参数起始点是否使用 moveTo 用于保证截取的 Path 第一个点位置不变。

第四个:getPosTan(float distance, float[] pos, float[] tan),这个也是非常重要的,为什么呢?听我解释一下他的参数就知道了。第一个参数是距离(相对于绘制起点的路径距离),第二个参数是距离起点的坐标点,第三个参数返回的是正玄函数tan@角度。

对这些参数了解之后下面就来讲解我们今天的例子:

首先我们先来个简单的:例如

Android自定义view Path 的高级用法之搜索按钮动画

如图这样的分析过程:

Android自定义view Path 的高级用法之搜索按钮动画

首先绘制一个圆(蓝色的),从45度开始绘制,注意圆的起点。

同圆心绘制大圆(辅助圆)用来辅助绘制蓝色的线。

通过getPosTan(float distance, float[] pos, float[] tan)方法得到两个圆的终点的坐标。

利用lineTo(x,y)绘制线。就得到我们的搜索图形了。

接下来就是实时 截取片段。getSegment(float startD, float stopD, Path dst, boolean startWithMoveTo),截取从距离0到getlength();这样就产生了一个动态的效果了。

看代码:

关于画笔,canvas画布,valueanimator动画,这些请看之前的博客,都有详细讲解。

public class MySearch extends View {  Paint paint;  Path searchPath; //搜索的圆  Path ciclePath; //外圆  //获得宽高  int w;  int h;  //这是保存截取时,返回的坐标点  float serpos[];  float cicpos[];  //测量 path 的类  PathMeasure measure;  //动画产生的实时数据  float value;  public MySearch(Context context) {    this(context,null);  }  public MySearch(Context context, @Nullable AttributeSet attrs) {    this(context,attrs,0);  }  public MySearch(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {    super(context, attrs, defStyleAttr);    //获得屏幕的宽高    WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);    w = wm.getDefaultDisplay().getWidth();    h = wm.getDefaultDisplay().getHeight();    //初始化数据    serpos = new float[2];    cicpos = new float[2];    //画笔    paint = new Paint();    paint.setStyle(Paint.Style.STROKE);    paint.setDither(true);    paint.setStrokeWidth(6);    paint.setAntiAlias(true);    //初始化路径    initPath();    //初始化动画    initAnimator();  }  @Override  protected void onDraw(Canvas canvas) {    super.onDraw(canvas);    //移动画布的远点到屏幕中心    canvas.translate(w/2,h/5);    paint.setColor(Color.BLUE);    //这是截取方法返回的路径    Path dra = new Path();    //解除硬件加速,不然没效果    dra.reset();    dra.lineTo(0,0);    //设置当前需要测量的path    measure.setPath(searchPath,false);    //开始截取    boolean s = measure.getSegment(measure.getLength()*value,measure.getLength(),dra,true);    //绘制路径    canvas.drawPath(dra,paint);  }    public void initPath(){    paint.setColor(Color.BLUE);    //搜索的圆    searchPath = new Path();    RectF rectF = new RectF(-50,-50,50,50);    searchPath.addArc(rectF,45,359.9f);    //辅助圆    ciclePath = new Path();    RectF rectF1 = new RectF(-100,-100,100,100);    ciclePath.addArc(rectF1,45,359.9f);    //测量类    measure = new PathMeasure();    measure.setPath(searchPath,false);    //获取坐标    measure.getPosTan(0,serpos,null);    measure.setPath(ciclePath,false);    //获取坐标    measure.getPosTan(0,cicpos,null);    //根据两点坐标绘制线    searchPath.lineTo(cicpos[0],cicpos[1]);  }    public void initAnimator(){    ValueAnimator animator = ValueAnimator.ofFloat(0,1);    animator.setDuration(2600);    animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {      @Override      public void onAnimationUpdate(ValueAnimator animation) {        value = (float) animation.getAnimatedValue();        postInvalidate();      }    });    animator.start();  }}

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Android自定义view Path 的高级用法之搜索按钮动画

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Android自定义view Path 的高级用法之搜索按钮动画

关于Path之前写的也很多了,例如path绘制线,path绘制一阶,二阶和三阶贝塞尔路径,这些都是path的基本用法。今天我要带大家看的是Path 的高级用法,先上图,再吹。效果大致是这样的。看着是不是挺好。话不多说,切入正题:既然今天要谈
2023-05-31

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录