确定是否单击了ImageView的左侧或右侧

时间:2017-05-14 16:48:10

标签: android android-recyclerview android-imageview

我有一个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

后添加2个按钮
<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"/>

1 个答案:

答案 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,你应该得到你想要的结果,如上所述(还没有尝试过,现在只想到它)。