效果图如下:


方法一(实现原理,主要依靠移动动画),主要代码如下:


private OnTouchListener gonggaoOnTouch() {        return new OnTouchListener() {            @Override            public boolean onTouch(View v, MotionEvent event) {                // TODO Auto-generated method stub                switch (event.getAction()) {                case MotionEvent.ACTION_DOWN: {                    break;                }                case MotionEvent.ACTION_UP: {                    if (mAdsV.getTop() == mSlipRl.getTop() && moveY < 0) {                        topTag();                    } else if (moveY < -200) {                        topTag();                    } else {                        nextTag();                    }                    break;                }                }                gestureDetector.onTouchEvent(event);                return true;            }            private void topTag() {                animBuilder.setDurationMillis(400).setFromYValue(formY)                        .setToYValue(mAdsV.getTop() - mSlipRl.getTop());                bgMoveAnim = animBuilder.build();                bgMoveAnim.setAnimationListener(new AnimationListener() {                    @Override                    public void onAnimationStart(Animation animation) {                        // TODO Auto-generated method stub                    }                    @Override                    public void onAnimationRepeat(Animation animation) {                        // TODO Auto-generated method stub                    }                    @Override                    public void onAnimationEnd(Animation animation) {                        // TODO Auto-generated method stub                        mSlipRl.clearAnimation();                        setLayout(mSlipRl, 0, mAdsV.getTop(), 0);                        mSlipRl.invalidate();                    }                });                mSlipRl.startAnimation(bgMoveAnim);            }            private void nextTag() {                animBuilder.setDurationMillis(400).setFromYValue(formY)                        .setToYValue(mAdsV.getBottom() - mSlipRl.getTop());                bgMoveAnim = animBuilder.build();                bgMoveAnim.setAnimationListener(new AnimationListener() {                    @Override                    public void onAnimationStart(Animation animation) {                        // TODO Auto-generated method stub                    }                    @Override                    public void onAnimationRepeat(Animation animation) {                        // TODO Auto-generated method stub                    }                    @Override                    public void onAnimationEnd(Animation animation) {                        // TODO Auto-generated method stub                        mSlipRl.clearAnimation();                        setLayout(mSlipRl, 0, mAdsV.getBottom(), 0);                        mSlipRl.invalidate();                    }                });                mSlipRl.startAnimation(bgMoveAnim);            }        };    }


方法二,主要代码如下:


@Override    public boolean dispatchTouchEvent(MotionEvent event) {        // TODO Auto-generated method stub        switch (event.getAction()) {        case MotionEvent.ACTION_DOWN:            lastY = event.getY();            if(null==mLocationSlip||null==mSlipDown||null==mSlipMove){                mLocationSlip = this.findViewById(R.id.location_slip);                mSlipDown = this.findViewById(R.id.down_slip);                mSlipMove = this.findViewById(R.id.move_slip);            }            top = mSlipMove.getTop();            bottom = mSlipDown.getBottom();            if (top <= lastY && lastY <= (bottom + top)) {                isMove = true;                return true;            }        case MotionEvent.ACTION_MOVE:            if (isMove) {                float newY = event.getY();                int ay = (int) ((lastY - newY) * 0.5);                lastY = newY;                mSlipMove.offsetTopAndBottom(-ay);            }            break;        case MotionEvent.ACTION_UP:            if (isMove) {                isMove = false;                top = mSlipMove.getTop();                System.out.println(top + "====" + bottom + "==="+ mLocationSlip.getBottom()*2/3);                if(!location&&top<(mLocationSlip.getBottom()*2/3)){                    setLayout(mSlipMove, 0, 0, 0);                    location=true;                }else if(location&&top>(mLocationSlip.getBottom()*1/3)){                    setLayout(mSlipMove, 0, mLocationSlip.getBottom(), 0);                    location=false;                }else if(!location){                    setLayout(mSlipMove, 0, mLocationSlip.getBottom(), 0);                }else{                    setLayout(mSlipMove, 0, 0, 0);                }            }            break;        }        return super.dispatchTouchEvent(event);    }



主要知识点,就是重新设置了View的位置,android 3.0之后View可以同setTop(),setLeft()等一系列方法直接设置位置方便了开发。3.0之前位置变化设置方法:


/**     * 给view重置位置     * @param view     * @param x     * @param y     * @param b     */    public void setLayout(View view, int x, int y, int b) {        MarginLayoutParams margin = new MarginLayoutParams(                view.getLayoutParams());        margin.setMargins(x, y, 0, b);        RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(                margin);        view.setLayoutParams(layoutParams);    }


文章涉及知识点不多,相信一看就懂。如有问题,留言


下载移步:可滑动的View




更多相关文章

  1. android获得mac和ip
  2. Android进程与线程基本知识四
  3. 【android】当数据库需要更新时我们该怎么办?
  4. cocos2dx 移植android 报错
  5. Android使用AttributeSet自定义控件的方法
  6. Android底部导航栏实现(四)之TabLayout+ViewPager
  7. android-仿QQtab
  8. 让Android不播放关机动画,而是显示一个关机进度条的方法
  9. Android(安卓)图片加载库Glide

随机推荐

  1. Android—使用ShareSDK实现新浪微博分享
  2. RxJava版本冲突:More than one file was f
  3. android基础入门生命周期(1)
  4. 【Android(安卓)Studio】Camera.Paramete
  5. [置顶] Android(安卓)JavaPoet 动态生成J
  6. Mars之android的Handler(2)
  7. Android(安卓)好的源码依赖包 收集
  8. Cordova开发环境搭建
  9. android 开发技巧(10)--为背景添加圆角边
  10. Android解析JSON方式(一)服务器端生成JSO