2012-06-11 3 views
0

Я пытаюсь переместить положение кнопки изображения при нажатии. Я попробовал следующее, но он сработал на «rlOut.addView (imgP, p);» У меня нет проблем при запуске их в onCreate().Как изменить положение imageButton, когда onClick

общественный класс Delet3Activity расширяет активность {

RelativeLayout rlOut; 
ImageButton imbBtn; 

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

int mX, mY; 

@Override

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

}}

+0

Перед использованием необходимо раздуть представление. Используйте что-то вроде надувного макета. – user1092042

+0

Какая ошибка отображается в logcat при сбое приложения и где именно вы указали переменную вида 'rlOut'? –

+0

. Msg is: threadid = 1: поток, выходящий с неперехваченным исключением (group = 0x4001e578) warning msg FATAL EXCEPTION: main – Amblll

ответ

0

OnCreate метод является местом, где вы установите setContentView(R.layout.main). Я полагаю, что переменная rlOut означает RelativeLayout, которая может быть в вашем основном макете. Вызовите вышеприведенную функцию в методах OnCreate после того, как вы установили contentView и введите , ноту, переменную rlOut, используя findViewById. Или, если переменная rlOut находится в каком-либо другом файле макета, вам придется сначала раздуть этот макет с помощью макета надувной системы, а затем найти вид с помощью метода findViewById.

Надеюсь, это поможет.

EDIT

Следующий код должен, вероятно, будет решение, которое вы ищете:

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

Извините, я не указал ясно, rlOut RelativeLayout. Я понятия не имею, что такое надувной макет, для чего он и как его использовать. Тогда я пойду и узнаю. – Amblll

+0

Я могу вставить весь код для инфляции макета, но если вы сами поищите/узнаете, вы сможете полностью изучить эту концепцию. Вернитесь, если у вас есть какие-либо сомнения. –

+0

Я все еще не понимаю, когда следует использовать надувной слой, когда onClick? Кроме того, я не вижу, как я могу изменить положение imageButton после или перед надувным слоем. – Amblll

Смежные вопросы