首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何在Android中为视图设置动画并使其保持新的位置/大小?

在Android中为视图设置动画并使其保持新的位置/大小,可以使用以下方法:

  1. 使用ViewPropertyAnimator

ViewPropertyAnimator是一个用于创建和执行视图属性动画的类。它允许您在动画期间更改视图的位置、大小、透明度等属性。以下是一个示例:

代码语言:java
复制
View view = findViewById(R.id.my_view);
view.animate()
    .translationX(newPositionX)
    .translationY(newPositionY)
    .scaleX(newScaleX)
    .scaleY(newScaleY)
    .setDuration(animationDuration)
    .start();

在这个例子中,newPositionXnewPositionY是视图在动画结束后的新位置,newScaleXnewScaleY是视图在动画结束后的新大小,animationDuration是动画的持续时间(以毫秒为单位)。

  1. 使用ObjectAnimator

ObjectAnimator是一个用于创建和执行对象动画的类。它允许您更改视图的位置、大小、透明度等属性。以下是一个示例:

代码语言:java
复制
View view = findViewById(R.id.my_view);
ObjectAnimator animatorX = ObjectAnimator.ofFloat(view, "translationX", newPositionX);
ObjectAnimator animatorY = ObjectAnimator.ofFloat(view, "translationY", newPositionY);
ObjectAnimator animatorScaleX = ObjectAnimator.ofFloat(view, "scaleX", newScaleX);
ObjectAnimator animatorScaleY = ObjectAnimator.ofFloat(view, "scaleY", newScaleY);
AnimatorSet animatorSet = new AnimatorSet();
animatorSet.playTogether(animatorX, animatorY, animatorScaleX, animatorScaleY);
animatorSet.setDuration(animationDuration);
animatorSet.start();

在这个例子中,newPositionXnewPositionY是视图在动画结束后的新位置,newScaleXnewScaleY是视图在动画结束后的新大小,animationDuration是动画的持续时间(以毫秒为单位)。

  1. 使用TransitionManager

TransitionManager是一个用于管理场景过渡动画的类。它允许您在更改视图的位置、大小、透明度等属性时创建自然的过渡效果。以下是一个示例:

代码语言:java
复制
View view = findViewById(R.id.my_view);
TransitionManager.go(new Scene(view), new ChangeBounds().setDuration(animationDuration));

在这个例子中,animationDuration是动画的持续时间(以毫秒为单位)。

请注意,这些方法不会自动保持视图在动画结束后的新位置/大小。要实现这一点,您需要在动画结束后手动更新视图的布局参数。例如,您可以使用ViewGroup.MarginLayoutParams来更新视图的布局参数:

代码语言:java
复制
ViewGroup.MarginLayoutParams layoutParams = (ViewGroup.MarginLayoutParams) view.getLayoutParams();
layoutParams.leftMargin = newPositionX;
layoutParams.topMargin = newPositionY;
layoutParams.width = newWidth;
layoutParams.height = newHeight;
view.setLayoutParams(layoutParams);

这里的newWidthnewHeight是视图在动画结束后的新大小。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

  • Android 中的属性动画 --- 1(基本用法)

    动画在提高用户体验里面起了巨大的作用,可以说是提高用用户体验的“主力军”。在 Android 3.0 之前,视图动画几乎承担了所有的动画效果,但是视图动画有一个很大的局限性:它改变的只是某个 View 的外观。但是响应事件位置并没有随着 View 的改变而改变。举个 case 来说,现在有一个按钮通过视图动画在 x 轴方向上向右移动了 200 px(像素) 的距离,按钮显示的位置虽然改变了,但是点击移动后的按钮并不能相应点击事件,只有点击这个按钮没有移动之前的位置才能响应这个按钮的点击事件。由于这个巨大的局限性,Google 在 Android 3.0 以上添加了一个新的动画框架:属性动画。下面来一起看一下属性动画的用法:

    02

    响应视窗属性动画 | 让您的软键盘动起来 (二)

    .markdown-body{word-break:break-word;line-height:1.75;font-weight:400;font-size:15px;overflow-x:hidden;color:#333}.markdown-body h1,.markdown-body h2,.markdown-body h3,.markdown-body h4,.markdown-body h5,.markdown-body h6{line-height:1.5;margin-top:35px;margin-bottom:10px;padding-bottom:5px}.markdown-body h1{font-size:30px;margin-bottom:5px}.markdown-body h2{padding-bottom:12px;font-size:24px;border-bottom:1px solid #ececec}.markdown-body h3{font-size:18px;padding-bottom:0}.markdown-body h4{font-size:16px}.markdown-body h5{font-size:15px}.markdown-body h6{margin-top:5px}.markdown-body p{line-height:inherit;margin-top:22px;margin-bottom:22px}.markdown-body img{max-width:100%}.markdown-body hr{border:none;border-top:1px solid #ddd;margin-top:32px;margin-bottom:32px}.markdown-body code{word-break:break-word;border-radius:2px;overflow-x:auto;background-color:#fff5f5;color:#ff502c;font-size:.87em;padding:.065em .4em}.markdown-body code,.markdown-body pre{font-family:Menlo,Monaco,Consolas,Courier New,monospace}.markdown-body pre{overflow:auto;position:relative;line-height:1.75}.markdown-body pre>code{font-size:12px;padding:15px 12px;margin:0;word-break:normal;display:block;overflow-x:auto;color:#333;background:#f8f8f8}.markdown-body a{text-decoration:none;color:#0269c8;border-bottom:1px solid #d1e9ff}.markdown-body a:active,.markdown-body a:hover{color:#275b8c}.markdown-body table{display:inline-block!important;font-size:12px;width:auto;max-width:100%;overflow:auto;border:1px solid #f6f6f6}.markdown-body thead{background:#f6f6f6;color:#000;text-align:left}.markdown-body tr:nth-child(2n){background-color:#fcfcfc}.markdown-body td,.markdown-body th{padding:12px 7px;line-height:24px}.markdown-body td{min-width:120px}.markdown-body blockquote{color:#666;padding:1px 23px;margin:22px 0;border-left:4px solid #cbcbcb;background-color:#f8f8f8}.markdown-body blockquote:after{display:block;content:""}.markdown-body blockquote>p{margin:10px 0}.markdown-body ol,.markdown-body ul{padding-left:28px}.markdown-body ol li,.markdown-body

    02

    Android开发笔记(一百八十七)利用估值器实现弹幕动画

    如今上网看电影电视越发流行了,追剧的时候经常看到视频上方数行评论向左边飘去,犹如子弹那样飞快掠过,这些评论文字因此得名“弹幕”。弹幕评论由正在观看的网友们即兴发表,故而连绵不绝从画面右端不断涌现,直到漂至画面左端才隐没消失。 虽然弹幕效果可使用平移动画实现,但平移动画比较单调,只能控制位移,不能控制速率、文字大小、文字颜色等要素。若想同时操纵视图的多种属性要素,需要采用属性动画加以实现。 然而视图的位移大小由间距属性margin控制,该属性又分为上下左右四个方向,更要命的是,这几个margin并非视图View类的属性,而是布局参数LayoutParams的属性,意味着无法通过margin***直接构造属性动画对象。为了动态调整margin这种非常规属性,就要引入估值器实时计算当前的属性值,再据此设置自定义控件的状态参数。 以间距属性为例,它的动画步骤说明如下: 1、定义一个间距估值器,它实现了接口TypeEvaluator的evaluate方法,并在该方法中返回指定时间点的间距数值; 2、调用ValueAnimator类的ofObject方法,根据间距估值器、开始位置和结束位置构建属性动画对象; 3、调用属性动画对象的addUpdateListener方法设置刷新监听器,在监听器内部获取当前的间距数值,并调整视图此时的布局参数; 具体到编码实现上,需要自定义弹幕视图,其内部在垂直方向排列,每行放置一个相对布局。发表弹幕评论时,先随机挑选某行相对布局,在该布局右侧添加文本视图,再通过前述的间距动画向左渐次滑动。弹幕视图的定义代码示例如下:

    02
    领券