2016-03-28 11 views
-1

Я использую этот код для перемещения кнопки на экране, но когда я достигаю сторон, он выходит из экрана.Как создать перемещаемую кнопку, которая не перемещается из экрана

private float mPrezX, mPrevY; 

    private static final int MAX_CLICK_DURATION = 200; 
    private long startClickTime; 

    @Override 
    public boolean onTouch(View view, MotionEvent event) { 
     int action = event.getActionMasked(); 

     Button gvup = (Button)findViewById(R.id.giveup); 
     gvup.setBackground(getResources().getDrawable(R.drawable.btn)); 

     switch (action) { 
      case MotionEvent.ACTION_DOWN: { 
       mPrevX = view.getX() - event.getRawX(); 
       mPrevY = view.getY() - event.getRawY(); 
       startClickTime = Calendar.getInstance().getTimeInMillis();//!! 
       gvup.setBackground(getResources().getDrawable(R.drawable.btn1)); 
       break; 
      } 
      case MotionEvent.ACTION_MOVE: 
      { 
       view.animate() 
        .x(event.getRawX() + mPrevX) 
        .y(event.getRawY() + mPrevY) 
        .setDuration(0) 
        .start(); 

       gvup.setBackground(getResources().getDrawable(R.drawable.btn1)); 
       break; 
      } 
      case MotionEvent.ACTION_CANCEL: 
       gvup.setBackground(getResources().getDrawable(R.drawable.btn1)); 
       break; 
      case MotionEvent.ACTION_UP: 
       long clickDuration = Calendar.getInstance().getTimeInMillis() - startClickTime; 
       if(clickDuration < MAX_CLICK_DURATION) { 
        //click event has occurred 
        gvup.setBackground(getResources().getDrawable(R.drawable.btn)); 
        giveUp(); 
       } 
       break; 
     } 
     return true; 
    } 

Я также меняю цвет фона при нажатии, а также делает его интерактивным.

enter image description here

мне нужно держать эту кнопку внутри макета.

Я также пробовал ссылки this и this, но оба этих подхода приводят к нажатию кнопки при перемещении по сторонам.

Пожалуйста, помогите. Спасибо заранее.

enter image description here

ответ

0

Ну что вам нужно, чтобы получить его X местоположение и добавит его ширины к нему, чтобы увидеть, где «право» край и сравнить, если она больше или равна ширине вашего окна просмотра. Я не писал JAVA через некоторое время, но это должно было сделать трюк.

Вы проверяете его местоположение?

Возможно

int rightEdge = currentPos.X + itsWidth; 
if(rightEdge >= screenWidth) // something here 

Может быть в вашем методе одушевленные() сделать свою проверку. Мне трудно угадать, глядя на то, что это делает. Что такое увольнение? Что такое event.getRawX(), равное? Это сенсорная точка на экране? Анимируется ли после выбора точки? Или вы можете определить min/max x и min/max y и не пропускать свой круг.

  view.animate() 
       if(.x(event.getRawX() + mPrevX) > screenWidth){ 
         .x(screenwidth - circleWidth) 
       } // do the same for the Y - must check the max and min for both Y and X 
       .x(event.getRawX() + mPrevX) 
       .y(event.getRawY() + mPrevY) 
       .setDuration(0) 
       .start(); 
+0

У меня возникла ваша идея, и я пробовал ее, но она не работает так, как я ее реализую. –