类似的 Facebook 反应 - ObjectAnimator clicklistener 的动画视图不起作用
Similar Facebook reactions - Animated view with ObjectAnimator clicklistener not working
我正在尝试在 RecyclerView.Adapter 中为一组垂直视图制作动画,该动画使用 android:clipChildren="false"、android:clipToPadding=[=21 效果很好=] 和 viewHolder.linear.postInvalidate(),但 ClickListener 在动画结束后不起作用。我正在使用 ObjectAnimator,因为我阅读了这个 link Android Animation - Button stays clickable
一些代码
@Override
public void onBindViewHolder(final TViewHolder viewHolder, int i) {
viewHolder.flGroupButtons.postInvalidate();
viewHolder.iv1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//not working
});
..... clicklisteners
viewHolder.iv4.setOnClickListener(new View.OnClickListener() {
PropertyValuesHolder scaleX = PropertyValuesHolder.ofFloat("scaleX", 1f);
PropertyValuesHolder scaleY = PropertyValuesHolder.ofFloat("scaleY", 1f);
PropertyValuesHolder pvTranslativ1 = PropertyValuesHolder.ofFloat("translationY", viewHolder.iv1.getY() - (measureHeight * 5));
ObjectAnimator animatoriv1 = ObjectAnimator.ofPropertyValuesHolder(viewHolder.iv1, scaleX, scaleY, pvTranslativ1);
animatoriv1.setInterpolator(new DecelerateInterpolator());
animatoriv1.setDuration(300);
....
......
AnimatorSet as = new AnimatorSet();
as.playTogether(animatoriv1, animatoriv2, animatoriv3, animatoriv4);
as.start();
});
}
只有 iv1 clicklistener 在未折叠时有效。
我怎样才能让它工作?
你不能这样做,因为这不是 Android 触摸事件处理的工作方式。
ViewGroup 或其子类(FrameLayout、RelativeLayout、LinearLayout 等)根据子视图的 frame.so 将触摸事件分配给它的子视图当您单击 iv2 或 iv3 或 iv4 时,触摸事件甚至没有通过到父级(RecyclerView 的项目),因此父级视图从来没有改变来处理或分派触摸事件到 iv2 或 iv3 或 iv4。
你应该做的是使用 WindowManager 弹出一个新的 Window,其中包含 iv1-iv4,并仔细计算位置,使其看起来就像你对RecyclerView的item.only然后就可以接收到touchevent和onClick事件
Facebook Reactions 肯定是在使用 WindowManager 来弹出一个新的 Window 按钮:
这是我在开发者选项中打开 Profile GPU 渲染选项时的样子
注意现在当我长按赞按钮时屏幕上有两行条,较小的是新的 window 包含反应按钮
clicklistener 只是在错误的位置,它应该在 viewholder 中
// Adapter
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int type) {
return NewsViewHolder.newInstance(parent);
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
final NewsEntry newsEntity = news.get(position);
((NewsViewHolder) holder).bind(newsEntity);
}
// ViewHolder
public NewsViewHolder(NewsViewHolderBinding binding) {
super(binding.getRoot());
itemView.findViewById(R.id.viewname).setOnClickListener(this);
}
我正在尝试在 RecyclerView.Adapter 中为一组垂直视图制作动画,该动画使用 android:clipChildren="false"、android:clipToPadding=[=21 效果很好=] 和 viewHolder.linear.postInvalidate(),但 ClickListener 在动画结束后不起作用。我正在使用 ObjectAnimator,因为我阅读了这个 link Android Animation - Button stays clickable
一些代码
@Override
public void onBindViewHolder(final TViewHolder viewHolder, int i) {
viewHolder.flGroupButtons.postInvalidate();
viewHolder.iv1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//not working
});
..... clicklisteners
viewHolder.iv4.setOnClickListener(new View.OnClickListener() {
PropertyValuesHolder scaleX = PropertyValuesHolder.ofFloat("scaleX", 1f);
PropertyValuesHolder scaleY = PropertyValuesHolder.ofFloat("scaleY", 1f);
PropertyValuesHolder pvTranslativ1 = PropertyValuesHolder.ofFloat("translationY", viewHolder.iv1.getY() - (measureHeight * 5));
ObjectAnimator animatoriv1 = ObjectAnimator.ofPropertyValuesHolder(viewHolder.iv1, scaleX, scaleY, pvTranslativ1);
animatoriv1.setInterpolator(new DecelerateInterpolator());
animatoriv1.setDuration(300);
....
......
AnimatorSet as = new AnimatorSet();
as.playTogether(animatoriv1, animatoriv2, animatoriv3, animatoriv4);
as.start();
});
}
只有 iv1 clicklistener 在未折叠时有效。 我怎样才能让它工作?
你不能这样做,因为这不是 Android 触摸事件处理的工作方式。
ViewGroup 或其子类(FrameLayout、RelativeLayout、LinearLayout 等)根据子视图的 frame.so 将触摸事件分配给它的子视图当您单击 iv2 或 iv3 或 iv4 时,触摸事件甚至没有通过到父级(RecyclerView 的项目),因此父级视图从来没有改变来处理或分派触摸事件到 iv2 或 iv3 或 iv4。
你应该做的是使用 WindowManager 弹出一个新的 Window,其中包含 iv1-iv4,并仔细计算位置,使其看起来就像你对RecyclerView的item.only然后就可以接收到touchevent和onClick事件
Facebook Reactions 肯定是在使用 WindowManager 来弹出一个新的 Window 按钮:
这是我在开发者选项中打开 Profile GPU 渲染选项时的样子
注意现在当我长按赞按钮时屏幕上有两行条,较小的是新的 window 包含反应按钮
clicklistener 只是在错误的位置,它应该在 viewholder 中
// Adapter
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int type) {
return NewsViewHolder.newInstance(parent);
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
final NewsEntry newsEntity = news.get(position);
((NewsViewHolder) holder).bind(newsEntity);
}
// ViewHolder
public NewsViewHolder(NewsViewHolderBinding binding) {
super(binding.getRoot());
itemView.findViewById(R.id.viewname).setOnClickListener(this);
}