2012-06-11 2 views
0

클릭 할 때 이미지 버튼의 위치를 ​​이동하려고합니다. 나는 다음과 같은 시도했지만 "rlOut.addView (imgP, p);에서 충돌" onCreate()에서 실행할 때 아무런 문제가 없습니다.onClick 일 때 imageButton의 위치를 ​​변경하는 방법

공용 클래스 Delet3Activity는 활동 {

RelativeLayout rlOut; 
ImageButton imbBtn; 

EditText et1, et2; 
ImageView ivB; 
ImageButton imgP; 
RelativeLayout.LayoutParams p; 
RelativeLayout.LayoutParams params; 

int mX, mY; 

public void onCreate(Bundle savedInstanceState) { 
super.onCreate(savedInstanceState); 
requestWindowFeature(Window.FEATURE_NO_TITLE); 
setContentView(R.layout.main); 

et1 = (EditText)findViewById(R.id.et1); 
et2 = (EditText)findViewById(R.id.et2); 

imbBtn = (ImageButton)findViewById(R.id.imgBtn); 
rlOut = (RelativeLayout)findViewById(R.id.rlOut); 
imgP = (ImageButton)findViewById(R.id.imgP); 

ivB = new ImageView(this); 
ivB.setBackgroundColor(Color.RED); 

Display display = getWindowManager().getDefaultDisplay(); 
int width = display.getWidth(); 
int height = display.getHeight(); 

width = width/2-62; 
height = height/2-62; 
p = new RelativeLayout.LayoutParams(62, 62);  

imbBtn.setOnTouchListener(new View.OnTouchListener() { 



    public boolean onTouch(View v, MotionEvent event) { 
     // TODO Auto-generated method stub 
     LayoutParams par = (LayoutParams)imbBtn.getLayoutParams(); 

     if(event.getAction()==MotionEvent.ACTION_DOWN) 
     { 
      Log.d("ok","down"); 
      mX = (int) event.getX() - imbBtn.getWidth()/2; 
      mY = (int) event.getY() - imbBtn.getHeight()/2; 
      et1.setText("mX down: "+String.valueOf(mX)); 
      et2.setText("mY down: "+String.valueOf(mY)); 


     } 
     else if (event.getAction()==MotionEvent.ACTION_UP) 
     { 
      Log.d("ok","up"); 
      rlOut.addView(ivB, params); 
      p.leftMargin=4; 
      params.leftMargin = 60; 
      params.topMargin = 20; 
      rlOut.addView(imgP, p); 
      Log.d("ok","p"); 
     } 
     else if (event.getAction()==MotionEvent.ACTION_MOVE) 
     { 
      Log.d("ok","move"); 
      mX = (int) event.getX() - imbBtn.getWidth()/2; 
      mY = (int) event.getY() - imbBtn.getHeight()/2; 
      et1.setText("mX move: "+String.valueOf(mX)); 
      et2.setText("mY move: "+String.valueOf(mY)); 
     } 
     return false; 
    } 
}); 

@Override

} }

+0

보기를 사용하기 전에 팽창시켜야합니다. 레이아웃 인플레이터와 같은 것을 사용하십시오. – user1092042

+0

앱이 충돌 할 때 logcat에 어떤 오류가 표시되고 'rlOut'보기 변수를 정확히 선언 했습니까? –

+0

msgid : threadid = 1 : catch되지 않은 예외 (그룹 = 0x4001e578)로 스레드가 종료 됨 경고 메시지 중요 예외 : 주 – Amblll

답변

0

OnCreate 방법을 사용하여 setContentView(R.layout.main)를 설정 한 장소를 확장합니다. 변수 rlOut은 주 레이아웃에있을 수도있는 RelativeLayout을 의미합니다. contentView를 설정하고 변수 rlOut으로 초기화하여 findViewById을 사용하여 OnCreate 메서드 내에서 위 함수를 호출합니다. 또는 변수 rlOut이 다른 레이아웃 파일에있는 경우 레이아웃 인플레이터를 사용하여 해당 레이아웃을 먼저 팽창시킨 다음 findViewById 메소드를 사용하여 뷰를 찾아야합니다.

희망이 도움이됩니다.

imbBtn.setOnTouchListener(new OnTouchListener() { 

     @Override 
     public boolean onTouch(View v, MotionEvent event) { 
      LayoutParams par = (LayoutParams)imbBtn.getLayoutParams(); 

      if (event.getAction()==MotionEvent.ACTION_MOVE) 
      { 
       Log.d("ok","move"); 
       mX = (int) event.getX() - imbBtn.getWidth()/2; 
       mY = (int) event.getY() - imbBtn.getHeight()/2; 
       par.leftMargin = imbBtn.getLeft() + mX; 
       par.topMargin = imbBtn.getTop() + mY; 
       imbBtn.setLayoutParams(par); 
       et1.setText("mX move: "+String.valueOf(mX)); 
       et2.setText("mY move: "+String.valueOf(mY)); 
      } 
      return false; 
     } 
    }); 

MotionEvent.ACTION_MOVE 당신이 캡처해야하는 유일한 이벤트 :

편집

다음 코드는 아마 당신이 찾고있는 해결책이 될 것이다. 희망이 솔루션은 당신에게 도움이됩니다.

+0

죄송합니다, 나는 주 (state)를 명확하게 알지 못했습니다. rlOut은 RelativeLayout입니다. 레이아웃 인플레이터가 무엇인지, 어떤 용도로 사용되는지, 어떻게 사용하는지는 잘 모릅니다. 내가 가서 찾아 낼거야. – Amblll

+0

레이아웃 인플레이션에 대한 전체 코드를 붙여 넣을 수는 있지만 검색/찾아내는 경우 전체적으로 해당 개념을 배울 수 있습니다. 의문의 여지가 있으면 컴백을하십시오. –

+0

onClick을 사용할 때 레이어 인플레이터를 사용해야하는 시점을 아직도 이해할 수 없습니까? 또한, 레이어 인플레이터 이전 또는 이후에 imageButton 위치를 어떻게 바꿀 수 있는지 알지 못합니다. – Amblll

관련 문제