如何在滑动时显示或隐藏视图

3

我有一个Coverflow,下面是相机。当用户向上滑动Coverflow时,我想隐藏它并在全屏显示相机;当他向下滑动时,我想在屏幕的40%显示Coverflow,在其余部分显示相机。我该如何实现这个功能?

任何帮助都将不胜感激。

1
你能分享一下你尝试过的代码吗? - Shadow
1个回答

1
最后,我通过使用这个库中的代码https://github.com/gunasiet/SlidingMenuExample做到了这一点。
在这个库中,有一个类似于Facebook类型的滑出菜单,它水平滑出并显示菜单项。我想以同样的方式将Coverflow替换菜单。
我通过在菜单布局上更改x、y坐标来操作代码,并使其从顶部垂直滑动到底部时,从原来的水平滑动变为垂直滑动。
protected void onLayout(boolean changed, int left, int top, int right, int bottom)
    {
        // System.out.println(" ~~~onLayout changed="+changed);
        if (changed)
        {
            //
            LayoutParams contentLayoutParams = (LayoutParams) content.getLayoutParams();
            contentLayoutParams.height = this.getHeight();
            contentLayoutParams.width = this.getWidth();
            LayoutParams menuLayoutParams = (LayoutParams) menu.getLayoutParams();
            // menuLayoutParams.height = this.getHeight();
            // menuLayoutParams.width = this.getWidth() - menuRightMargin;
            menuLayoutParams.height = this.getHeight() - menuRightMargin;
            menuLayoutParams.width = this.getWidth();
        }
        // menu.layout(left, top, right- menuRightMargin , bottom );
        // content.layout(left + contentXOffset, top, right +
        // contentXOffset,bottom);

        menu.layout(left, top, right, bottom - menuRightMargin);
        content.layout(left, top + contentXOffset, right, bottom + contentXOffset);
        if (changed)
            if(!CameraFragment.isCoverFlowClosed)
                toggleMenu();
}

public void toggleMenu()
    {

        if (currentMenuState == MenuState.HIDING || currentMenuState == MenuState.SHOWING)
            return;

        // System.out.println(" ~~~toggleMenu currentMenuState="+currentMenuState);
        switch (currentMenuState)
        {
        case HIDDEN:
            currentMenuState = MenuState.SHOWING;
            menu.setVisibility(View.VISIBLE);
            //slideIcon.setBackground(context.getResources().getDrawable(R.drawable.down_arrow));
            //slideIcon.setBackgroundResource(R.drawable.down_arrow);
            /*
             * menuScroller.startScroll(0, 0, 0, menu.getLayoutParams().height,
             * SLIDING_DURATION);
             */
            menuScroller.startScroll(0, contentXOffset, 0, menu.getLayoutParams().height - contentXOffset, SLIDING_DURATION);
            break;
        case SHOWN:
            currentMenuState = MenuState.HIDING;
            menuScroller.startScroll(0, contentXOffset, 0, -contentXOffset, SLIDING_DURATION);
            //slideIcon.setBackground(context.getResources().getDrawable(R.drawable.up_arrow));
            //slideIcon.setBackgroundResource(R.drawable.up_arrow);
            break;
        default:
            break;
        }
        menuHandler.postDelayed(menuRunnable, QUERY_INTERVAL);
        this.invalidate();
    }

private void adjustContentPosition(boolean isScrolling)
    {
        int scrollerXOffset = menuScroller.getCurrY();

        // System.out.println("scrollerXOffset=="+scrollerXOffset+" contentXOffset="+contentXOffset
        // +" scrollerXOffset - contentXOffset="+(scrollerXOffset -
        // contentXOffset));
        // content.offsetLeftAndRight(scrollerXOffset - contentXOffset);
        content.offsetTopAndBottom(scrollerXOffset - contentXOffset);
        contentXOffset = scrollerXOffset;
        this.invalidate();
        fancyCoverFlow.bringToFront();
        if (isScrolling)
            menuHandler.postDelayed(menuRunnable, QUERY_INTERVAL);
        else
            this.onMenuSlidingComplete();
    }

public boolean onContentTouch(View v, MotionEvent event)
    {
        if (currentMenuState == MenuState.HIDING || currentMenuState == MenuState.SHOWING)
            return false;
        int curX = (int) event.getRawY();
        int diffX = 0;

        switch (event.getAction())
        {
        case MotionEvent.ACTION_DOWN:

            // System.out.println("~~~ ACTION_DOWN ~~~ curX="+curX);
            prevX = curX;
            return true;

        case MotionEvent.ACTION_MOVE:
            if (!isDragging)
            {
                // System.out.println("~~ currentMenuState=="+currentMenuState+" isDragging=="+isDragging);
                isDragging = true;
                menu.setVisibility(View.VISIBLE);

            }
            diffX = curX - prevX;
            // System.out.println("~~~ ACTION_MOVE ~~~ curX=="+curX+" prevX=="+prevX+" contentXOffset="+contentXOffset);
            if (contentXOffset + diffX <= 0)
            {
                diffX = -contentXOffset;
            } else if (contentXOffset + diffX > mainLayoutWidth - menuRightMargin)
            {
                diffX = mainLayoutWidth - menuRightMargin - contentXOffset;
            }
            // content.offsetLeftAndRight(diffX);
            content.offsetTopAndBottom(diffX);
            fancyCoverFlow.bringToFront();
            contentXOffset += diffX;
            this.invalidate();

            prevX = curX;
            lastDiffX = diffX;
            // System.out.println("~~~ ACTION_MOVE ~~~ contentXOffset="+contentXOffset+" diffX="+diffX);
            return true;

        case MotionEvent.ACTION_UP:
            Log.d("MainLayout.java onContentTouch()", "Up lastDiffX " + lastDiffX);

            if (lastDiffX == 0)
            {
                toggleMenu();
                isDragging = false;
                prevX = 0;
                lastDiffX = 0;
            }
            if (lastDiffX > 0)
            {
                currentMenuState = MenuState.SHOWING;
                // menuScroller.startScroll(contentXOffset, 0,
                // menu.getLayoutParams().width - contentXOffset, 0,
                // SLIDING_DURATION);
                menuScroller.startScroll(0, contentXOffset, 0, menu.getLayoutParams().height - contentXOffset, SLIDING_DURATION);
            } else if (lastDiffX < 0)
            {
                currentMenuState = MenuState.HIDING;
                menuScroller.startScroll(0, contentXOffset, 0, -contentXOffset, SLIDING_DURATION);
            }
            menuHandler.postDelayed(menuRunnable, QUERY_INTERVAL);
            this.invalidate();
            isDragging = false;
            prevX = 0;
            lastDiffX = 0;
            // System.out.println("~~~  ACTION_UP ~~~");
            return true;

        default:
            break;
        }

        return false;
    }

你能发布你的解决方案吗? - Halil

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接