2017-05-14 51 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

相关问题