2016-08-12 2 views
1

Ich verwende Floating Action Button. Ich möchte die Position von fab ändern, wenn der Benutzer die Fab berührt und es zieht. Ich benutze onTouchListener, aber es bewegt die Fab nicht gut. Hier ist mein Code:Wie ändere ich die Position von fab mit onTouchListener?

final FloatingActionButton fabButton = new FloatingActionButton.Builder(this) 
    .withDrawable(getResources().getDrawable(R.drawable.fab)) 
    .withButtonColor(Color.WHITE) 
    .withGravity(Gravity.BOTTOM | Gravity.RIGHT) 
    .withMargins(0, 0, 16, 16) 
    .create(); 
    fabButton.setAlpha(0.6f); 
    fabButton.setOnTouchListener(new OnTouchListener() { 

     @Override 
     public boolean onTouch(View v, MotionEvent event) { 
      // TODO Auto-generated method stub 
      fabButton.setX(event.getX()); 
      fabButton.setY(event.getY()); 

      return false; 
     } 
    }); 

Dank von allen möglichen Vorschlägen im Voraus ...

Antwort

1

Das Problem war in return false; Wenn der Listener bei einem Finger-Down-Ereignis den Wert false zurückgibt, wird move-Ereignis in einfachen Worten ignoriert. Versuchen Sie diesen Code:

fabButton.setOnTouchListener(new View.OnTouchListener() { 

     float x, y; 
     @Override 
     public boolean onTouch(View v, MotionEvent event) { 
      switch (event.getAction()){ 

       case MotionEvent.ACTION_MOVE: 

        fabButton.setX(fabButton.getX() + (event.getX() - x)); 
        fabButton.setY(fabButton.getY() + (event.getY() - y)); 
        return true; 
       case MotionEvent.ACTION_DOWN: 
        x = event.getX(); 
        y = event.getY(); 
        return true; 
      } 

      return false; 
     } 
    }); 

Auch als x und y sind Koordinaten der linken oberen Ecke der Ansicht, Sie wollen wahrscheinlich nicht x und y der Berührung, da diese Koordinaten setzen. Stattdessen sollten Sie Bewegungsdelta berechnen und Anfangskoordinaten von fab erhöhen, wie ich im Schnipsel über

+0

angegeben habe Dank eine Million, es funktionierte sehr gut. –

Verwandte Themen