如何使用ScaleAnimation在android中将布局缩放到特定大小(不是相对大小)?

问题描述:

我在我的activity_main.xml布局中有一个RelativeLayout。我已经定义其宽度高度作为分别250dp48dp如在我的XML片段所示的下方。如何使用ScaleAnimation在android中将布局缩放到特定大小(不是相对大小)?

现在我想动画(缩放)宽度从该值(默认值)48dp,(支点应该是右边缘)。我试图使用ScaleAnimation,ValueAnimation,ObjectAnimation这样做,但似乎他们工作在相对值

如果可能,我想使用ScaleAnimation来做到这一点。

这是我的RelativeLayout:

<RelativeLayout 
    android:layout_width="250dp" 
    android:layout_height="48dp" 
    android:id="@+id/layout_1" 
    android:layout_below="@id/default_layout" 
    android:layout_centerHorizontal="true" 
    android:background="@drawable/round_corner_layout_1"> 


     ... 


</RelativeLayout> 

这是我scaleAnimate方法:

private void scaleAnimate(long startOffSet, int fromX, int fromY, int toX, int toY, int pivotTypeX, int pivotTypeY, float pivotX, float pivotY, int duration, Interpolator interpolator, final View... v){ 

    Animation animation = new ScaleAnimation(fromX, toX, fromY, toY, pivotTypeX, pivotX, pivotTypeY, pivotY); 
    animation.setDuration(duration); 
    animation.setFillAfter(true); 
    animation.setInterpolator(interpolator); 
    animation.setStartOffset(startOffSet); 

    for(View view : v){ 
     view.setVisibility(View.VISIBLE); 
     view.startAnimation(animation); 
    } 
} 

编辑:

这是我想动画布局。我试图创建一个图像,下面链接,解释我想要做的事情。布局内

Layout Scaling Interpretation

意见将阿尔法动画为0(我可以完全阿尔法它的动画没有什么问题有:d)。左边是缩放后的布局,右边是缩放后的布局。缩放后,圆角应该形成一个圆。这就是为什么高度和宽度都需要相同(48dp)。左(顶部和底部)角落都向右(顶部和底部)角落移动。右边缘将保持静止。右边是枢轴。

对于支持不同分辨率的设备,可以将初始宽度和高度更改为wrap_content。别担心。但是在布局动画之后,高度和宽度需要相同,才能形成一个圆圈。

+0

为什么你需要使用特定的尺寸? Android支持超过10k设备与多个屏幕大小! –

+0

我编辑过的问题。我试图解释我究竟在做什么:) –

比例属性通过乘以其原始大小来影响视图的大小,因此它们不适合用于将动画设置为绝对大小,正如您找到的那样。

相反,使用ValueAnimator结合AnimatorUpdateListener来设置视图的宽度。

ValueAnimator anim = ValueAnimator.ofInt(v.getMeasuredWidth(), END_WIDTH); 
anim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { 
    @Override 
    public void onAnimationUpdate(ValueAnimator animator) { 
     ViewGroup.LayoutParams params = v.getLayoutParams(); 
     params.width = (int) animator.getAnimatedValue(); 
     v.setLayoutParams(params); 
    } 
}); 
... 
anim.start(); 
+0

我已经编辑了问题,能够解释我正在尝试做什么。希望我的查询会很清楚:) –

+0

即使在编辑之后,我相信我上面的答案就是你要找的。 –