2017-05-14 1 views
0

Ich habe eine RecyclerView, und als ein Element unter anderem gibt es eine SimpleDraweeView. Ich möchte feststellen, ob der Benutzer den linken oder den rechten Teil des SimpleDraweeView angeklickt hat und dann die Sachen entsprechend machen. Ich habe versucht, onTouchListener einrichten, aber es wird mehrmals statt einmal aufgerufen, und auch wenn ich mit der RecyclerView scrollen wird es wieder aufgerufen.Ermitteln, ob die linke oder rechte Seite von ImageView geklickt wurde

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; 
     } 
    }); 

ich auch die Breite und X versucht haben, immer und Einstellung onClickListener, aber X ist immer 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(); 
      } 
     } 
    }); 

EDIT:

Am Ende entschied ich mich hinter dem 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

Ich glaube, Sie sollten das onTouchEvent bekommen? – samiunn

+0

Wie ich schon sagte, habe ich 'onTouchEvent' versucht, aber es wird für jedes Element der Liste in' RecyclerView' abgefeuert und auch wenn ich blättern gehe, wird es wieder gefeuert. – jlively

Antwort

1

2 Tasten hinzufügen Wenn Ihr Image eine absolute Größe hat, dann könnten Sie so etwas tun:

  <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 sollte nur ein Kind haben. Wenn Sie jedoch zwei Kinder wie ich oben geben, wird das zweite Kind die erste überlappen. Auf diese Weise wird die ViewHolder Implementierung sollte ähnlich aussehen dieses:

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(); 
     } 
    } 

Da die Ansicht auf dem Image ist (zur Erinnerung: zweite im Layout deklariert) es wird die onClick erhalten Ereignis zuerst. Leider funktioniert diese Methode nur, wenn Sie eine feste Größe ImageView verwenden. Ich kann mir keinen schnellen und einfachen Weg vorstellen, wenn Sie eine variable Größe haben. Sie müssten wahrscheinlich umgehen mit LinearLayout und das Gewicht-Attribut, aber ich habe es nicht geschafft, Ansichten damit zu überschneiden.

Hoffentlich konnte ich Ihnen aber helfen!

Bearbeiten: Wenn die ImageView eine variable Größe hat, könnten Sie die gleiche Methode verwenden. Dies ist wahrscheinlich eine schlechte Praxis, aber Sie könnten Ihre FrameLayout und dann nach der Initialisierung des Image initialisieren ein Kind Ansicht zu Ihrem FrameLayout mit der Höhe Ihres Image und die halbe Breite hinzufügen. Dann setze einfach den onClickListener und du solltest das gewünschte Ergebnis wie oben beschrieben haben (hab es noch nicht probiert, nur daran gedacht).

+1

Vielen Dank für Ihre Mühe, aber meine 'imageView' ist in einem' ConstraintsLayout'. Aber Ihre Lösung scheint ein bisschen hacky. Am Ende habe ich zwei durchsichtige Buttons hinter dem 'imageView' platziert. – jlively

+0

Ja, es ist definitiv nicht die sauberste Lösung. Danke, dass du mir deine Lösung gesagt hast, vielleicht werde ich sie in Zukunft brauchen! –

+0

Ich werde es als 'Edit' veröffentlichen. Prost! – jlively

Verwandte Themen