触摸事件平滑滚动

时间:2013-10-15 20:10:22

标签: android scroll

我目前有一个需要滚动触摸的视图(不能使用scrollview或scrollby)。目前您可以看到我只是添加.5f,这不是非常流畅或有用。我想要与更新的android中的下拉导航栏相同的效果(还需要知道每帧的当前Y偏移,以便它也可以用于计算其他效果)。

任何想法或帮助都将深表感谢。提前谢谢!

    drawerCardWallet.setOnTouchListener(new OnTouchListener() {

        @Override
        public boolean onTouch(View v, MotionEvent event) {

        if (event.getAction() == MotionEvent.ACTION_DOWN) { 
            if(mVelocityTracker == null) {
                mVelocityTracker = VelocityTracker.obtain();                                 
            }
            else {
                mVelocityTracker.clear();
            }
            mVelocityTracker.addMovement(event);
        }

        if (event.getAction() == MotionEvent.ACTION_MOVE) {                              

            moveY = event.getRawY();
            if(drawerCardWallet.getY() > topHeaderLayout.getBottom() || cardImage.getY() < (topFooterMainLayout.getHeight()*2) - (cardImage.getHeight()/100*25)) {
                cardCurrentOffset = cardImage.getY();
                drawerWalletCurrentOffset = drawerCardWallet.getY();
                mVelocityTracker.addMovement(event);
                mVelocityTracker.computeCurrentVelocity(1000);
                velocityX = VelocityTrackerCompat.getXVelocity(mVelocityTracker, pointerId);
                velocityY = VelocityTrackerCompat.getYVelocity(mVelocityTracker, pointerId);

                if(Math.abs(velocityX) + 100 > Math.abs(velocityY)) {
                    // right left
                }
                else {
                    // up down                          
                    if(event.getAction() != MotionEvent.ACTION_OUTSIDE) {                           
                        if(moveY > previousRawY) {
                            // Moving down

                            if(drawerCardWallet.getY() < screenHeight - (topFooterMainLayout.getHeight()*2) - (cardImage.getHeight()/100*25)) {                                 
                                for(float i=0;i<moveY-previousRawY;i++) {
                                    cardCurrentOffset += .5f;
                                    drawerWalletCurrentOffset += .5f;

                                    cardImage.setTranslationY(cardCurrentOffset);
                                    drawerCardWallet.setTranslationY(drawerWalletCurrentOffset);
                                }
                            }
                        }
                        else {
                            // Moving Up

                            if(drawerCardWallet.getY() >= topHeaderLayout.getHeight()+3) {

                                for(float i=0;i<previousRawY-moveY;i++) {
                                    cardCurrentOffset -= .5f;
                                    drawerWalletCurrentOffset -= .5f;

                                    cardImage.setTranslationY(cardCurrentOffset);
                                    drawerCardWallet.setTranslationY(drawerWalletCurrentOffset);
                                }
                            }
                        }

                        previousRawY = moveY;
                    }
                }
            }
        }
        if (event.getAction() == MotionEvent.ACTION_UP) {
            mVelocityTracker.addMovement(event);                                 
            mVelocityTracker.recycle();
        }

        if (event.getAction() == MotionEvent.ACTION_CANCEL) {
            mVelocityTracker.recycle();
        }
        return true;
    }
});

0 个答案:

没有答案