滑动ListView时,项目变大

4
我想在Android中实现一个列表效果,就像Ultravisual iPhone应用程序中显示的那样:
类似的效果可以在Expo Milano 2015 Android应用程序中查看。
我希望在滑动ListView时,顶部的项目变大。
我不知道如何做到这一点...是当前视图中第一个项目上的动画吗?
如果有人有例子或线索来实现这一点,那就太好了!
谢谢

请先告诉我们你已经做了什么。你有什么,你的适配器,你的布局等等。 - Pedro Oliveira
我已经使用自定义的list_item.xml包含imageView和文本完成了listView。使用自定义适配器,listView被良好地显示出来。但是到目前为止,所有的项目都以相同的全尺寸显示... - Chol
1个回答

7

我试图实现这个效果,看起来是这样的:

enter image description here

首先你需要定义最大和最小字体大小。我这样做了:

private final int MAX_FONTSIZE=50;
private final int MIN_FONTSIZE=12;

接下来您需要保存屏幕的总高度。在您的onCreate中,按照以下方式保存:

    WindowManager wm = (WindowManager) getSystemService(Context.WINDOW_SERVICE);
    Display display = wm.getDefaultDisplay();
    Point size = new Point();
    display.getSize(size);
    mScreenHeight = size.y;

然后覆盖您的listview onScroll事件,并执行以下操作:
        @Override
        public void onScroll(AbsListView view, int firstVisibleItem,int visibleItemCount, int totalItemCount) {
            if(listview.getChildCount()>0)
            for(int i=0;i<listview.getChildCount();i++)
            {
                float font = Math.min(Math.max(MAX_FONTSIZE - (float)(((MAX_FONTSIZE-MIN_FONTSIZE)/(mScreenHeight*0.3)))*Math.max(listview.getChildAt(i).getTop(),0),MIN_FONTSIZE),MAX_FONTSIZE);
                ((TextView)listview.getChildAt(i)).setTextSize(font);
            }
        }

“0.3”意味着在屏幕约30%的位置上,它将始终是最小字体大小。您可以根据需要调整该值。请记住,“listview.getChildAt(i)”将返回您在适配器上填充的视图。在我的情况下,它只是一个简单的textview,这就是为什么将其强制转换为TextView是安全的原因。您可能需要调用findViewById来获取您的TextView。
您还可能需要使TextView居中,以使其更漂亮。
“EDIT”:
由于op想要改变视图的大小(不应使用此代码),因此这里有一些hack可以做到这一点。首先将您的min / max常量更改为所需值(100和250)。然后继续创建一个控制listview是否正在滚动的标志。在onScrollStateChanged中添加此行:isScrolling=i==SCROLL_STATE_TOUCH_SCROLL||i==SCROLL_STATE_FLING;其中 i 是onScrollStateChanged的第二个参数。接下来,将行更改为if(listview.getChildCount()> 0 &&& isScrolling)。下一步是更改视图高度。要执行此操作,您必须更改其layoutParams。 listview.getChildAt(i).setLayoutParams(new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,Math.round(font*getResources().getDisplayMetrics().density))); 请记住,像我说的那样,这只是一个简单的hack。这绝非是解决此问题最好的方法。但由于这是一个复杂的事情,让我们坚持基础知识。

如果你想获取视图的根,请不要调用findViewById。listViewItems.getChildAt(i)将为您获取根。至于v.getChildCount,我已经更新了答案。v代表您的ListView。 - Pedro Oliveira
在滚动期间更改视图大小会多次调用滚动,使其递归,并且会消耗大量内存。此外,所有视图都会闪烁一下。你提供的示例使用的是scrollview而不是listview,并且完全自定义。你想要实现的东西非常难做到,我建议如果你不熟悉实现自己的控件,最好坚持基础知识。 - Pedro Oliveira
好的,当我调整视图大小时,这就是我看到的... 我会尝试实现自己的滚动视图,但正如你所说,这似乎很难做到。 感谢你的帮助! - Chol
你的 Hack 起作用了!但正如你所说,它不是最好的解决方案,有一些限制(剪辑、最后一项不滚动)。 因此,我开始实现我的 scrollView,我已经使用滚动监听器做好了准备。 - Chol
很高兴我的解决方案在某种程度上启发了您。实现自己的列表视图做得很好。 - Pedro Oliveira
显示剩余2条评论

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