Android:隐藏屏幕顶部边缘的视图

Posted

技术标签:

【中文标题】Android:隐藏屏幕顶部边缘的视图【英文标题】:Android: Hiding a view off the top edge of the screen 【发布时间】:2011-03-23 21:40:39 【问题描述】:

是否可以隐藏屏幕顶部边缘的视图,并且仅在用户向上滚动时才显示?

我的第一次尝试使用了滚动视图,但似乎除非我使用 postDelayed(它甚至不适用于 Post()),否则 scrollTo() 似乎不起作用。我尝试将它添加到滚动视图的视图树观察器 onPreDraw() 事件中,除非我延迟它,否则它仍然无法工作,因此首次启动活动时会出现一个丑陋的故障。

第二个问题是,如果屏幕键盘被最小化,视图不再需要滚动,因此使用滚动偏移量隐藏内容不再有效。我想过在代码中操纵高度,但这似乎很骇人听闻。

有比使用滚动视图更好的方法吗?或者,是否有人对放置 scrollTo 的最佳位置有任何提示(onCreate 的末尾不起作用,我尝试过的其他地方也不起作用)所以我不需要使用 postDelayed?这至少会消除一个故障。

谢谢!

这是我现在正在使用的代码,这是最少的故障,但我不明白为什么它直到第三次调用 onPreDraw() 才起作用。

mScrollView.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener()
    
        @Override
        public boolean onPreDraw()
        
            final int fieldYStart = mFieldIWantAtTheTop.getTop();

            if (mFieldIWantAtTheTopYStart != fieldYStart
             || mScrollView.getScrollY() < 10)
            
                mFieldIWantAtTheTopYStart = fieldYStart;

                mScrollView.post(new Runnable()
                
                    @Override
                    public void run()
                    
                        Log.v("Testing", "scrolling!");
                        mScrollView.scrollTo(0, mFieldIWantAtTheTopYStart);
                        Log.v("Testing", "scroll is now=" + mScrollView.getScrollY());
                    
                );
            


            return true;
        
    );

我也尝试使用下面提到的自定义滚动视图,但这并不能解决图形故障问题:

@Override
public void onMeasure(int measureWidthSpec, int measureHeightSpec) 
    super.onMeasure(measureWidthSpec, measureHeightSpec);
    Log.v("Testing", "Scrolling");
    post(
            new Runnable()
            
                public void run()
                
                    scrollTo(0, 100);
                    Log.v("Testing", "ScrollY = " + getScrollY()); 
                
            );       

此代码与上面的 onPreDraw() 代码一样工作,但在启动 Activity 时仍然存在故障,因为该 Activity 是在滚动为 0 时首次绘制的。

【问题讨论】:

【参考方案1】:

这个我没试过,但是你可能想创建一个自定义的 ScrollView 并覆盖 onMeasure:

ScrollView scroll = new ScrollView(this) 
    @Override
    public void onMeasure(int measureWidthSpec, int measureHeightSpec) 
        super.onMeasure(measureWidthSpec, measureHeightSpec);
        scrollTo(...);
    
;

这似乎是scrollTo 有效的最早点。

编辑 - 我找到了this answer,这显然对提问者有用。这是你试过的方法吗?

【讨论】:

是的,基本上,您必须等到第一个布局传递完成后才能滚动 ScrollView。 回复:链接:这有效(我不明白为什么,因为 scrollTo() 不起作用)但即使我使用的是 post(),也会出现明显的故障。现在我正在使用 onPreDraw() 并且滚动实际上只在第 3 次调用时起作用(我在 scrollTo 调用之后立即使用 getScrollY 进行检查,它直到 onPreDraw() #3 才起作用,但在这种情况下仍然存在一个小故障)。 你能尝试onMeasure方法吗? 我还没有尝试过 onMeasure 方法,因为我从未在 XML 和代码中使用过自定义视图,所以我必须先弄清楚这一点。我明天试试看。 好的,我试过了。 onMeasure 被调用了六次,每次我调用 scrollTo(0, 100) 但是当我检查 Y 值时,在 scrollTo 调用之后它仍然是 0。然后我通过将 scrollTo() 调用包装在 post() 中尝试了同样的事情,它可以工作,但我遇到的问题和以前一样。开始时有一个明显的故障,您可以看到活动“跳转”到新位置。

以上是关于Android:隐藏屏幕顶部边缘的视图的主要内容,如果未能解决你的问题,请参考以下文章

在视图中设置高度并忽略安全的顶部边缘

Android - V之DrawerLayout的使用

我已经隐藏了导航栏和状态栏,现在屏幕边缘平移手势返回不起作用,这是典型的吗?

《iOS Human Interface Guidelines》——Toolbar Bar

UICollisionBehavior 忽略屏幕边缘

如何在Android上显示2个视图,并具有渐变效果?