Android 自定义漏斗图FunnelView(二)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qingfeng812/article/details/52356259

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

  • 动态添加数据,根据集合数据动态展示;
  • 高度根据漏斗图数据自适配,根据数据量多少,漏斗图高度自动适配;
  • 顺利添加动画效果;
  • 各种手机型号自适配;
  • 加文字,加线条等需要的人士,参考早期版本;
  • 代码示例改日上传到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);
    }
}

优秀的个人博客,低调大师

微信关注我们

原文链接:https://yq.aliyun.com/articles/685559

转载内容版权归作者及来源网站所有!

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。

相关文章

发表评论

资源下载

更多资源
优质分享Android(本站安卓app)

优质分享Android(本站安卓app)

近一个月的开发和优化,本站点的第一个app全新上线。该app采用极致压缩,本体才4.36MB。系统里面做了大量数据访问、缓存优化。方便用户在手机上查看文章。后续会推出HarmonyOS的适配版本。

Mario,低调大师唯一一个Java游戏作品

Mario,低调大师唯一一个Java游戏作品

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Oracle Database,又名Oracle RDBMS

Oracle Database,又名Oracle RDBMS

Oracle Database,又名Oracle RDBMS,或简称Oracle。是甲骨文公司的一款关系数据库管理系统。它是在数据库领域一直处于领先地位的产品。可以说Oracle数据库系统是目前世界上流行的关系数据库管理系统,系统可移植性好、使用方便、功能强,适用于各类大、中、小、微机环境。它是一种高效率、可靠性好的、适应高吞吐量的数据库方案。

Sublime Text 一个代码编辑器

Sublime Text 一个代码编辑器

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。