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

来源:互联网 发布:矩阵相乘的共轭转置 编辑:程序博客网 时间:2024/05/29 19:57

刚拿到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);    }}
3 0
原创粉丝点击