Android 自定义漏斗图FunnelView(二)

基于上次静态漏斗图做出改进:

  • 动态添加数据,根据集合数据动态展示;
  • 高度根据漏斗图数据自适配,根据数据量多少,漏斗图高度自动适配;
  • 顺利添加动画效果;
  • 各种手机型号自适配;
  • 加文字,加线条等需要的人士,参考早期版本;
  • 代码示例改日上传到github上
  • 代码地址FunnelView
 
有任何问题可以加本博客的qq群交流;


效果展示:



核心代码(完整代码见github):


public  void setData(List<Integer> moneys, int maxMoney,ArrayList<String> colors) {
    this.mMoneys = moneys;
    this.maxMoney = maxMoney;
    this.colors=colors;
    //初始化的时候需要停止来不及关闭的动画,引发不想看到的bug;
    stopAnimator();
    init();
    calculate();
    //提前算好填充数据的最大高度,这是关键;
//此方法不能放在onMeasure方法中进行测量 getMaxHight();
   requestLayout();
}
private void stopAnimator(){
    if (xAnimator!=null&&alphaAnimator!=null)
      if (xAnimator.isRunning()) {
        xAnimator.end();
        alphaAnimator.end();
     }
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    setMeasuredDimension(getMeasuredLength(widthMeasureSpec, true),
            getMeasuredLength(heightMeasureSpec, false));
}


private int getMeasuredLength(int length, boolean isWidth) {
    int specMode = MeasureSpec.getMode(length);
    int specSize = MeasureSpec.getSize(length);
    int size;
    if (specMode == MeasureSpec.EXACTLY) {
        size = specSize;
    } else {
        size = maxHight+(int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 10, getResources().getDisplayMetrics());
        Log.i("FunnelMain", "onMeasure:"+ size);
    }
    return size;
}
@Override
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    for (int i = 0; i < mMoneys.size(); i++) {
        draw2(canvas, mPaints.get(i), mPathAngleWidths.get(i), mPathHeights.get(i),i);
    }
}

ObjectAnimator xAnimator;
ObjectAnimator alphaAnimator;
public void animateY() {
    xAnimator = ObjectAnimator.ofFloat(this, "phaseX", 0, 1);
    xAnimator.setDuration(2000);
    xAnimator.addUpdateListener(this);
    xAnimator.setInterpolator(new AccelerateDecelerateInterpolator());
    xAnimator.start();

    alphaAnimator = ObjectAnimator.ofInt(this, "textAlpha", 0, 255);
    alphaAnimator.setDuration(2000);
    alphaAnimator.addUpdateListener(this);
    alphaAnimator.setInterpolator(new AccelerateDecelerateInterpolator());
    alphaAnimator.start();
}

private  void  calculate() {
    mPathHeights.clear();
    mPathAngleWidths.clear();
    for (int i = 0; i < mMoneys.size(); i++) {
        int money = mMoneys.get(i);
        float scale = (float) money / maxMoney;
        Float mPathHeight = mTotalHeight * scale * phaseX;
        if (mPathHeight < minLineH * phaseX) {
            mPathHeight = minLineH * phaseX;
        } else if (mPathHeight > maxLineH * phaseX) {
            mPathHeight = maxLineH * phaseX;
        }
        mPathHeights.add(i, mPathHeight);
        Float mPathAngleWidth = mPathHeight / ANGLE_SCALE;
        mPathAngleWidths.add(i, mPathAngleWidth);
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Arisono

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

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

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

打赏作者

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

抵扣说明:

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

余额充值