1

Je développe une application Android. Dans mon application, j'utilise une vue d'image qui peut être agrandie et une boîte de dialogue d'option de téléchargement comme dans Facebook. Mais j'ai un problème avec mon code. Le problème est lorsque je mets onLongClick listener sur ma vue d'image, tout fonctionne bien.OnLongClick écoute ne fonctionne pas avec zoomable Image dans Android

Mais ce que je veux, c'est que je veux juste montrer l'option de téléchargement lorsque l'utilisateur tient le contact sur l'image comme sur Facebook. J'ai donc mis onLongClick listener à la place de l'écouteur onClick. Mais quand je mets onLongClick écouteur. L'événement n'est pas déclenché. S'il vous plaît voir mon scénario ci-dessous.

C'est ma classe TouchImageView personnalisée pour l'image zoom

public class TouchImageView extends ImageView { 
    Matrix matrix; 
    // We can be in one of these 3 states 
    static final int NONE = 0; 
    static final int DRAG = 1; 
    static final int ZOOM = 2; 

    int mode = NONE; 

    // Remember some things for zooming 
    PointF last = new PointF(); 
    PointF start = new PointF(); 
    float minScale = 1f; 
    float maxScale = 3f; 
    float[] m; 
    int viewWidth, viewHeight; 

    static final int CLICK = 3; 

    float saveScale = 1f; 

    protected float origWidth, origHeight; 

    int oldMeasuredWidth, oldMeasuredHeight; 

    ScaleGestureDetector mScaleDetector; 

    Context context; 

    public TouchImageView(Context context) { 
     super(context); 
     sharedConstructing(context); 
    } 

    public TouchImageView(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     sharedConstructing(context); 
    } 

    private void sharedConstructing(Context context) { 

     super.setClickable(true); 

     this.context = context; 

     mScaleDetector = new ScaleGestureDetector(context, new ScaleListener()); 

     matrix = new Matrix(); 

     m = new float[9]; 

     setImageMatrix(matrix); 

     setScaleType(ScaleType.MATRIX); 

     setOnTouchListener(new OnTouchListener() { 

      @Override 
      public boolean onTouch(View v, MotionEvent event) { 

       mScaleDetector.onTouchEvent(event); 

       PointF curr = new PointF(event.getX(), event.getY()); 

       switch (event.getAction()) { 

        case MotionEvent.ACTION_DOWN: 

         last.set(curr); 

         start.set(last); 

         mode = DRAG; 

         break; 

        case MotionEvent.ACTION_MOVE: 

         if (mode == DRAG) { 

          float deltaX = curr.x - last.x; 

          float deltaY = curr.y - last.y; 

          float fixTransX = getFixDragTrans(deltaX, viewWidth, origWidth * saveScale); 

          float fixTransY = getFixDragTrans(deltaY, viewHeight, origHeight * saveScale); 

          matrix.postTranslate(fixTransX, fixTransY); 

          fixTrans(); 

          last.set(curr.x, curr.y); 

         } 

         break; 

        case MotionEvent.ACTION_UP: 

         mode = NONE; 

         int xDiff = (int) Math.abs(curr.x - start.x); 

         int yDiff = (int) Math.abs(curr.y - start.y); 

         if (xDiff < CLICK && yDiff < CLICK) 

          performClick(); 

         break; 

        case MotionEvent.ACTION_POINTER_UP: 

         mode = NONE; 

         break; 

       } 

       setImageMatrix(matrix); 

       invalidate(); 

       return true; // indicate event was handled 

      } 

     }); 
    } 

    public void setMaxZoom(float x) { 

     maxScale = x; 

    } 

    private class ScaleListener extends ScaleGestureDetector.SimpleOnScaleGestureListener { 

     @Override 
     public boolean onScaleBegin(ScaleGestureDetector detector) { 

      mode = ZOOM; 

      return true; 

     } 

     @Override 
     public boolean onScale(ScaleGestureDetector detector) { 

      float mScaleFactor = detector.getScaleFactor(); 

      float origScale = saveScale; 

      saveScale *= mScaleFactor; 

      if (saveScale > maxScale) { 

       saveScale = maxScale; 

       mScaleFactor = maxScale/origScale; 

      } else if (saveScale < minScale) { 

       saveScale = minScale; 

       mScaleFactor = minScale/origScale; 

      } 

      if (origWidth * saveScale <= viewWidth || origHeight * saveScale <= viewHeight) 

       matrix.postScale(mScaleFactor, mScaleFactor, viewWidth/2, viewHeight/2); 

      else 

       matrix.postScale(mScaleFactor, mScaleFactor, detector.getFocusX(), detector.getFocusY()); 

      fixTrans(); 

      return true; 

     } 

    } 

    void fixTrans() { 

     matrix.getValues(m); 

     float transX = m[Matrix.MTRANS_X]; 

     float transY = m[Matrix.MTRANS_Y]; 

     float fixTransX = getFixTrans(transX, viewWidth, origWidth * saveScale); 

     float fixTransY = getFixTrans(transY, viewHeight, origHeight * saveScale); 

     if (fixTransX != 0 || fixTransY != 0) 

      matrix.postTranslate(fixTransX, fixTransY); 

    } 



    float getFixTrans(float trans, float viewSize, float contentSize) { 

     float minTrans, maxTrans; 

     if (contentSize <= viewSize) { 

      minTrans = 0; 

      maxTrans = viewSize - contentSize; 

     } else { 

      minTrans = viewSize - contentSize; 

      maxTrans = 0; 

     } 

     if (trans < minTrans) 

      return -trans + minTrans; 

     if (trans > maxTrans) 

      return -trans + maxTrans; 

     return 0; 

    } 

    float getFixDragTrans(float delta, float viewSize, float contentSize) { 

     if (contentSize <= viewSize) { 

      return 0; 

     } 

     return delta; 

    } 

    @Override 
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 

     super.onMeasure(widthMeasureSpec, heightMeasureSpec); 

     viewWidth = MeasureSpec.getSize(widthMeasureSpec); 

     viewHeight = MeasureSpec.getSize(heightMeasureSpec); 

     // 
     // Rescales image on rotation 
     // 
     if (oldMeasuredHeight == viewWidth && oldMeasuredHeight == viewHeight 

       || viewWidth == 0 || viewHeight == 0) 

      return; 

     oldMeasuredHeight = viewHeight; 

     oldMeasuredWidth = viewWidth; 

     if (saveScale == 1) { 

      //Fit to screen. 

      float scale; 

      Drawable drawable = getDrawable(); 

      if (drawable == null || drawable.getIntrinsicWidth() == 0 || drawable.getIntrinsicHeight() == 0) 

       return; 

      int bmWidth = drawable.getIntrinsicWidth(); 

      int bmHeight = drawable.getIntrinsicHeight(); 

      Log.d("bmSize", "bmWidth: " + bmWidth + " bmHeight : " + bmHeight); 

      float scaleX = (float) viewWidth/(float) bmWidth; 

      float scaleY = (float) viewHeight/(float) bmHeight; 

      scale = Math.min(scaleX, scaleY); 

      matrix.setScale(scale, scale); 

      // Center the image 

      float redundantYSpace = (float) viewHeight - (scale * (float) bmHeight); 

      float redundantXSpace = (float) viewWidth - (scale * (float) bmWidth); 

      redundantYSpace /= (float) 2; 

      redundantXSpace /= (float) 2; 

      matrix.postTranslate(redundantXSpace, redundantYSpace); 

      origWidth = viewWidth - 2 * redundantXSpace; 

      origHeight = viewHeight - 2 * redundantYSpace; 

      setImageMatrix(matrix); 

     } 

     fixTrans(); 

    } 

Voilà comment je mis en place dans l'activité

@Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     config = (Config)getApplication(); 
     config.Initialize(); 
     Intent i = getIntent(); 
     image = i.getStringExtra("url"); 
     TouchImageView touchImageView = new TouchImageView(getBaseContext()); 
     touchImageView.setBackgroundColor(Color.BLACK); 
     Picasso.with(getBaseContext()).load(image).into(touchImageView); 
     setContentView(touchImageView); 
     touchImageView.setOnLongClickListener(new View.OnLongClickListener() { 
      @Override 
      public boolean onLongClick(View v) { 
       Toast.makeText(getBaseContext(),"OK",Toast.LENGTH_SHORT).show(); 
       //download code goes here 
       return true; 
      } 
     }); 

    } 

Comme vous pouvez voir mon code, je suis Toasting en écoute clic long . Mais ça ne fonctionne pas. Mais si je l'utilise à la place, cela fonctionne. Quel est le problème avec mon code?

Répondre

0

Vous avez la ligne return true; // indicate event was handled dans onTouchListener(). Avoir le retour false devrait permettre à onLongClickListener() de recevoir des événements tactiles et de tirer.