在我的回收站视图中,我希望所有项目在用户握住并移动某个项目时都可以摇动/摆动/摆动。我面临的问题是,当用户握住该项目并将其以相同的视图类型移动时,摆动是可以的,但是当有人将其拖动到recyclerview的顶部时(该标题是在recyclerview中作为视图类型创建的)摆动增加很多。
在使用这些值时,我意识到这是因为,即使旋转角度相同,旋转距离项目中心越远,旋转就越大。
我也尝试使用对象动画器来执行此操作,但是这样做没有帮助,因为旋转角度也同样存在。
这是我的摆动代码
<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" />
以下是视频的外观- link
在bindView逻辑上开始动画
((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;
}
});
编辑 一个示例项目-link
答案 0 :(得分:2)
当您移动视图时,旋转中心保持在起始位置,但视图仍来回移动五度,因此就像从旋转木马的中心移动到外围的五度运动可以在相同的时间内覆盖更大的距离。
我建议您转到没有这个问题的ObjectAnimator。
ObjectAnimator
ValueAnimator的此子类提供对目标对象的动画设置的支持。此类的构造函数使用参数定义将被动画化的目标对象以及将被动画化的属性的名称。然后在内部确定适当的set / get函数,动画将在必要时调用这些函数来设置属性动画。
jiggle.xml
这是用于微动效果的新的 ObjectAnimator xml。它与您的 jiggle.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" />
VHItem
更新了具有动画师支持的视图持有人。
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();
}
}
}
您将需要更新适配器的其余部分以使用新动画。