Android - 使用动画更改左边距

时间:2012-12-14 15:17:49

标签: android android-animation

我正在以下列方式更改图像视图的左边距:

ViewGroup.MarginLayoutParams layoutParams = (MarginLayoutParams) image.getLayoutParams ();
layoutParams.leftMargin = VALUE;
image.setLayoutParams ( layoutParams );

我希望保证金的变化适用于动画。有线索吗?

我尝试了什么:

ObjectAnimator objectAnimator = ObjectAnimator.ofFloat ( image , "x" , VALUE);
objectAnimator.start();

这很有效,因为图像通过动画移动到指定的X值, HOWEVER layoutParams.leftMargin 的值保持不变!!所以我不能使用这种方法,因为如果我在使用值<100的 objectAnimator 后尝试将 layoutParams.leftMargin 的值更改为100,则应用的值不正确(如果 objectAnimator 仍然存在,则应用200而不是100,尽管我以下列方式设置左边距:

layoutParams.leftMargin = 100;

4 个答案:

答案 0 :(得分:125)

使用动画类,而不是ObjectAnimator。

final int newLeftMargin = <some value>;
Animation a = new Animation() {

    @Override
    protected void applyTransformation(float interpolatedTime, Transformation t) {
        LayoutParams params = yourView.getLayoutParams();
        params.leftMargin = (int)(newLeftMargin * interpolatedTime);
        yourView.setLayoutParams(params);
    }
};
a.setDuration(500); // in ms
yourView.startAnimation(a);

请注意,您应该使用正确的LayoutParams类,即如果您的视图是LinearLayout的子视图,那么params应该是LinearLayout.LayoutParams

答案 1 :(得分:83)

我遇到了这个问题,但我无法使用它,因为我想将边距从负值设置为0,所以我使用valueAnimater基于user1991679回答:

final View animatedView = view.findViewById(R.id.animatedView);
final LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) animatedView.getLayoutParams();
ValueAnimator animator = ValueAnimator.ofInt(params.bottomMargin, 0);
animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
    @Override
    public void onAnimationUpdate(ValueAnimator valueAnimator)
    {
        params.bottomMargin = (Integer) valueAnimator.getAnimatedValue();
        animatedView.requestLayout();
    }
});
animator.setDuration(300);
animator.start();

您必须根据animatedView容器更改LinearLayout.LayoutParams。 此外,您可以使用nineoldandroids用于没有ValueAnimator的旧版本。

答案 2 :(得分:5)

来自user1991679的答案很棒,但如果您需要从0以外的任何其他值插入边距,则需要在计算中使用它:

ViewGroup.MarginLayoutParams params = (MarginLayoutParams) mBottomLayout.getLayoutParams();
final int bottomMarginStart = params.bottomMargin; // your start value
final int bottomMarginEnd = <your value>; // where to animate to
Animation a = new Animation() {
    @Override
    protected void applyTransformation(float interpolatedTime, Transformation t) {
        ViewGroup.MarginLayoutParams params = (MarginLayoutParams) mBottomLayout.getLayoutParams();
        // interpolate the proper value
        params.bottomMargin = bottomMarginStart + (int) ((bottomMarginEnd - bottomMarginStart) * interpolatedTime);
        mBottomLayout.setLayoutParams(params);
    }
};
a.setDuration(300);
mBottomLayout.startAnimation(a);

在我的情况下,我需要动画一个&#34;进入屏幕&#34;动画,来自&#34; -48dp&#34;如果没有起始值,则动画始终为0,因此跳跃,而不是为视图设置动画。解决方案是插入偏移并将其添加到原始值。

答案 3 :(得分:-4)

您可以使用以下

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 

您还可以添加image.animate().setDuration(durationIn).translationXBy(offsetFloat).start(); 来更改动画的外观。