4

내 응용 프로그램에서는 이미지를 서로 겹치게 할 수 있습니다. 이미지 그룹에서 하나의 이미지를 끌면 왼쪽 및 오른쪽 이미지도 화면에서 움직입니다. 이 제한 방법은 아래 여기에 당신이 가야하는 작은 조각이 내 코드한 이미지를 끌 때 다른 이미지를 이동하는 방법을 중지하는 방법

int cards[] = {R.drawable.c1,R.drawable.c2,R.drawable.c3,R.drawable.c4,R.drawable.c5,R.drawable.c6, 
       R.drawable.c7,R.drawable.c8,R.drawable.c9,R.drawable.c10,R.drawable.c11,R.drawable.c12,R.drawable.c13}; 
    ImageView[] Images = new ImageView[cards.length]; 
      for (int i = 0; i < cards.length; i++) {   
       Images[i] = new ImageView(this); 

       RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(
         RelativeLayout.LayoutParams.WRAP_CONTENT, 
         RelativeLayout.LayoutParams.WRAP_CONTENT); 
       if (i != 0) {   

        params.addRule(RelativeLayout.ALIGN_LEFT,i-1); 
        params.leftMargin= 40; 
        Images[i].setImageBitmap(BitmapFactory.decodeResource(getResources(), cards[i])); 
        Images[i].setId(i); 
        Images[i].setOnTouchListener(this); 
        layout.addView(Images[i], params); 
       } else { 
        Images[i].setImageBitmap(BitmapFactory.decodeResource(getResources(), cards[i])); 
        Images[i].setId(i); 
        Images[i].setOnTouchListener(this); 
        layout.addView(Images[i], params); 
       } 

      } 

//Ontouch 

@Override 
    public boolean onTouch(View p_v, MotionEvent p_event){ 
     params = (RelativeLayout.LayoutParams)p_v.getLayoutParams(); 
     switch (p_event.getAction()){  
     case MotionEvent.ACTION_DOWN: 
     { 
      status = START_DRAGGING;    
      imageView1 = new ImageView(this); 
      imageView1.setImageBitmap(p_v.getDrawingCache()); 

      m_lastTouchX = p_event.getX(); 
      m_lastTouchY = p_event.getY(); 

      break; 
     } 
     case MotionEvent.ACTION_UP: 
     { 
       status=STOP_DRAGGING;   
      break; 
     } 
     case MotionEvent.ACTION_MOVE: 
     { 
      if (status == START_DRAGGING) { 
       m_dx = p_event.getX() - m_lastTouchX; 
       m_dy = p_event.getY() - m_lastTouchY; 

       m_posX = m_prevX + m_dx; 
       m_posY = m_prevY + m_dy; 
       System.out.println("Dragging"); 
        params.leftMargin = (int) m_posX; 

        params.topMargin=(int) m_posY; 
        p_v.bringToFront(); 
        p_v.setLayoutParams(params); 
        imageView1.invalidate(); 
        m_prevX = m_posX; 
        m_prevY = m_posY; 

      } 


      break; 

     } 
     } 
     return true; 
    } 
+0

부모 레이아웃 – Sonali8890

+0

인 상대 레이아웃에 ontouch listener를 적용했기 때문에 나는 ontouchlistner를 설정해야 할 곳을 찾지 못했습니까? – Vamshi

+0

어떤 도움이 필요합니까? 어느 누구도 이런 종류의 문제에 직면 했습니까? – Vamshi

답변

0

입니다. RelativeLayout에 일부 이미지를 추가했습니다. 드로잉은 끌기 성능을 향상시키기 위해 캔버스에서 수행됩니다.

private ImageView[] Images; 
private boolean mDragging = false; 
private Rect mImageRect = new Rect(); 
int mX = 0; 
int mY = 0; 
private Bitmap mBitmap; 
private ImageView mImage; 

@Override 
public boolean onTouchEvent(MotionEvent ev) { 

    switch (ev.getAction()) { 
    case MotionEvent.ACTION_DOWN: 
     mX = (int) ev.getX(); 
     mY = (int) ev.getY(); 

     for (ImageView image : Images) { 
      image.getHitRect(mImageRect); 

      if (mImageRect.contains(mX, mY)) { 
       mDragging = true; 

       mImage = image; 
       mBitmap = ((BitmapDrawable) mImage.getDrawable()) 
         .getBitmap(); 

       mImage.setVisibility(View.GONE); 
       postInvalidate(); 
       break; 
      } 
     } 

     break; 
    case MotionEvent.ACTION_MOVE: 
     if (mDragging) { 
      mX = (int) ev.getX(); 
      mY = (int) ev.getY(); 

      postInvalidate(); 
     } 
     break; 
    case MotionEvent.ACTION_UP: 
     if (mDragging) { 
      mDragging = false; 
      mBitmap = null; 
      mImage.setVisibility(View.VISIBLE); 
      mImage = null; 
     } 
     break; 
    } 

    return super.onTouchEvent(ev); 
} 

@Override 
protected void dispatchDraw(Canvas canvas) { 
    super.dispatchDraw(canvas); 

    if (mBitmap != null) { 
     canvas.drawBitmap(mBitmap, mX, mY, null); 
    } 
} 
0

내 생각 엔 당신의 이미지가 겹쳐 있기 때문에, 세 개의 이미지가 onTouch 이벤트를 얻을 끌기 시작하는 것이 될 것이다 : 당신은 레이아웃 PARAMS 갱신 MotionEvent.ACTION_UP 이벤트를 처리해야합니다. 드래그해야하는 이미지 (예 : 이벤트를 먼저 처리하는 이미지)를 결정한 다음 해당 이미지 만 START_DRAGGING하는 논리를 추가해야합니다. 이미 "글로벌"값 상태입니다. 그 옆에 int imageNo를 추가하고 ACTION_DOWN case 문에 설정하십시오.

제목에있는 동안 : 상태가! START_DRAGGING 인 경우 ACTION_DOWN 만 처리해야합니다.