android 可滑动的View

   效果图如下:


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


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




本文出自 “KK技术” 博客,请务必保留此出处http://wangyubin.blog.51cto.com/6807757/1364425

android 可滑动的View,,5-wow.com

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。