0

Dans un jeu j'afficher une vue personnalisée et un FAB dans un FrameLayout:Comment augmenter layout_marginBottom avec un nombre de pixels?

<?xml version="1.0" encoding="utf-8"?> 
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <de.slova.GameView 
     android:id="@+id/gameView" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" /> 

    <android.support.design.widget.FloatingActionButton 
     android:id="@+id/fab" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_gravity="bottom|end" 
     android:layout_marginBottom="16dp" 
     android:layout_marginRight="16dp" 
     android:src="@drawable/play_white" /> 

</FrameLayout> 

Cependant, la FAB est montré trop faible et obscurcit la barre bleu clair au fond:

screenshot

J'ai besoin d'augmenter le layout_marginBottom par la hauteur de la barre bleu clair (indiquée par les flèches rouges à la capture d'écran ci-dessus), de sorte que le FAB est déplacé vers le haut. Je connais la hauteur de la barre en pixels (le contenu de ma vue personnalisée est mis à l'échelle par une matrice) et je pense que je connais le bon endroit pour cette action (la méthode onSizeChanged dans ma vue personnalisée) - mais mon la difficulté est d'obtenir la valeur layout_marginBottom du FAB.

Comment y accéder et le modifier s'il vous plaît? J'ai essayé:

@Override 
protected void onSizeChanged(int w, int h, int oldW, int oldH) { 
    super.onSizeChanged(w, h, oldW, oldH); 

    int h = mBar.getHeight(); 

    ViewGroup.LayoutParams params = mFab.getLayoutParams(); 

    // how to add h to layout_marginBottom here? 

    mFab.setLayoutParams(params); 
} 

Par la façon dont j'ai deux méthodes pour traduire entre dp et px si nécessaire ici:

public static float px2sp(Context context, float px) { 
    float scaledDensity = context.getResources().getDisplayMetrics().scaledDensity; 
    return px/scaledDensity; 
} 

public static float sp2px(Context context, float sp) { 
    float scaledDensity = context.getResources().getDisplayMetrics().scaledDensity; 
    return sp * scaledDensity; 
} 
+1

Est-ce que la partie inférieure bleue de la GameView? –

+0

Oui partie de la GameView, sa hauteur en pixels est 'mBar.getHeight()' –

Répondre

1

propriété margin fait partie de FrameLayout.LayoutParams classe, donc vous devez jeter à FrameLayout.LayoutParams

FrameLayout.LayoutParams param = (FrameLayout.LayoutParams) fab.getLayoutParams(); 
param.bottomMargin = mBar.getHeight(); 
fab.setLayoutParams(param); 
+0

Je ne vois pas la propriété 'params.bottomMargin' dans mon code Java, il n'y a que params.height' et' params.width '. –

+0

Oh c'est un code kotlin .. Je vais le convertir en Java –

+0

Je comprends que c'est Kotlin, mais ne trouve pas les propriétés correspondantes en Java en faisant 'ViewGroup.LayoutParams params = mFab.getLayoutParams();' –