类似的 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);
}