我有一个RecyclerView
,作为一个项目,还有一个SimpleDraweeView
。我想确定用户是否单击SimpleDraweeView
的左侧或右侧部分,然后相应地执行操作。我已经尝试设置onTouchListener
但是它被多次调用而不是一次,而且如果我滚动RecyclerView
它会被再次调用。
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 :(得分:1)
如果您的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>
通常 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 和权重属性进行解决方法,但我还没有设法将其与视图重叠。
希望我能帮到你!
编辑:如果 ImageView 具有可变大小,则可以使用相同的方法。这可能是不好的做法,但您可以初始化 FrameLayout ,然后在 ImageView 初始化之后将一个孩子查看添加到您的 FrameLayout < / strong>具有 ImageView 的高度和宽度的一半。然后只需设置onClickListener,你应该得到你想要的结果,如上所述(还没有尝试过,现在只想到它)。