2012-06-23 30 views
6

Tôi đang làm việc trên một ứng dụng sử dụng kéo & thả trên Hình ảnh Tôi có thể thêm bất kỳ số lượng hình ảnh nào trong bố cục tương đối. Tôi có thể kéo hình ảnh, nhưng chỉ có một hình ảnh tại một thời điểm. Khi tôi thêm hình ảnh mới, tất cả các hình ảnh trước đó không thể chạm được.Kéo trên nhiều hình ảnh không hoạt động

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

đây là mã tôi thêm hình ảnh mới. Ivtest là một hình ảnh toàn cầu.

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

không đủ mã..thêm danh sách liên lạc và ảnh chụp nhanh giao diện người dùng .. – Ronnie

+1

@ userSeven7s tôi đã chỉnh sửa mã. Một chút thay đổi của nó khi tôi đang thử một số thứ khác. nhưng nó bao gồm hầu hết mọi thứ. – Kamal

+0

@Kamal Vui lòng xem câu trả lời của tôi. –

Trả lời

0

Bạn không nên sử dụng FILL_PARENT chiều rộng và chiều cao khi xác định LayoutParams, bởi vì nó "ẩn náu" tất cả các quan điểm khác trong cách bố trí. Sử dụng WRAP_CONTENT để thay thế.

+0

Tôi đã thử nghiệm rồi. vẫn không làm việc. – Kamal

+0

Đính kèm ảnh chụp màn hình giao diện người dùng của bạn, vui lòng – Jin35

+0

tôi đã thêm ảnh chụp màn hình. – Kamal

Các vấn đề liên quan