0

Schließlich fand ich Tutorial mit Floating Action Button Beispiel.Relocationg Floating Action Button von Benutzer

-Link: http://www.viralandroid.com/2016/02/android-floating-action-menu-example.html

Nun möchte Ich mag Benutzer ermöglichen, Aktionstaste an eine beliebige Stelle auf dem Bildschirm zu bewegen. Dann könnte er es öffnen und eine der Optionen auswählen.

Das letzte Mal habe ich sehr dasselbe mit View-Objekten statt FloatingActionButton-Objekt gemacht und es hat perfekt funktioniert. Mit FloatingActionButton ist es nicht gelungen.

Ich habe zwei Versuche unternommen.

1) In der ersten setze ich SetOnTouchListiner auf LayoutInfater-Objekt (wie in meinem Beispiel), aber das einzige, was ich tun konnte, ist den Bildschirm nach links oder rechts wischen und dann leicht nach rechts oder links bewegt. Als ich den Knopf berührte und dann bewegte - nichts passierte.

2) Ich habe auch versucht, setOnTouchListiner direkt auf FloatingActionButton zu setzen, aber es erscheint nicht einmal.

Wie kann ich Benutzer diesen FloatingActionButton verschieben lassen?

Hier ist Code mit Ansicht Objekte und unter meinem Versuch nein. 1 mit FloatingActionButton.

Noch eine Bemerkung: FlyingButton erweitert Service und MaterialDesingDialog erweitert Aktivität. Das ist absichtlich. Im Allgemeinen möchte ich einen Button über alle Systemicons haben. Da MaterialDesingDialog nicht wie gewünscht funktioniert, habe ich die Aktivitätsklasse erweitert, da ich vermutete, dass das Problem darin besteht, den Dienst zu erweitern.

Ansicht Objekte

public class FlyingButton extends Service { 


private WindowManager windowManager; 
public Dialog dialog; 
View layout,dialogLayout; 
int ciekawyX, ciekawyY; 

ImageView button1,button2,button3,button_cross; 


@Override 
public IBinder onBind(Intent intent) { 
    // TODO Auto-generated method stub 
    return null; 
} 

@Override 
public void onCreate() { 
    super.onCreate(); 

    setTheme(R.style.AppTheme); 

    windowManager = (WindowManager) getSystemService(WINDOW_SERVICE); 

    LayoutInflater inflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE); 
    layout = inflater.inflate(R.layout.activity_main, null); 

    final WindowManager.LayoutParams params = new WindowManager.LayoutParams(
      WindowManager.LayoutParams.WRAP_CONTENT, 
      WindowManager.LayoutParams.WRAP_CONTENT, 
      WindowManager.LayoutParams.TYPE_PHONE, 
      WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE, 
      PixelFormat.TRANSLUCENT); 

    params.gravity = Gravity.TOP | Gravity.START; 
    params.x = 0; 
    params.y = 0; 

    windowManager.addView(layout, params); 


    try { 
     layout.setOnTouchListener(new View.OnTouchListener() { 
      private WindowManager.LayoutParams paramsF = params; 
      private int initialX; 
      private int initialY; 
      private float initialTouchX; 
      private float initialTouchY; 

      float move_X_axis,move_Y_axis; 

      @Override public boolean onTouch(View v, MotionEvent event) { 
       switch (event.getAction()) { 
        case MotionEvent.ACTION_DOWN: 

         //Log.e("ACTION_DOWN","1"); 

         initialX = paramsF.x; 
         initialY = paramsF.y; 
         initialTouchX = event.getRawX(); 
         initialTouchY = event.getRawY(); 

         break; 
        case MotionEvent.ACTION_UP: 
         //Log.e("ACTION_UP","2"); 

         if((move_X_axis < 0.1) && (move_Y_axis < 0.1) ) { 
          if (layout.getWindowToken() != null) { 
           //windowManager.removeView(layout); 
           Log.e(""+move_X_axis,""+move_Y_axis); 
           CustomDialog(); 
          } 
         } 
         break; 
        case MotionEvent.ACTION_MOVE: 
         //Log.e("ACTION_MOVE","3"); 

         paramsF.x = initialX + (int) (event.getRawX() - initialTouchX); 
         paramsF.y = initialY + (int) (event.getRawY() - initialTouchY); 
         windowManager.updateViewLayout(layout, paramsF); 

         move_X_axis = event.getRawX() - initialTouchX; 
         move_Y_axis = event.getRawY() - initialTouchY; 

         ciekawyX = paramsF.x; 
         ciekawyY = paramsF.y; 

         break; 
       } 

       return false; 
      } 
     }); 


    } catch (Exception e) { 
     // TODO: handle exception 
    } 

} 

@Override 
public void onDestroy() { 
    super.onDestroy(); 
    //if (chatHead != null) windowManager.removeView(chatHead); 
} 


public void CustomDialog(){ 

    LayoutInflater inflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE); 
    dialogLayout = inflater.inflate(R.layout.dialogbox, null); 


    final WindowManager.LayoutParams params = new WindowManager.LayoutParams(
      WindowManager.LayoutParams.WRAP_CONTENT, 
      WindowManager.LayoutParams.WRAP_CONTENT, 
      WindowManager.LayoutParams.TYPE_PHONE, 
      WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE, 
      PixelFormat.TRANSLUCENT); 

    params.gravity = Gravity.TOP | Gravity.START; 
    params.x = ciekawyX; 
    params.y = ciekawyY; 


    if(layout.getWindowToken() != null) { 

     windowManager.removeView(layout); 
    //} 

    //if(dialogLayout.getWindowToken() != null){ 
     windowManager.addView(dialogLayout, params); 
    } 


    button1 = (ImageView) dialogLayout.findViewById(R.id.button1); 

    button1.setOnClickListener(new View.OnClickListener(){ 
     @Override 
     public void onClick(View v) 
     { 
      Log.e("BRAWO","KLIKNALES BUTTON1"); 
     } 

    }); 

    button2 = (ImageView) dialogLayout.findViewById(R.id.button2); 

    button2.setOnClickListener(new View.OnClickListener(){ 
     @Override 
     public void onClick(View v) 
     { 
      Log.e("BRAWO","KLIKNALES BUTTON2"); 
     } 

    }); 

    button3 = (ImageView) dialogLayout.findViewById(R.id.button3); 

    button3.setOnClickListener(new View.OnClickListener(){ 
     @Override 
     public void onClick(View v) 
     { 
      Log.e("BRAWO","KLIKNALES BUTTON3"); 
     } 

    }); 


    button_cross = (ImageView) dialogLayout.findViewById(R.id.cross_button); 

    button_cross.setOnClickListener(new View.OnClickListener(){ 
     @Override 
     public void onClick(View v) 
     { 

      if(dialogLayout.getWindowToken() != null) { 
       windowManager.removeView(dialogLayout); 
       //} 

       //if(dialogLayout.getWindowToken() != null){ 
       windowManager.addView(layout, params); 
      } 
     } 

    }); 


} 

} 

FloatingActionButton

public class MaterialDesingDialog extends Activity{ 

FloatingActionMenu materialDesignFAM; 
private WindowManager windowManager; 
View inflatedMaterialDesignDialog; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    windowManager = (WindowManager) getSystemService(WINDOW_SERVICE); 

    LayoutInflater inflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE); 
    inflatedMaterialDesignDialog = inflater.inflate(R.layout.material_design_dialogbox, null); 

    materialDesignFAM = (FloatingActionMenu) findViewById(R.id.material_design_android_floating_action_menu); 


    final WindowManager.LayoutParams params = new WindowManager.LayoutParams(
      WindowManager.LayoutParams.WRAP_CONTENT, 
      WindowManager.LayoutParams.WRAP_CONTENT, 
      WindowManager.LayoutParams.TYPE_PHONE, 
      WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE, 
      PixelFormat.TRANSLUCENT); 

    params.gravity = Gravity.TOP | Gravity.START; 
    params.x = 0; 
    params.y = 0; 

    windowManager.addView(inflatedMaterialDesignDialog, params); 

    try { 

     inflatedMaterialDesignDialog.setOnTouchListener(new View.OnTouchListener() { 
      private WindowManager.LayoutParams paramsF = params; 
      private int initialX; 
      private int initialY; 
      private float initialTouchX; 
      private float initialTouchY; 

      float move_X_axis,move_Y_axis; 

      @Override public boolean onTouch(View v, MotionEvent event) { 
       switch (event.getAction()) { 
        case MotionEvent.ACTION_DOWN: 

         Log.e("ACTION_DOWN","1"); 

         initialX = paramsF.x; 
         initialY = paramsF.y; 
         initialTouchX = event.getRawX(); 
         initialTouchY = event.getRawY(); 

         break; 
        case MotionEvent.ACTION_UP: 
         Log.e("ACTION_UP","2"); 


         break; 
        case MotionEvent.ACTION_MOVE: 
         Log.e("ACTION_MOVE","3"); 


         paramsF.x = initialX + (int) (event.getRawX() - initialTouchX); 
         paramsF.y = initialY + (int) (event.getRawY() - initialTouchY); 

         move_X_axis = event.getRawX() - initialTouchX; 
         move_Y_axis = event.getRawY() - initialTouchY; 

         windowManager.updateViewLayout(inflatedMaterialDesignDialog, paramsF); 

         break; 
       } 

       return false; 
      } 
     }); 


    } catch (Exception e) { 
     // TODO: handle exception 
    } 
} 
} 

Antwort

0

ich diese Art von Floating-Schaltfläche in meinem Projekt implementiert haben. Ich denke, Ihr Problem liegt an LayoutInflater. Legen Sie keine Ansicht mit schwebendem Button in WindowManager fest. Setzen Sie den schwebenden Knopf direkt auf Ihre WindowManager.

Es folgt mein Code, der gut für mich gearbeitet:

public class notificationService extends Service{ 

private WindowManager windowManager; 
WindowManager.LayoutParams params; 
FloatingActionButton Abutton; 
Context context; 
public FloatingActionMenu menu; 
private final IBinder noteBind = new NotificationBinder(); 

@Override 
public boolean onUnbind(Intent intent){ 
    return false; 
} 
@Override 
public IBinder onBind(Intent intent) { 
    // TODO Auto-generated method stub 
    return noteBind; 
} 

@Override 
public void onCreate() { 
    super.onCreate(); 

    windowManager = (WindowManager) getSystemService(WINDOW_SERVICE); 

    Abutton = new FloatingActionButton(this); 
    Abutton.setProgress(0,true); 
    Abutton.setColorNormal(ResourcesCompat.getColor(getResources(),R.color.floatingButtonColor,null)); 
    Abutton.setColorPressed(ResourcesCompat.getColor(getResources(),R.color.floatingButtonColorPressed,null)); 
    Abutton.setColorRipple(ResourcesCompat.getColor(getResources(),R.color.floatingButtonColorRipple,null)); 


    Abutton.setImageResource(R.mipmap.pause_note); 
    Abutton.setX(25); 


    Abutton.setOnClickListener(new View.OnClickListener() { //set onclick events here 
     @Override 
     public void onClick(View view) { 

       // Handle your onClick event here. 

     } 
    }); 


    params = new WindowManager.LayoutParams(
      WindowManager.LayoutParams.WRAP_CONTENT, 
      WindowManager.LayoutParams.WRAP_CONTENT, 
      WindowManager.LayoutParams.TYPE_PHONE, 
      WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE, 
      PixelFormat.TRANSLUCENT); 

    params.gravity = Gravity.TOP | Gravity.LEFT; 
    params.x = 0; 
    params.y = 100; 


    windowManager.addView(Abutton,params); //directly add your floating button here. 


    try { 
     Abutton.setOnTouchListener(new View.OnTouchListener() { 
      private WindowManager.LayoutParams paramsF = params; 
      private int initialX; 
      private int initialY; 
      private float initialTouchX; 
      private float initialTouchY; 

      @Override public boolean onTouch(View v, MotionEvent event) { 
       switch (event.getAction()) { 
        case MotionEvent.ACTION_DOWN: 

         // Get current time in nano seconds. 

         initialX = paramsF.x; 
         initialY = paramsF.y; 
         initialTouchX = event.getRawX(); 
         initialTouchY = event.getRawY(); 
         break; 
        case MotionEvent.ACTION_UP: 
         break; 
        case MotionEvent.ACTION_MOVE: 
         paramsF.x = initialX + (int) (event.getRawX() - initialTouchX); 
         paramsF.y = initialY + (int) (event.getRawY() - initialTouchY); 
         windowManager.updateViewLayout(Abutton, paramsF); 
         break; 
       } 
       return false; 
      } 
     }); 
    } catch (Exception e) { 
     // TODO: handle exception 
    } 

} 

@Override 
public void onDestroy() { 
    super.onDestroy(); 
    if (Abutton != null) windowManager.removeView(Abutton); 
} 
} 

ich diesen Knopf implementiert haben programmatisch nur. Es gibt also kein XML-Layout dafür. Hoffe das hilft dir :)

+0

Leider funktioniert deine Lösung nicht. Schaltfläche wird nicht angezeigt. Ich konnte auch Methoden nicht finden, die Sie auf Knopf setzen. Es ist: setProgress(), setColorNormal(), setColorPressed(), setColorRipple(). Diese können nicht gelöst werden. Vielleicht sprechen wir über verschiedene Floating Action Button? – Vojti

+0

https://github.com/Clans/FloatingActionButton Ich habe diese schwebende Schaltfläche implementiert. Und ich habe festgestellt, dass auch in Ihrem Link dieser Button beschrieben ist. Hast du passende Abhängigkeiten hinzugefügt? –

+0

Ja, ich habe es hinzugefügt. 'Abhängigkeiten { filetree (dir: 'libs', schließen ein: [ '* .jar']) kompilieren testCompile 'junit: junit: 4.12' Kompilierung‚com.android.support:appcompat-v7:23.1.0 ' kompilieren' com.android.support:design:23.1.0 ' kompilieren' com.github.clans: fab: 1.6.2 ' } ' – Vojti