利用递归算法和堆栈实现android思维导图大纲图的动态绘制

2017年5月7日新版解释及源码https://juejin.im/post/590ec7beda2f600053556598

刚拿到ui效果的时候,第一感觉很炫,但实现起来会很复杂,晚上在床上的时候才想到的实现思路。

先看效果图

正常模式的图:

这里写图片描述

擦除模式的图

这里写图片描述

两种模式随意交替

这里写图片描述

功能分析

首先每个按钮出现个数是不固定的,由服务端返回,当然层数也是不固定的,这样一来就只能用递归来实现,我的一位做ios的同事没有用递归,硬是写了7层循环,最多支持7层。下面是我的分析过程:

1.下一个按钮=当前按钮.onclick事件。
2.在正常模式下,每个按钮不能重复点击,防止重复绘制。
3.擦除模式和正常模式交替,只能使用栈去管理,按层数去擦除。

功能实现

我使用addview方法每次将按钮绘制到一个自定义的水平垂直滚动的view,方便用户随意拖拉,在button创建的时候记录button的内存值到栈中,方便removeview,画线封装了一个方法,入参为起点坐标、终点坐标、偏移量,偏移量的引入是防止同一层线条重复,偏移量大致和离顶部距离成正比。当然在绘制button的时候,要考虑数量,计算位置使得button对称,且不能超出上方。
递归方法
public void drawbutton(起点坐标,终点坐标,当前层数,其他信息){
    Button bt[];//定义一个bt数组并赋值
    //代码省略
    final int tree_current = tree_h;// 当前层数;
    for (int i = 0; i < bt.size(); i++) {
            bt[i] = new Button(Activity.this);
            bt[i].setBackgroundResource(R.drawable.partokbutton);//设置图片
            //代码省略
            //button动画
            ScaleAnimation animation = new ScaleAnimation(0.0f, 1.0f, 0.0f, 1.0f, Animation.RELATIVE_TO_SELF, 0.5f,
                        Animation.RELATIVE_TO_SELF, 0.5f);
            animation.setInterpolator(new BounceInterpolator());
            animation.setStartOffset(50);// 动画秒数。
            animation.setFillAfter(true);
            animation.setDuration(700);
            bt[i].startAnimation(animation);
            bt[i].setOnClickListener(new OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        //计算出下一层button信息
                        drawbutton(起点坐标,终点坐标,当前层数,其他信息);//递归算法
                        //如果是擦除模式出栈mstack.pop(tree_current);
                    }
            }
            //计算出每个button位置,add到主iew里,并画线。
            insertLayout.addView(bt[i], layoutParams[i]);
            mstack.push(view,tree_current);
    }
}
  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 25
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值