【问题标题】:Navigation Drawer items animate only once导航抽屉项目仅动画一次
【发布时间】:2016-02-16 23:59:23
【问题描述】:

我有一个包含 5-10 个项目的导航抽屉。我为这些项目添加了动画,以便它们从左到右滑动。问题是这仅在我第一次打开抽屉时发生,其余时间没有动画。作为补救措施,我在 onDrawerOpened(View drawerView) 方法内的适配器上添加了 notifyDataSetChanged。现在项目每次都有动画,但它的效果就像

  1. 所有项目均无动画进入。
  2. 然后所有项目都在我面前重新创建。
  3. 然后它们会动起来。 希望大家有所了解。

所以我想要的是 => 每次我打开抽屉时,导航抽屉项目都必须从左到右动画,通过滑动和点击导航切换。

我的一些代码 sn-ps 来说明我做了什么 内部适配器膨胀视图:

 @Override
    public View getView(int position, LayoutInflater inflator, View convertView, ViewGroup parent) {
        if(convertView == null) {
            convertView = inflator.inflate(R.layout.base_drawer_nav_item, parent, false);
            ImageView nav_item_icon = (ImageView) convertView.findViewById(R.id.nav_item_icon);
            TextView nav_item_title = (TextView) convertView.findViewById(R.id.nav_item_title);
            nav_item_icon.setImageResource(this.icon);
            nav_item_title.setText(this.title);
        }
        if(convertView != null)
            setAnimation(convertView, position);

        return convertView;
    }

    private void setAnimation(View viewToAnimate, int position) {
        if(mContext != null) {
            Animation animation = AnimationUtils.loadAnimation(mContext, android.R.anim.slide_in_left);

            animation.setDuration(position * 50 + 200);
            viewToAnimate.startAnimation(animation);
        }
    }

导航抽屉所在的内部活动 - 在 onCreate() 方法中(请注意,我添加 notifyDataSetChanged 只是作为一种补救措施,它肯定不会像我预期的那样工作)

//some code above and below this

    drawerToggle = new ActionBarDrawerToggle(this, drawerLayout, toolbar, R.string.drawer_open, R.string.drawer_close) {
        @Override
        public void onDrawerOpened(View drawerView) {
            super.onDrawerOpened(drawerView);
            invalidateOptionsMenu();
            adapter.notifyDataSetChanged();
        }

        @Override
        public void onDrawerClosed(View drawerView) {
            super.onDrawerClosed(drawerView);
            invalidateOptionsMenu();
        }
    };

我的另一个想法是,我应该将所有视图保存在 ArrayList 中,然后在每次打开 navigationDrawer 时进行动画处理(使用 for loop + animation.start())虽然我没有实现。

【问题讨论】:

    标签: android animation navigation-drawer notifydatasetchanged


    【解决方案1】:

    您的方法 setAnimation() 不是设置动画,而是调用它并执行一次。所以每次你想要为行设置动画(例如滑动或点击)时,你都必须调用 setAnimation()

    编辑:notifyDataSetChanged 有效,因为它调用适配器中的 getView() 方法,最终将调用您的 setAnimation()

    EDIT2:可能是这样的:从适配器移动你的 setAnimation()。现在解决的办法不多,只好放在MainActivity中,然后做这个方法:

    public void setAnimation(int position){
        Animation animation = AnimationUtils.loadAnimation(mContext, android.R.anim.slide_in_left);
        animation.setDuration(position * 50 + 200);
        drawerListView.getChildAt(position).startAnimation(animation);
    }
    

    这将为一行设置动画,您可以轻松地从主要活动中调用它。

    如果您想要动画所有行,您可以在 for 循环中执行此操作并调用每个位置,但更好的方法是使用 AnimationSet

    【讨论】:

    • 你能告诉我应该遵循的正确方法吗,可能需要一些代码的帮助
    • 如果有效,请标记为答案。如果您需要更多帮助,可以在这里询问。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-13
    • 1970-01-01
    相关资源
    最近更新 更多