2016-09-14 2 views
0

J'ai deux boutons: 1 et 2. Le premier bouton est situé dans le centre de mise en page et la deuxième traduction de la volonté en utilisant setTranslationX and setTranslationY Le code est pour c'estsetTranslationX et setTranslationY font la mauvaise position de Button dans Android. Pourquoi?

btn1 = (Button) findViewById(R.id.btn1); 
    setRotateButton(btn1,2,1); 
    btn2 = (Button) findViewById(R.id.btn2); 
    setRotateButton(btn2,2,2); 

setRotateButton est

public void setRotateButton(Button btn,int numViews,int index) 
{ 
    //Locate button in center 
    FrameLayout.LayoutParams lp = new FrameLayout.LayoutParams(130, 130); 
    lp.gravity = Gravity.CENTER; 
    btn.setLayoutParams(lp); 
    //Translation 
    if (index>1) //To avoid first case 
    { 
     float angleDeg = index * 360.0f/numViews - 90.0f; 
     float angleRad = (float)(angleDeg * Math.PI/180.0f); 
     btn.setTranslationX(400 * (float)Math.cos(angleRad)); 
     btn.setTranslationY(400 * (float)Math.sin(angleRad)); 
    }  
} 

J'ai trouvé un problème: lorsque j'utilise setTranslationX,setTranslationY, l'emplacement du bouton 2 peut être traduit vers un autre emplacement mais j'ai un mauvais numéro pour l'emplacement du bouton 2. Il renvoie toujours la même valeur. Pour le vérifier. J'utilise la méthode onTouch (mainFrame est un FrameLayout où se trouvent ces deux boutons). Pourriez-vous m'aider à corriger la fonction dans setRotateButton? Merci beaucoup.

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

     mainFrame.setOnTouchListener(new View.OnTouchListener() { 
      @Override 
      public boolean onTouch(View v, MotionEvent event) { 

       int x = (int) event.getX(); 
       int y = (int) event.getY(); 

       for (int i = 0; i < mainFrame.getChildCount(); i++) { 
        View current = mainFrame.getChildAt(i); 
        if (current instanceof Button) { 
         Button b = (Button) current; 
         Log.d("TAG","Btn pos:"+String.valueOf(b.getLeft())+";"+String.valueOf(b.getRight())+";"+String.valueOf(b.getTop())+";"+String.valueOf(b.getBottom())); 
         if (!isPointWithin(x, y, b.getLeft(), b.getRight(), b.getTop(), 
           b.getBottom())) { 
          b.getBackground().setState(defaultStates); 
          b.getBackground().setAlpha(255); 

         } 

         if (isPointWithin(x, y, b.getLeft(), b.getRight(), b.getTop(), 
           b.getBottom())) { 
          b.getBackground().setState(STATE_PRESSED); 
          b.getBackground().setAlpha(150); 
          b.performClick(); 

          if (b != mLastButton) { 
           mLastButton = b; 

          } 
         } 

        } 

       } 
       return true; 
      } 

     }); 

    } 

Ce résultat est journal

Lorsque je déplace le doigt dans le bouton 1, et de passer à l'extérieur

09-15 00:15:50.981 20547-20547/com.example.circlelayout D/TAG: Btn pos:0;150;300;450 
09-15 00:01:40.891 20547-20547/com.example.circlelayout D/TAG: Btn pos:397;527;485;615 

Lorsque je déplace le doigt dans le bouton 2 et se déplacer à l'extérieur. Ils sont même valeur

09-15 00:01:40.891 20547-20547/com.example.circlelayout D/TAG: Btn pos:397;527;485;615 
09-15 00:01:40.891 20547-20547/com.example.circlelayout D/TAG: Btn pos:397;527;485;615 
09-15 00:01:40.891 20547-20547/com.example.circlelayout D/TAG: Btn pos:397;527;485;615 

Répondre

1

Des méthodes telles que getLeft() ne tiennent pas compte du fait que le View a été traduit. Ils renvoient toujours la valeur initiale calculée lors du processus de mise en page.

Vous devez donc utiliser getX() et getY() et calculer les nouveaux coins inférieur et droit. Par exemple:

int bX = b.getX(); 
intbY = b.getY(); 

if (isPointWithin(x, y, 
      bX, bX + (b.getRight() - b.getLeft()), 
      bY, bY + (b.getBottom() - b.getTop()))) 
{ 
    b.getBackground().setState(STATE_PRESSED); 
    b.getBackground().setAlpha(150); 
    b.performClick(); 

    if (b != mLastButton) { 
     mLastButton = b; 
    } 
}