控件随手指移动动画

前几天看到dove上有一个标题栏会随着listview滑动而缩小的动画,感觉很有意思,就尝试着做做看。

一开始希望能使用Toolbar,研究了半天,感觉里面封装的东西太多了,添加view很麻烦,想做类似豌豆荚或者dove的标题移动动画很麻烦。

最后就妥协用了LinearLayout来做标题栏。


做这种东西肯定就是onTouchListener + 移动布局了,就想到了以前做地图时候用到的代码。

看了一下,用的是getLayoutParams的height属性 (mTitleBar.getLayoutParams().height = mActionBarHeight )。

这个属性你可以直接给他赋值,然后加上一句mTitleBar.requestLayout();就可以改变布局了。

不过用这个做动画的时候,标题栏会一直抖动,非常愚蠢,我也不知道为什么,想想以前做的地图好像也是这样的。

应该是这种方法需要的资源比较多,估计是要一直重新生成这个view所以会变成这样。


然后就去看看前天用过的侧滑listview控件的源码。

这个控件的滑动是用view 的layout方法,这个方法我知道,就是移动view的位置,不用重新生成view,应该可以解决抖动的问题。

layout(int l, int t, int r, int b)

这样的方法,左、上、右、下,这个顺序有点奇怪。

if(mTitleBar.getBottom() + dip > mActionBarHeight){
            mTitleBar.layout(mTitleBar.getLeft(),mTitleBar.getTop(),mTitleBar.getRight(),mTitleBar.getBottom()+dip);
            mFrameContain.layout(mFrameContain.getLeft(),mFrameContain.getTop() + dip,mFrameContain.getRight(),mFrameContain.getBottom());

大概是这么用的。


里面的CONTIAN是一个默认值,用来进行点击的过滤,当移动距离太小的时候我们就把他通过touchshake这个属性过滤掉

mFriendListView.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                switch (event.getAction()){
                    case MotionEvent.ACTION_DOWN:
                        downY = event.getY();
                        break;
                    case MotionEvent.ACTION_MOVE:
                        float nY = event.getY() - downY;
                        touchshake = Math.abs(nY) < CONTIAN;
                        if(touchshake){
                            click = true;
                        }else{
                            click = false;
                            if(nY < 0 ){
                                //向上
                                mListener.scrollUp((int)nY);
                            }
                            else {
                                mListener.scrollDown((int)nY);
                            }
                        }
                }
                return false;//当返回true的时候会把listview的滚动监听截断,返回false的话不会

            }
        });


这个是再主界面中对已title的操作
 @Override
    public void scrollUp(int dip) {
        if(mTitleBar.getBottom() + dip > mActionBarHeight){
            mTitleBar.layout(mTitleBar.getLeft(),mTitleBar.getTop(),mTitleBar.getRight(),mTitleBar.getBottom()+dip);
            mFrameContain.layout(mFrameContain.getLeft(),mFrameContain.getTop() + dip,mFrameContain.getRight(),mFrameContain.getBottom());
        }else{
            mTitleBar.layout(mTitleBar.getLeft(),mTitleBar.getTop(),mTitleBar.getRight(),mActionBarHeight);
            mFrameContain.layout(mFrameContain.getLeft(), mActionBarHeight, mFrameContain.getRight(), mFrameContain.getBottom());
        }
    }

    @Override
    public void scrollDown(int dip) {
        if(mTitleBar.getBottom() + dip<= mActionBarHeight * 2){
            mTitleBar.layout(mTitleBar.getLeft(),mTitleBar.getTop(),mTitleBar.getRight(),mTitleBar.getBottom()+dip);
            mFrameContain.layout(mFrameContain.getLeft(),mFrameContain.getTop() + dip,mFrameContain.getRight(),mFrameContain.getBottom());
        }else{
            mTitleBar.layout(mTitleBar.getLeft(),mTitleBar.getTop(),mTitleBar.getRight(),mActionBarHeight * 2);
            mFrameContain.layout(mFrameContain.getLeft(), mActionBarHeight * 2, mFrameContain.getRight(), mFrameContain.getBottom());
        }
    }


  突然发现这样之后就可以愉快的使用Toolbar了!!


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值