Android:三个listviews平滑动画

时间:2014-01-17 21:37:49

标签: android listview animation

我确实在动画三个列表视图方面存在严重问题,动画流程如下图所示 Initial View

When User Press on Item, List 1 should shrink to 1/4 of its width , and list2 slide from right to left

When User Press on Item in list2, List 1 should shrink to 0, list 2 should shrink to 1/4 of its width , and list3 slide from right to left

这是我的布局文件                

<ListView android:id="@+id/categoriesList"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layerType="hardware">       
</ListView>

<ListView android:id="@+id/subCategoriesList"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layerType="hardware">        
</ListView>

<ListView android:id="@+id/productsList"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layerType="hardware">        
</ListView>

这是我的代码

项目点击监听器上的list1的

long time = AnimationUtils.currentAnimationTimeMillis();            
collapseSize = (int)(categoriesListView.getMeasuredWidth() / 4);
ObjectAnimator animator = new ObjectAnimator();
animator.setTarget(subCategoriesListView);
animator.setPropertyName("translationX");
animator.setFloatValues(3*collapseSize,0);
animator.setStartDelay(time);
animator.setDuration(1000);
animator.addUpdateListener(ShopFragment.this);
ValueAnimator.ofObject(new WidthEvaluator(categoriesListView), categoriesListView.getWidth(),collapseSize).setDuration(1000).start();
animator.start();

for list2 onItemClick Listener

ObjectAnimator animator = new ObjectAnimator();
animator.setTarget(productsListView);
animator.setPropertyName("translationX");
animator.setFloatValues(collapseSize,0);
animator.setStartDelay(time);
animator.setDuration(1000);
ValueAnimator.ofObject(new WidthEvaluator(categoriesListView),
categoriesListView.getWidth(),0).setDuration(1000).start();

ValueAnimator.ofObject(new WidthEvaluator(subCategoriesListView), subCategoriesListView.getWidth(),collapseSize).setDuration(1000).start();
animator.start();

这是宽度评估器

private class WidthEvaluator extends IntEvaluator {
   private View v;
   public WidthEvaluator(View v) {
       this.v = v;
   }

   @Override
   public Integer evaluate(float fraction, Integer startValue,
            Integer endValue) {
  int num = (Integer)super.evaluate(fraction, startValue, endValue);
  ViewGroup.LayoutParams params = v.getLayoutParams();
  params.width = num;
  v.setLayoutParams(params);
  return num;
   }                        
 }

用户按后退按钮可以反转动画。主要问题是动画根本不流畅,只是跳到了新的位置。任何人都可以帮我解决这个问题吗?

注意:如果重要,那些列表视图位于片段内,而不是活动。另外,我使用九个库来向后兼容。

1 个答案:

答案 0 :(得分:0)

我不太确定你想要实现的目标,但我认为可以通过布局动画更简单地完成。我建议类似以下布局:

<LinearLayout
    android:layout_width="wrap_content"
    android:layout_height="fill_parent"
    android:animateLayoutChanges="true"
    android:orientation="horizontal">

    <ListView android:layout_width="100dp" ... />
    <ListView android:layout_width="300dp" ... />
    <ListView android:layout_width="300dp" ... />
</LinearLayout>

所以这是一个包含所有ListView的水平LinearLayout。请注意LinearLayout中的animateLayoutChanges设置。这意味着如果您在布局中调整大小或添加/删除视图,它将为您设置动画更改动画。现在,您可以设置第一个ListView的宽度,或将其设置为Visibility.GONE,它应该为您设置更改动画。您可以根据需要对其他ListView执行类似的操作。