2014-01-17 30 views
0

我真的有动画三甲之列视图一个严重的问题,如显示在下面的图片 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> 

,这里是我的代码

对项目点击收听

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(); 

列表1的列表2 onItemClick监听

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; 
    }       
} 

用户按下后退按钮以反转动画。主要问题是动画根本不流畅,它只是跳到新的位置。谁能帮我解决这个问题吗?

注意:那些列表视图是在一个片段内而不是一个活动,如果重要的话。另外,为了向后兼容,我使用了九库。

+0

你在测试什么类型的设备? – Tyler

+0

您似乎在翻译视图,然后将该翻译转换为新的版面宽度值,是否正确?这是有原因的吗?这是有点奇怪,因为翻译覆盖布局的值。您是否考虑过直接使用ValueAnimator制作动画宽度,并在每次更新宽度时请求重新布局? –

+0

@TylerAndFriends我正在使用三星S3自定义ROM [4.3] –

回答

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> 

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