2016-04-20 35 views
3

我想在RecyclerView.Adapter垂直動畫一組視圖,使用android:clipChildren =「false」,android:clipToPadding =「false 「和viewHolder.linear.postInvalidate(),但ClickListener在動畫結束後不起作用。我使用ObjectAnimator因爲我看到這個鏈接Android Animation - Button stays clickable類似Facebook的反應 - ObjectAnimator clicklistener動畫視圖不工作

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工作。 我如何得到它的工作?

回答

1

你不能這樣做,因爲這不是Android觸摸事件過程的工作方式。

ViewGroup或它的子類(FrameLayout,RelativeLayout,LinearLayout等)根據childview的frame.so將觸摸事件調度到它的子視圖當您點擊iv2或iv3或iv4時,觸摸事件甚至沒有傳遞給父級(RecyclerView的項目),所以父視圖從來沒有改變來處理或分派觸摸事件到iv2或iv3或iv4。

你應該做的就是使用WindowManager在iv1-iv4中彈出一個新窗口,並仔細計算位置,以便它看起來就像你對RecyclerView的item的方式。只有這樣你才能接收touchevent和onClick事件

Facebook的反應肯定是使用窗口管理器,彈出一個新窗口按鈕:

這裏的是什麼樣子,當我打開檔案GPU渲染在開發人員選項選項 Facebook Reactions closed




通知有對屏幕的酒吧現在當我長的點擊喜歡按鈕兩排,較小的一個是包含反應按鈕

Facebook Reactions opened

+0

你好,我想我想要做的是類似於Facebook的反應。你認爲可以用WindowManager做什麼?謝謝 – schwertfisch

+0

我編輯我的答案,Facebook的反應使用WindowManager來做到這一點。 – 7heaven

+0

非常感謝!我正在努力實現它。 – schwertfisch

0

一個新窗口中clicklistener只是在錯誤的位置,它應該在視圖中

// 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); 
} 
+0

感謝您的回答,我嘗試過,但我不工作,我會嘗試第一個答案 – schwertfisch