簡體   English   中英

確定是否單擊了ImageView的左側或右側

[英]Determine if left or right side of ImageView was clicked

我有一個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"/>

如果您的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();
        }
    }

由於View位於ImageView的頂部(請記住:在布局中聲明為第二個),因此它將首先獲取onClick事件。 遺憾的是,此方法僅在使用固定大小的ImageView時有效 如果大小可變,我想不出任何快速簡便的方法。 您可能必須使用LinearLayout和weight屬性來解決,但是我沒有設法使其與Views重疊。

希望我能幫助您!

編輯:如果ImageView具有可變大小,則可以使用相同的方法。 這可能是一種不好的做法,但是您可以初始化FrameLayout ,然后在初始化ImageView之后,將一個子視圖添加到FrameLayout中 ,其高度為ImageView的高度,一半為寬度。 然后,只需設置onClickListener即可,您應該如上所述獲得所需的結果(尚未嘗試過,現在就想一想)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM