2017-05-14 238 views
0

我有一個RecyclerView,作爲一個項目,除其他外,還有一個SimpleDraweeView。我想確定用戶是否點擊了SimpleDraweeView的左側或右側部分,然後相應地進行填充。我已經嘗試設置onTouchListener,但它被調用多次而不是一次,而且如果我滾動RecyclerView,它會再次被調用。確定ImageView的左側還是右側被點擊

holder.getDoubleImageBinding().ivImage.setOnTouchListener(new View.OnTouchListener() { 
     @Override 
     public boolean onTouch(View v, MotionEvent event) { 
      if (event.getX() < holder.getDoubleImageBinding().ivImage.getWidth()/2) { 
       mListener.onClickLeft(); 
      } else { 
       mListener.onClickRight(); 
      } 
      return false; 
     } 
    }); 

我也試着讓寬度和X和設置onClickListener,但X始終是0.0。

holder.getDoubleImageBinding().ivImage.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() { 
     @Override 
     public boolean onPreDraw() { 
      imageWidth = holder.getDoubleImageBinding().ivImage.getWidth()/2; 
      imageX = holder.getDoubleImageBinding().ivImage.getX(); 
      holder.getDoubleImageBinding().ivImage.getViewTreeObserver().removeOnPreDrawListener(this); 
      return true; 
     } 
    }); 
    holder.getDoubleImageBinding().ivImage.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      if (imageWidth > imageX) { 
       mListener.onClickLeft(); 
      } else { 
       mListener.onClickRight(); 
      } 
     } 
    }); 

編輯:

最後,我決定增加背後的ImageView

<com.facebook.drawee.view.SimpleDraweeView 
     android:id="@+id/iv_image" 
     android:layout_width="0dp" 
     android:layout_height="299dp" 
     android:layout_marginTop="20dp" 
     android:src="@drawable/ap_circle" 
     app:layout_constraintLeft_toLeftOf="parent" 
     app:layout_constraintRight_toRightOf="parent" 
     app:layout_constraintTop_toTopOf="@+id/guideline" 
     fresco:placeholderImage="@drawable/ap_placeholder"/> 

    <Button 
     android:id="@+id/btn_left" 
     android:layout_width="0dp" 
     android:layout_height="299dp" 
     android:background="@android:color/transparent" 
     app:layout_constraintBottom_toBottomOf="@id/iv_image" 
     app:layout_constraintLeft_toLeftOf="parent" 
     app:layout_constraintRight_toLeftOf="@+id/btn_right" 
     app:layout_constraintTop_toTopOf="@id/iv_image"/> 

    <Button 
     android:id="@+id/btn_right" 
     android:layout_width="0dp" 
     android:layout_height="299dp" 
     android:background="@android:color/transparent" 
     app:layout_constraintBottom_toBottomOf="@id/iv_image" 
     app:layout_constraintLeft_toRightOf="@id/btn_left" 
     app:layout_constraintRight_toRightOf="parent" 
     app:layout_constraintTop_toTopOf="@id/iv_image"/> 
+0

我相信你應該得到onTouchEvent? – samiunn

+0

正如我所說的,我已經嘗試過'onTouchEvent',但它在'RecyclerView'中的每個列表項被解僱,而且當我滾動時,它又被解僱了。 – jlively

回答

1

2個按鈕。如果您的ImageView具有絕對的規模,那麼你可以做這樣的事情:

  <FrameLayout 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content"> 
      <ImageView 
       android:id="@+id/iv_wallpaper" 
       android:layout_width="300dp" 
       android:layout_height="300dp" 
       android:src="@drawable/wallpaper"/> 

      <View 
       android:id="@+id/left" 
       android:layout_width="150dp" 
       android:layout_height="300dp"/> 
     </FrameLayout> 

Normall y a FrameLayout應該只有一個孩子。但是,如果你給它兩個孩子,像我上面做的那樣,第二個孩子會重疊第一個。通過這樣做,ViewHolder實施應類似於這樣:

public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener { 

    private ImageView mIvWallpaper; 
    private View mVLeft; 

    public ViewHolder(View itemView) { 
     super(itemView); 

     mVLeft = itemView.findViewById(R.id.left); 
     mIvWallpaper = (ImageView) itemView.findViewById(R.id.iv_wallpaper); 

     mVLeft.setOnClickListener(this); 
     mIvWallpaper.setOnClickListener(this); 
    } 

    @Override 
    public void onClick(View v) { 
     int id = v.getId(); 

     if (id == R.id.left) { 
      Toast.makeText(mContext, "Left side was clicked", Toast.LENGTH_SHORT).show(); 
     } else if (id == R.id.iv_wallpaper) { 
      Toast.makeText(mContext, "Right side was clicked", Toast.LENGTH_SHORT).show(); 
     } 
    } 

由於查看是在ImageView的的頂部(記住:在佈局聲明秒),它將得到的onClick事件第一。可悲的是,這種方法只適用於您使用固定尺寸ImageView。如果你有一個可變的大小,我想不出任何快速簡單的方法。您可能必須解決LinearLayout和weight屬性,但我沒有設法使它與視圖重疊。

希望我可以幫助你!

編輯:如果ImageView有一個可變大小,你可以使用相同的方法。這可能是不好的做法,但你可以初始化的FrameLayout,然後ImageView的初始化後孩子查看添加到您的的FrameLayout的ImageView的高度,它的寬度的一半。然後,只需設置onClickListener,就可以獲得上述所需的結果(還沒有嘗試過,現在只是想到了它)。

+1

感謝您的努力,但我的'imageView'在'ConstraintsLayout'中。但是你的解決方案看起來有些不好。最後,我所做的是在'imageView'後面放置兩個透明按鈕。 – jlively

+0

是的,它肯定不是最乾淨的解決方案。感謝您告訴我您的解決方案,也許我將來需要它! –

+0

我會把它作爲'編輯'發佈。乾杯! – jlively