Android 一个条形动画加载效果

本文详细介绍了一种自定义的Android动画加载视图的实现过程,包括如何设置线条的颜色、宽度、高度、圆角和数量,以及动画的速度和幅度。通过定义属性并在XML中设置,实现了流畅的动画效果。

效果

完整代码,复制即用,请拉到底部效果图
可以对颜色、线条数、动画幅度、宽度等进行设置,上图只是一个基本的效果~

思路

  1. 先确定了想实现的效果是这样的:
    效果
  2. 整体分为中、高、低三种线,计算出三种线条的位置进行同步绘制
  3. 确定变化效果是每条线逐减,低到设定的最低值开始逐增,增到最高值再减

实现

  1. 定义属性
    //属性
    private int lineSpace;  //两条线之间的宽度
    private float changeStep; //动画幅度
    private int lineCount;  //堆数,每堆5根线条
    private int lineWidth;  //线宽度
    private int changeSpeed;    //变化速度  次/秒
    private int color;  //颜色
    private int width;  //通过动态计算得到
    private int maxHeight;  //最高高度
    private int minHeight;  //最低高度
    private float radius;   //线条弧度

设想是能自主控制线宽、线高、圆角、颜色、数量(每5个一堆)、动画幅度,用上面的参数基本能实现了
我定义了attr文件,用来在xml里面直接设置:

    <declare-styleable name="LineLoadingView">
        <attr name="lineWidth" format="dimension" />
        <attr name="changeStep" format="float" />
        <attr name="lineSpace" format="dimension" />
        <attr name="lineCount" format="integer" />
        <attr name="lineColor" format="color" />
        <attr name="lineMaxHeight" format="dimension" />
        <attr name="lineMinHeight" format="dimension" />
        <attr name="lineRadius" format="dimension" />
        <attr name="changeSpeed" format="integer"/>
    </declare-styleable>

changeSpeed单位是次/s ,每次变化幅度为changeStep* lineMaxHeightchangeStep是变化幅度,float取值

初始化这些属性:

        lineCount = typedArray.getInteger(R.styleable.LineLoadingView_lineCount, 1);//默认1
        lineWidth = (int) typedArray.getDimension(R.styleable.LineLoadingView_lineWidth, dip2px(3));    //默认3
        lineSpace = (int) typedArray.getDimension(R.styleable.LineLoadingView_lineSpace, dip2px(7));    //默认7
        color = typedArray.getColor(R.styleable.LineLoadingView_lineColor, Color.parseColor("#FFFFE105"));
        maxHeight = (int) typedArray.getDimension(R.styleable.LineLoadingView_lineMaxHeight, dip2px(50));
        minHeight = (int) typedArray.getDimension(R.styleable.LineLoadingView_lineMinHeight, dip2px(10));
        changeStep = typedArray.getFloat(R.styleable.LineLoadingView_changeStep, 0.1f) * maxHeight;    //默认0.1
        changeSpeed = typedArray.getInt(R.styleable.LineLoadingView_changeSpeed, dip2px(6));
        radius = typedArray.getDimension(R.styleable.LineLoadingView_lineRadius, dip2px(3));

        width = lineCount * 4 * (lineSpace + lineWidth) + lineWidth;
  1. 绘制图像
    因为有3种高度的线,因此每个中间值需要三个,定义如下:
    //draw用到的中间参数
    private int tempHeight = 0; // 全局高度
    private int minTempHeight;  //最低线条的高度记录(0,4)
    private boolean minLowing;
    private int middleTempHeight;   //中等高度线条的高度记录(1,3)
    private boolean middleLowing;
    private int maxTempHeight;  //最高线条的高度记录(2)
    private boolean maxLowing;
    private List<Integer> minList = new ArrayList<>();
    private List<Integer> middleList = new ArrayList<>();
    private List<Integer><
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值