Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/231.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android-使用动画更改左边距_Android_Android Animation - Fatal编程技术网

Android-使用动画更改左边距

Android-使用动画更改左边距,android,android-animation,Android,Android Animation,我正在按以下方式更改图像视图的左边距: layoutParams.leftMargin = 100; ViewGroup.MarginLayoutParams layoutParams=(MarginLayoutParams)image.getLayoutParams(); layoutParams.leftMargin=值; image.setLayoutParams(layoutParams); 我想在保证金的变化,以适用于动画。有什么线索吗 我尝试的是: ObjectAnimator

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

layoutParams.leftMargin = 100;
ViewGroup.MarginLayoutParams layoutParams=(MarginLayoutParams)image.getLayoutParams();
layoutParams.leftMargin=值;
image.setLayoutParams(layoutParams);
我想在保证金的变化,以适用于动画。有什么线索吗

我尝试的是:

ObjectAnimator objectAnimator = ObjectAnimator.ofFloat ( image , "x" , VALUE);
objectAnimator.start();
这非常有效,因为图像通过动画移动到指定的X值,但是layoutParams.leftMargin的值保持不变!!因此,我无法使用此方法,因为如果在使用值为100的objectAnimator后尝试将layoutParams.leftMargin的值更改为100,则应用的值不正确(应用200而不是100,即使我以以下方式设置左边框,如果objectAnimator仍保持效果:

layoutParams.leftMargin = 100;

使用动画类,而不是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);
final int newLeftMargin=;
动画a=新动画(){
@凌驾
受保护的无效应用转换(浮点插值时间,转换t){
LayoutParams params=yourView.getLayoutParams();
params.leftMargin=(int)(newLeftMargin*interpolatedTime);
setLayoutParams(params);
}
};
a、 设置持续时间(500);//以毫秒为单位
你的观点。startAnimation(a);

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

我提出了这个问题,但我无法使用它,因为我想将边距从负值设置为0,所以我使用了ValueAnimator base用户1991679回答:

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。
对于没有ValueAnimator的旧版本,您也可以使用NineoAndRoid。

您可以使用以下命令

image.animate().setDuration(durationIn).translationXBy(offsetFloat).start();

您还可以添加
.setInterpolator(new BounceInterpolator())
来更改动画的外观。

用户1991679的回答很好,但是如果您需要从除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);
ViewGroup.MarginLayoutParams params=(MarginLayoutParams)mBottomLayout.getLayoutParams();
final int bottommargintart=params.bottomMargin;//开始值
final int bottomMarginEnd=;//设置动画的位置
动画a=新动画(){
@凌驾
受保护的无效应用转换(浮点插值时间,转换t){
ViewGroup.MarginLayoutParams params=(MarginLayoutParams)mBottomLayout.getLayoutParams();
//插入适当的值
params.bottomMargin=bottomMarginStart+(int)((bottomMarginEnd-bottomMarginStart)*插值时间);
mBottomLayout.setLayoutParams(参数);
}
};
a、 设定持续时间(300);
mBottomLayout.startAnimation(a);

在我的例子中,我需要制作一个来自“-48dp”的“进入屏幕”动画设置为0。如果没有起始值,动画始终为0,因此会跳跃,而不会设置视图动画。解决方案是插入偏移量并将其添加到原始值。

不要忘记设置持续时间,在设置持续时间之前,我遇到了一些问题:
a.setDuration(duration);
我尝试使用params.leftMargin时出错。显然这不是字段,因为有很多LayoutParams类。例如-ViewGroup.LayoutParams、FrameLayout.LayoutParams、LinearLayout.LayoutParams等。ViewGroup.LayoutParams没有leftMargin字段,但RelativeLayout.LayoutParams有。根据错误持续时间为0ms,因此您必须同时设置持续时间。如果我希望newLeftMargin为0,该怎么办?您可以使用动画类将边距从负值设置为0。没有任何限制。@user1991679以及如何使用
动画
类将边距从400设置为200?假设200是newMargin(我们应该设置动画的边距)400是currentMargin(我们所使用的marging)。在这种情况下,代码看起来像:@Override受保护的void applyTransformation(float interpolatedTime,Transformation t){LayoutParams params=yourView.getLayoutParams();params.leftMargin=currentMargin-(int)((currentMargin-newMargin)*interpolatedTime);yourView.setLayoutParams(params);}我用它进行了奇怪的重画。看起来我的布局经常抖动。@MikeMilla在FrameLayout中使用它,LinearLayout会产生不良效果。我尝试了这个。虽然结果是正确的位置,但它不再做动画了。你知道吗?如果我回到非计算的东西,动画效果会很好。。你可以在dir时设置断点通常在设置了起点之后,您可以看到输入的内容。如果它跳转,则意味着您分配了错误的值。在我的代码段中,从视图读取bottomMarginStart,假设视图应在其所在位置启动动画。