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);
}
}