如何在拖动视图时使用旋转动画以使中心位置不断变化?解决从度到度的问题



在我的回收视图中,我希望当用户握住项目并移动它时,所有项目都能摇晃/摆动/摆动。我面临的问题是,当用户持有项目并在相同的视图类型中移动它时,摆动是可以的,但是当有人将其拖动到回收器视图的顶部时(这是在回收器视图中作为视图类型创建的标题),摆动增加了很多。

在玩弄这些值时,我意识到这是因为即使旋转角度相同,它离项目中心越远,旋转就会增加。

我也尝试使用对象动画器执行此操作,但它没有帮助,因为这也存在旋转角度的相同问题。

这是我的摆动代码

<rotate xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="100"
android:fromDegrees="-5"
android:pivotX="50%"
android:pivotY="50%"
android:repeatCount="infinite"
android:repeatMode="reverse"
android:toDegrees="5" />

这是它看起来的视频 - 链接

在绑定视图逻辑上开始动画

((VHItem) holder).rlContainer.setOnLongClickListener(new View.OnLongClickListener()
{
@Override
public boolean onLongClick(View view)
{
if (buPostModelList != null)
{
startAnimationItem = true;
isDragCover = true;
isEditCoverImage = false;
for (int i = 0; i <= buPostModelList.size(); i++)
{
if (recyclerView.getChildAt(i) != null && recyclerView.getChildViewHolder(recyclerView.getChildAt(i)).getItemViewType() != TYPE_HEADER)
{
recyclerView.getChildAt(i).startAnimation(AnimationUtils.loadAnimation(context, R.anim.jiggle));
}
}
touchHelper.startDrag(holder);
}
return true;
}
});

编辑示例项目 - 链接

当您移动视图时,旋转的中心保持在起始位置,但视图仍来回移动五度,因此就像从旋转木马的中心移动到外围,其中五度移动在相同的时间内覆盖了更长的距离。

我建议你转向没有这个问题的ObjectAnimator

ObjectAnimator ValueAnimator
的此子类提供对目标对象属性进行动画处理的支持。此类的构造函数采用参数来定义将进行动画处理的目标对象以及将进行动画处理的属性的名称。然后在内部确定适当的 set/get 函数,动画将根据需要调用这些函数来对属性进行动画处理。

抖动.xml
这是一个用于抖动效果的新ObjectAnimatorxml。它与你的抖动非常相似,.xml

<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="100"
android:propertyName="rotation"
android:repeatCount="-1"
android:repeatMode="reverse"
android:valueFrom="-5"
android:valueTo="5"
android:valueType="floatType" />

维特姆
更新了支持动画器的视图持有人。

class VHItem extends RecyclerView.ViewHolder {
private ImageView ivCollectionImage, ivRemoveIcon;
private RelativeLayout rlContainer;
private Animator mAnimator;
public VHItem(View itemView) {
super(itemView);
ivCollectionImage = itemView.findViewById(R.id.ivCollectionImage);
ivRemoveIcon = itemView.findViewById(R.id.ivRemoveIcon);
rlContainer = itemView.findViewById(R.id.rlContainer);
}
// Start animation. Inflate the animator lazily.
public void startAnimator() {
if (mAnimator == null) {
mAnimator = AnimatorInflater.loadAnimator(context, R.animator.jiggle);
}
mAnimator.setTarget(itemView);
mAnimator.start();
}
// Stop the animation. Set the rotation back to zero.
public void stopAnimator() {
if (mAnimator != null) {
itemView.setRotation(0);
mAnimator.cancel();
}
}
}

您需要更新适配器的其余部分才能使用新动画。

相关内容

最新更新