android高级UI之PathMeasure<一>--Path测量实战(各种Loading效果)

本文介绍了如何利用Android的PathMeasure类实现三种不同的Loading动画效果。首先,创建一个View,画出一个圆形路径,然后通过PathMeasure获取路径长度并动态改变图片位置和角度,实现箭头沿圆轨迹旋转。接着,利用getSegment()方法截取Path的部分路径,动态调整显示范围,创建第二个Loading效果。最后,结合getSegment()继续优化,实现第三个Loading动画。通过这些实践,加深了对PathMeasure的理解和应用。

在上一次https://www.cnblogs.com/webor2006/p/15488224.html已经学习上PathMeasure的基础了,这次则针对它进行一些实际效果的操练加以巩固。

实战:各种Loading效果:

Loading一:让箭头图片沿圆轨迹走

效果:

首先来实现在上篇开头所展示的这个效果:

 

如果对于上一篇的整体基础都了解之后,实现这样沿路径轨迹的效果那就很轻松了。

实现:

1、新建View:

这里还是基于上一次学习的工程往上继续垒代码:

2、 画园:

首先先准备一个中心的圆,待会它是就图片需要沿着运转的轨迹:

package com.cexo.pathmeasurestudy;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.util.AttributeSet;
import android.view.View;

import androidx.annotation.Nullable;

/**
 * Loading效果一:箭头图片沿圆路径旋转
 */
public class LoadingView extends View {

    private int viewWidth;
    private int viewHeight;
    private Paint circlePaint;

    public LoadingView(Context context) {
        this(context, null);
    }

    public LoadingView(Context context, @Nullable AttributeSet attrs) {
        this(context, attrs, -1);
    }

    public LoadingView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init(context);
    }

    private void init(Context context) {
        circlePaint = new Paint();
        circlePaint.setColor(Color.RED);
        circlePaint.setStrokeWidth(5);
        circlePaint.setStyle(Paint.Style.STROKE);
    }

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

        canvas.translate(viewWidth / 2, viewHeight / 2);

        Path path = new Path();
        //Path.Direction.CW顺时针方向画圆
        path.addCircle(0, 0, 200, Path.Direction.CCW);
        canvas.drawPath(path, circlePaint);
    }

    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
        super.onSizeChanged(w, h, oldw, oldh);
        viewWidth = w;
        viewHeight = h;
    }
}

比较简单,效果如下:

3、导入图片:

接下来则将需要沿这个圆轨迹移动的图片导进来:

4、将图片绘制在圆轨迹上:

此时的效果:

此时图片的绘制点则是在圆心上,不是咱们所预期的效果,应该是绘制在圆的轨迹上才行,此时很自然的就可以借助上一次学习的Path的测量,可以得到这俩值:

 

其中测量时的forceClosed参数的含义就不过多说明了,可以参考上一个基础篇,接下来的重点就是如何借助这个测量得到的pos和tan来将咱们的图片绘制在圆轨迹上了,这里可以将图片绘制的left和top改为它试试:

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

webor2006

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值