2012-02-03 2 views
1

Im은 Android에 새로운 기능을 추가 했으므로 사용자와 상호 작용하는 뷰가 거의없는 응용 프로그램을 프로그래밍하는 것이 전부입니다. 내 접근 방식은 XML 파일의 일부 imageviews 레이아웃을 정의하고 해당 imageviews 이벤트를 프로그래밍 방식으로 처리하는 것입니다. 그러나 xml에 이전에 정의 된 RelativeLayout에 .setOnTouchListener()를 할당하는 데 문제가 있습니다.xml에 정의 된 레이아웃에 .setOnTouchListener()를 할당하십시오.

코드는 다음과 같습니다

public class ThreeActivity extends Activity implements OnTouchListener { 

    ImageView iv2; 
    RelativeLayout rl; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     // TODO Auto-generated method stub 
     super.onCreate(savedInstanceState); 

     setContentView(R.layout.fish); 

     ImageView iv1 = (ImageView) findViewById(R.id.ImageView02); 
     iv1.setAlpha(50); 


     iv2 = (ImageView) findViewById(R.id.ImageView01); 
     iv2.setId(2); 
     iv2.setOnTouchListener(this); 

     iv2.setFocusable(true); 

    } 

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

     if (iv2.isFocused()) { 
      TranslateAnimation translateAnim = new TranslateAnimation(
        iv2.getLeft(), event.getX(), iv2.getTop(), event.getY()); 

      translateAnim.setDuration(1000); 
      translateAnim 
        .setInterpolator(new AccelerateDecelerateInterpolator()); 
      translateAnim.setFillAfter(true); 

      iv2.setAnimation(translateAnim); 

      iv2.startAnimation(translateAnim); 
     } 
     return true; 
     } 


} 

을 분명히 내가 이미지 뷰가 포커스 여러 이벤트를 수신하고 접촉 위치로 이동보다가되고 싶어요. 그리고 이것은임이 곤경에 처하는 곳입니다. RelativeLayout는 터치 만하는 터치 리스너가 없기 때문에 상호 작용할 수 없습니다.

이 문제를 해결하거나 다른 방법을 추천 해 줄 수 있습니까? 도움 주셔서 감사합니다.

답변

0
public class ThreeActivity extends Activity implements OnTouchListener { 

    ImageView iv2; 
    RelativeLayout rl; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     // TODO Auto-generated method stub 
     super.onCreate(savedInstanceState); 

     setContentView(R.layout.fish); 

     ImageView iv1 = (ImageView) findViewById(R.id.ImageView02); 
     iv1.setAlpha(50); 


     iv2 = (ImageView) findViewById(R.id.ImageView01); 
     iv2.setId(2); 
     r1.setOnTouchListener(this); 

     iv2.setFocusable(true); 

    } 

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

     if (v == iv2) { 
      TranslateAnimation translateAnim = new TranslateAnimation(
        iv2.getLeft(), event.getX(), iv2.getTop(), event.getY()); 

      translateAnim.setDuration(1000); 
      translateAnim 
        .setInterpolator(new AccelerateDecelerateInterpolator()); 
      translateAnim.setFillAfter(true); 

      iv2.setAnimation(translateAnim); 

      iv2.startAnimation(translateAnim); 
     } 
     return true; 
     } 


} 
1

MotionEvent 클래스에 대해 조금 읽는 것이 좋습니다. getAction() 메소드와이 클래스가 제공하는 모든 조치 마스크에 특히주의하십시오. setOnTouchListener가 레이아웃을 위해 작동하지 않는 경우

if (v != iv2) return; 
switch(ev.getAction()) {  
    case ACTION_DOWN: { 
     // This block will run when the finger touches the screen 
     mDoDrag = true; 
     break; 
    }  
    case ACTION_UP: { 
     // This block will run when the finger leaves the screen 
     mDoDrag = false; 
     break; 
    }  
    case ACTION_MOVE: { 
     // This block will run when the finger is dragged across the screen 
     if (mDoDrag) { 
      // You should implement your animation here 
     } 
     break; 
    } 
} 
+0

을하지만 아무도 할 수 있습니다 : 당신의 onTouch() 방법에

, 당신은 이런 식으로 뭔가를 할 수 ( 해결책 2의 ImageView는 여전히 이미지 뷰 iv2에 의해 정의 된 사각형에서 계속 듣고 있으며 솔루션 1 번은 NullPointException을 생성합니다! – greengold

+0

모든 ImageView에 대해 수신기를 설정해야하며 onTouch() 메소드에서 v 매개 변수는 vi에 대한 참조입니다. 만졌던 것 –

+0

나는 당신이 나의 질문을 얻지 않았다라고 생각한다. 내 물건 (이미지 뷰)을 내가 가볍게 두드리는 곳으로 옮기고 싶습니다. 물론 모든 이미지 뷰와 상호 작용하고 싶다면 onTouchListener를 할당하고 포커스를 이동 한 다음 onTouch 메서드에서 특정 뷰를 확인하여 이동해야하는 곳을 터치합니다. 문제는이 예제에서 RelativeLayout이 onTouchListener가 할당되어 있지 않아 원인을 알 수 없다는 것입니다. 따라서 좌표를 가져올 수 없습니다. – greengold

관련 문제