- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有一个从一定百分比填充到另一个百分比 (0% - 50%) 的条。我想将它平滑地动画化到一个新的范围 (25% - 55%)。这意味着栏的宽度和位置都需要更改。我在同时顺利完成这两项操作时遇到了一些麻烦。
经过一些研究,我发现我需要使用 scaleX
来平滑地设置宽度的动画,并使用 translateX
来平滑地设置位置的动画(其中 translateX
是也受规模的影响)。现在出现的问题是条形图将超出其所需的百分比 (55%),然后移回,如下面的代码片段所示。
/* Button function to restart. */
const restart = () => {
animate();
}
const animate = () => {
/* Reset the bar to its starting position. (from 0% - 50%) */
Velocity(document.getElementById('movingBar'), {
scaleX: 0.5,
translateX: 0
},
{
duration: 0,
easing: [0, 0, 1, 1]
});
/* Move the bar to its final position. (from 25% - 55%). */
/* Split into two velocity calls so that they can have a seperate duration/easing if needed. */
Velocity(document.getElementById('movingBar'), {
scaleX: 0.30
},
{
duration: 1000,
easing: [0, 0, 1, 1],
queue: false
});
Velocity(document.getElementById('movingBar'), {
translateX: (25 / 0.30) + '%'
},
{
duration: 1000,
easing: [0, 0, 1, 1],
queue: false
});
};
/* Start animation on run. */
animate();
#root {
width: 700px;
height: 100%;
}
#container {
width: 100%;
height: 90px;
background-color: #000000;
}
.bar {
width: 100%;
height: 30px;
transform: scaleX(0.5);
transform-origin: left;
background-color: #FF0000;
}
#description {
display: flex;
}
.percentage {
display: flex;
justify-content: flex-end;
width: 10%;
height: 20px;
text-align: right;
}
.odd {
background-color: #DDDDDD;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/velocity/1.2.2/velocity.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/lodash@4.17.11/lodash.min.js"></script>
<div id='root' style='width: 100%; height: 100%'>
<div id='container'>
<div class="bar" style="background-color: #00FF00;"></div>
<div id='movingBar' class="bar"></div>
<div class="bar" style="background-color: #00FF00; transform: scaleX(0.30) translateX(calc(25 / 0.30 * 1%))"></div>
</div>
<div id='description'>
<div class="percentage even">10%</div>
<div class="percentage odd">20%</div>
<div class="percentage even">30%</div>
<div class="percentage odd">40%</div>
<div class="percentage even">50%</div>
<div class="percentage odd">60%</div>
<div class="percentage even">70%</div>
<div class="percentage odd">80%</div>
<div class="percentage even">90%</div>
<div class="percentage odd">100%</div>
</div>
<button onClick="restart()">restart</button>
</div>
该示例在顶部绿色条中显示起始位置,在底部绿色条中显示动画应到达的所需位置。中间的红色条是应该从起始位置到所需位置的动画条。正如您所看到的,红色条最终达到了预期的结果,但没有超过 55%。我目前正在使用 VelocityJS 制作动画。
知道我做错了什么或者我将如何制作动画吗?我是否需要对持续时间/缓和进行一些计算以纠正出现的问题?
最佳答案
问题与如何完成值的插值有关。确保使用 scaleX 和 translateX 进行全局线性变换将是一项艰巨的工作,因为您无法控制值的插值,而浏览器会为您执行此操作。因此,您要么对持续时间/缓动进行复杂的计算以找到完美的结果,要么考虑另一种动画。
对于这种情况,我会考虑 clip-path
,即使支持不是最佳的,但它会更容易处理,因为你只有一个属性需要动画,你不需要任何复杂的计算,因为您只需使用图表的百分比。
这是一个简化的例子:
body {
background:#000;
}
.box {
height:50px;
background:red;
clip-path:polygon(10% 100%,10% 0, 40% 0,40% 100%); /*from [10% 40%]*/
transition:1s all;
}
body:hover .box {
clip-path:polygon(50% 100%,50% 0, 60% 0,60% 100%); /*to [50% 60%]*/
}
<div class="box">
</div>
关于css - 同时使用 scaleX 和 translationX (VelocityJS),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55498117/
我的布局中有一个按钮。我正在使用带有 translationX 动画的 ObjectAnimator 为该按钮的位置设置动画。 ObjectAnimator btnAnimator = ObjectA
当我在 LinearLayout 中使 View 不可见(未消失)时,我倾向于产生滑出效果。 我期望的动画效果是:- View 会慢慢淡出(alpha) View 将从左向右滑动(translatio
我有一个从一定百分比填充到另一个百分比 (0% - 50%) 的条。我想将它平滑地动画化到一个新的范围 (25% - 55%)。这意味着栏的宽度和位置都需要更改。我在同时顺利完成这两项操作时遇到了一些
我是安卓动画的初学者。我在 RelativeLayout 中几乎没有 View ,我希望更改 View 位置。我有哪些选择,它们有何不同? 我试过以下方法: view.animate() .trans
我想使用 Quick 测试以下方法: func initial(states: UIView...) { for view in states { view.transform
目前我正在制作一个带有 textureview 的相机播放器来渲染我的相机。因为预览可以有任何维度,所以我创建了一些自定义代码来在调用 OnSurfaceTextureUpdated 时更改纹理 Vi
我正在尝试使用 ObjectAnimator.ofFloat(...) 将 View 移动到屏幕的右上角但是,我没有得到预期的结果。我使用 ViewTreeListener 等预先获取 View 的坐
我是一名优秀的程序员,十分优秀!