【问题标题】:animate listView childs only once they appear仅在它们出现时为 listView 子元素设置动画
【发布时间】:2014-08-08 07:15:39
【问题描述】:

我有一个包含大约 20 个项目(动态项目)的 listView。我想首先对这些项目进行动画处理,然后将它们显示给用户。类似于 Google+ 卡片。有几点我想达到的:

  1. 项目仅在用户开始看到它们时才具有动画效果。
  2. 项目仅动画一次。 (不是每次用户看到它们)
  3. 关于快速滚动的项目不要相互混淆。
  4. 动画根据项目的位置开始延迟。

到目前为止我已经尝试过:

  • LayoutAnimationController(此方法不满足第一个要求)
  • convertView.startAnimation(此方法不满足第二个要求)
  • convertView.startAnimation 带有一个标志,表明该位置的项目之前是否已动画(此方法不适用于 listView 中的第一个项目,因为对于 listView 中的第一个项目,getView 方法将被调用两次。(我不知道为什么!layout_height 和 layout_width 都是 match_parent))

我搜索了很多,但找不到解决方案。

顺便说一句,我不喜欢使用外部库。我以前见过this

谢谢。

【问题讨论】:

  • 请告诉我您有充分的理由避免使用外部库。尤其是开源库。学习,也许?
  • @Lo-Tan 好吧,我想在使用外部库进行学习之前我必须这样做一次,我认为这应该是一件容易的事。除了外部库会增加最终 APK 的大小,这对用户下载来说是一个负面因素。
  • 不过,阅读外部库是一种很好的学习方式。这是人们开源事物的原因之一 :) 另外,我曾在成员有避免使用库的习惯的团队工作过,它确实会影响交付日期、代码质量和维护水平——没有任何正当理由。你对 libs 的评论给了我一种奇怪的感觉。有时外部库是多余的,绝对可以跳过。这应该是一个经过深思熟虑的决定,并且 proguard 会剥离您不用于生产的代码,因此合理大小的库并不那么可怕。
  • @Lo-Tan 我再也不喜欢发明轮子了,但是在这个特殊的问题中,我想自己解决它是一个挑战,因为我认为这一定不是一个难题.顺便说一句,感谢您的帮助:)

标签: android listview animation android-listview


【解决方案1】:

我刚刚尝试过,它似乎满足您的所有要求:

boolean[] animationStates;

public void YourConstructor(...) {
    ...
    animationStates = new boolean[data.size()];
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    // (Re)Use the convertView
    if (convertView == null) {
        convertView = mInflater.inflate(R.layout.popup_list_item, parent, false);
        if (!animationStates[position]) {
            Log.e("TAG", "Animating item no: " + position);
            animationStates[position] = true;
            Animation animation = AnimationUtils.loadAnimation(mContext, R.anim.fade_in);
            animation.setStartOffset(position*500);
            convertView.startAnimation(animation);
        }
    }
    // Use convertView here
    return convertView;
}

如果您有兴趣,这是我的 fade_in.xml 文件:

<set
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:fillAfter="true">
    <alpha
        android:duration="1000"
        android:fromAlpha="0.0"
        android:toAlpha="1.0"/>
</set>

【讨论】:

  • 感谢您的回复。我试过这个方法,但是这个不符合第三个要求。如您所知,listView 使用回收的视图。这意味着当您快速滚动页面时,项目不会播放动画。
  • @NavidEivazzadeh 请进一步解释第三个要求。搞砸没有多大意义:-)
猜你喜欢
  • 2020-04-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-12
  • 1970-01-01
相关资源
最近更新 更多