类似的Facebook反应 - 使用ObjectAnimator clicklistener的动画视图不起作用

时间:2016-04-20 05:32:07

标签: android animation android-animation objectanimator

我正在尝试在RecyclerView.Adapter中垂直设置一组视图,动画效果很好,使用android:clipChildren =“false”,android:clipToPadding =“false”和viewHolder.linear.postInvalidate(),但是动画结束后,ClickListener不起作用。我正在使用ObjectAnimator因为我读了这个链接Android Animation - Button stays clickable

enter image description here

一些代码

    @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正在工作。 我怎样才能让它发挥作用?

2 个答案:

答案 0 :(得分:1)

您不能这样做,因为这不是Android触摸事件处理的工作方式。

ViewGroup或它的子类(FrameLayout,RelativeLayout,LinearLayout等)根据子视图的框架将触摸事件发送到它的子视图。因此,当您单击iv2或iv3或iv4时,触摸事件甚至没有传递给父视图( RecyclerView的项目),因此父视图从未进行过更改以处理或将触摸事件发送到iv2或iv3或iv4。

你应该做的是使用WindowManager在其中使用iv1-iv4弹出一个新窗口,并仔细计算位置,使其看起来就像你对RecyclerView项目所做的那样。然后你就可以收到touchevent和onClick事件

Facebook Reactions肯定使用WindowManager弹出一个带有按钮的新窗口:

这是我在开发者选项中打开配置文件GPU渲染选项时的样子 Facebook Reactions closed




注意当我长按“喜欢”按钮时屏幕上有两排条形图,较小的一条是包含反应按钮的新窗口

Facebook Reactions opened

答案 1 :(得分:0)

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);
}