2012-06-23 11 views
6

Sto lavorando a un'app che utilizza il trascinamento di drag & sulle immagini È possibile aggiungere qualsiasi numero di immagini in un layout relativo. Sono in grado di trascinare immagini, ma solo una alla volta. Una volta aggiunta la nuova immagine, tutte le immagini precedenti non sono toccabili.Trascina su più immagini non funzionanti

public void addImage(Bitmap bmp) 
{ 
    ivtest= new ImageView(TabletActivity.this); 
    if(bmp!=null) 
    { 
     ivtest.setImageBitmap(bmp); 
     rlAddView.addView(ivtest, new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT)); 

     bmp= null; 
    } 
    ivtest.setTag("sdjfjd"); 
    ivtest.bringToFront(); 
    ivtest.setScaleType(ScaleType.MATRIX); 
    ivtest.setOnTouchListener(this); 
} 

questo è il codice in cui aggiungo una nuova immagine. Il ivtest è un imageView globale.

public class TestImage extends View implements OnTouchListener 
{ 
private ScaleGestureDetector mScaleDetector; 
private float mScaleFactor = 1.f; 
private Drawable mIcon; 
private float mLastTouchX; 
private static final int INVALID_POINTER_ID = -1; 

// The ‘active pointer’ is the one currently moving our object. 
private int mActivePointerId = INVALID_POINTER_ID; 
private float mPosX; 
    private float mPosY; 

    private float mLastTouchY; 


public TestImage(Context context, Drawable _micon) 
{ 
    super(context); 
    mIcon =_micon; 
    WindowManager wManager= (WindowManager)context.getSystemService(Context.WINDOW_SERVICE); 
    mIcon.setBounds((int)getPivotX(), (int)getPivotY(), mIcon.getIntrinsicWidth(),mIcon.getIntrinsicWidth()); 

// setOnTouchListener(this); 

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

} 

@Override 
public boolean onTouch(View view, MotionEvent ev) 
{ 

     mScaleDetector.onTouchEvent(ev); 

     final int action = ev.getAction(); 
     switch (action & MotionEvent.ACTION_MASK) { 
     case MotionEvent.ACTION_DOWN: 
     { 
      final float x = ev.getX(); 
      final float y = ev.getY(); 


      mLastTouchX = x; 
      mLastTouchY = y; 
      mActivePointerId = ev.getPointerId(0); 
      break; 
     } 

     case MotionEvent.ACTION_MOVE: { 
      final int pointerIndex = ev.findPointerIndex(mActivePointerId); 
      final float x = ev.getX(pointerIndex); 
      final float y = ev.getY(pointerIndex); 

      // Only move if the ScaleGestureDetector isn't processing a gesture. 
      if (!mScaleDetector.isInProgress()) { 
       final float dx = x - mLastTouchX; 
       final float dy = y - mLastTouchY; 

       mPosX += dx; 
       mPosY += dy; 

       invalidate(); 
      } 

      mLastTouchX = x; 
      mLastTouchY = y; 

      break; 
     } 

     case MotionEvent.ACTION_UP: { 
      mActivePointerId = INVALID_POINTER_ID; 
      break; 
     } 

     case MotionEvent.ACTION_CANCEL: { 
      mActivePointerId = INVALID_POINTER_ID; 
      break; 
     } 

     case MotionEvent.ACTION_POINTER_UP: { 
      final int pointerIndex = (ev.getAction() & MotionEvent.ACTION_POINTER_INDEX_MASK) 
        >> MotionEvent.ACTION_POINTER_INDEX_SHIFT; 
      final int pointerId = ev.getPointerId(pointerIndex); 
      if (pointerId == mActivePointerId) { 
       // This was our active pointer going up. Choose a new 
       // active pointer and adjust accordingly. 
       final int newPointerIndex = pointerIndex == 0 ? 1 : 0; 
       mLastTouchX = ev.getX(newPointerIndex); 
       mLastTouchY = ev.getY(newPointerIndex); 
       mActivePointerId = ev.getPointerId(newPointerIndex); 
      } 
      break; 
     } 
     } 

     return true; 

} 


@Override 
public void onDraw(Canvas canvas) { 
    super.onDraw(canvas); 

    canvas.save(); 
    canvas.translate(mPosX, mPosY); 
    canvas.scale(mScaleFactor, mScaleFactor); 
    mIcon.setBounds(0, 0, mIcon.getIntrinsicWidth(),mIcon.getIntrinsicWidth()); 
    mIcon.draw(canvas); 
    canvas.restore(); 
} 

private class ScaleListener extends ScaleGestureDetector.SimpleOnScaleGestureListener { 
    @Override 
    public boolean onScale(ScaleGestureDetector detector) { 
     mScaleFactor *= detector.getScaleFactor(); 

     // Don't let the object get too small or too large. 
     mScaleFactor = Math.max(0.1f, Math.min(mScaleFactor, 5.0f)); 

     invalidate(); 
     return true; 
    } 
} 

} enter image description here

+0

codice non sufficiente..add touchlistener e snapshot dell'interfaccia utente. – Ronnie

+1

@ userSeven7s Ho modificato il codice. È un po 'diverso mentre sto provando qualche altra cosa. ma copre la maggior parte delle cose. – Kamal

+0

@Kamal Si prega di vedere la mia risposta. –

risposta

0

Non si deve usare FILL_PARENT larghezza e l'altezza quando si definisce LayoutParams, perché "copre" tutte le altre viste nel layout. Utilizzare invece WRAP_CONTENT.

+0

L'ho già provato. continua a non funzionare. – Kamal

+0

Allega la tua schermata dell'interfaccia utente per favore – Jin35

+0

ho aggiunto una schermata. – Kamal