天天看点

仿火车出票效果

发现里面有个火车票的出票效果,发现可以优化下:

仿火车出票效果

baseanimation内的仿出票效果

可是它的出的票的布局高度啥都是写死的,通过这个思路,我便想到要做个类似于数据是通过网络获取,高度不一定的listview的订单出票效果。

一.  思路:

1)叠在布局上层的是订单信息,而在下层的就是订单内菜单的详细条目,详细条目的布局是置于布局最底层,并且在订单信息相对位置下方,这里使用了framelayout来处 理 详细条目布局。

2)出票的详细条目列表采用了listview,它的动画初始位置要通过计算listview的总高度进行计算获取,之后通过translateanimation 进行animation动画。

3)采用线程来模拟网络获取延迟的效果。

二.  碰到解决的问题:

1)碰到一个问题,就是如果数据一多,超过了一屏幕,在动画过程中动画衔接效果就很差,并有可能出现断层效果。

解决:通过重写listview, 计算高度,并且在listview 外面嵌套了一层scrollview,这样便可以解决这样的问题。

2) 如果在订单信息布局下方直接放置一个listview的话,这样,动画时候,listview就会盖在订单信息上方。

解决:listview外层一定要嵌套一层布局,并且设定在订单信息下方,这样便不会产生上述问题。

3)由于订单底部

仿火车出票效果

一开始就是出现的,并且在数据刷新后跟随listview一起下滑。

解决:采用listview的addfooterview(底部view)方法,把它添加到listview底部,在开始添加完毕后就直接初始化让listview.setadapter(null);

这样便在开始底部就显示出来了。

4)如何去计算listview的总高度

解决:本demo采用了2种方式,

第一种:鉴于订单中每个item的布局都是固定的,于是在布局中设置item的高度为固定值,之后乘以listadapter.getcount() 加上分割线listview.getdividerheight() 的总高度

第二种:如果每个item的布局是高度是不一定的话,就会造成影响,便找了一些资料,使用了以下方法:

仿火车出票效果

/** listview 总高度 */  

public static int totalheight = 0;  

public static void setlistviewheightbasedonchildren(listview listview) {  

    listadapter listadapter = listview.getadapter();  

    if (listadapter == null) {  

        return;  

    }  

    totalheight = 0;  

    // 由于add了个footer,所以总量减去1  

    log.d("listadapter.getcount()", "" + listadapter.getcount());  

    for (int i = 0, len = listadapter.getcount() - 1; i < len; i++) {  

        view listitem = listadapter.getview(i, null, listview);  

        listitem.measure(0, 0);  

        totalheight += listitem.getmeasuredheight();  

        log.d("getmeasuredheight", "" + listitem.getmeasuredheight());  

    totalheight = totalheight + (listview.getdividerheight() * (listadapter.getcount() - 1));  

}  

计算得到了总高度。

5)实现动画效果

解决:

仿火车出票效果

      /** 

* 启动打印订单动画 

*/  

rivate void startanimation() {  

anim = new translateanimation(0.0f, 0.0f, -totalheight, 0);  

anim.setduration(1000);  

anim.setfillafter(true);  

anim.setanimationlistener(new animationlistener() {  

    @override  

    public void onanimationstart(animation animation) {  

        // todo auto-generated method stub  

    public void onanimationrepeat(animation animation) {  

    public void onanimationend(animation animation) {  

        clistview.clearanimation();  

});  

clistview.startanimation(anim);  

最后来看看动画效果把:

仿火车出票效果

由于是第一次写博客,有不足之处望各位大神提出意见和建议,共同进步。谢谢!

demo源码下载链接:

<a target="_blank" href="http://download.csdn.net/detail/vipzjyno1/7000355">http://download.csdn.net/detail/vipzjyno1/7000355</a>