2010-10-29 5 views
53

J'ai un FrameLayout dans lequel j'ai 2 contrôles: - une vue personnalisée qui tire une image et un texte sur elle - un textview avec un textevue centre Android dans FrameLayout ne fonctionne pas

Je veux Centrer les deux dans le FrameLayout mais je n'arrive pas à le faire. Le Texview est bien centré, ma vue cusom reste sur le côté gauche, quand je la rends visible.

<FrameLayout android:id="@+id/CompassMap" 
       android:layout_width="fill_parent" 
       android:layout_height="wrap_content" 
       android:layout_weight="1" 
       android:gravity="center"> 

      <view class="com.MyView" 
     android:id="@+id/myView" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_gravity="center_vertical|center_horizontal" 
     android:visibility="gone"/> 

       <TextView android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_gravity="center_vertical|center_horizontal" 
     android:text="CENTERED" /> 
</FrameLayout> 

Pour Mathias, je ne fais rien dans le constructeur, il est tout simple

public class MyMapView extends View { 

private int xPos = 0; 
private int yPos = 0; 
private Bitmap trackMap; 

private Matrix backgroundMatrix; 
private Paint backgroundPaint; 

private Bitmap position; 
private Matrix positionMatrix; 
private Paint positionPaint; 

public MyMapView(Context context) { 
    super(context); 
    init(context, null); 
} 

public MyMapView(Context context, AttributeSet attrs) { 
    super(context, attrs); 
    init(context, attrs); 
} 

public MyMapView(Context context, AttributeSet attrs, int defStyle) { 
    super(context, attrs, defStyle); 
    init(context, attrs); 
} 

private void init(final Context context, AttributeSet attrs) { 

backgroundMatrix = new Matrix(); 
backgroundPaint = new Paint(); 
backgroundPaint.setFilterBitmap(true); 

position = BitmapFactory.decodeResource(getContext().getResources(), R.drawable.position); 
positionMatrix = new Matrix(); 

positionPaint = new Paint(); 
positionPaint.setFilterBitmap(true); 
} 

@Override 
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 
    setMeasuredDimension(MeasureSpec.getSize(widthMeasureSpec), MeasureSpec.getSize(heightMeasureSpec)); 
} 

@Override 
protected void onDraw(Canvas canvas) { 

    int width = getMeasuredWidth(); 
    int height = getMeasuredHeight(); 

    if (trackMap!=null) 
    { 
     Bitmap resizedBitmap = Bitmap.createScaledBitmap(trackMap, height, height, true); 
     canvas.drawBitmap(resizedBitmap, backgroundMatrix, backgroundPaint); 

    } 

     canvas.save(Canvas.MATRIX_SAVE_FLAG); 
     canvas.translate(xPos-position.getWidth()/2, yPos-position.getHeight()/2); 
     canvas.drawBitmap(position, positionMatrix, positionPaint); 

     canvas.restore(); 
} 

    public void updatePosition(int xpos, int ypos, Bitmap trackImage) 
    { 
     xPos=xpos; 
     yPos=ypos; 
     trackMap = trackImage; 
     invalidate(); 
    } 
} 
+1

D'où provient votre vue personnalisée? Bien sûr, vous manipulez les paramètres dans votre constructeur? –

+0

Y a-t-il une raison particulière pour laquelle vous devez utiliser un FrameLayout et le TextView doit-il être affiché en haut de la vue? –

+1

Oui, le FrameLayout ne vous laissera pas faire cela. C'est vraiment juste pour tenir une seule vue. Si vous ajoutez plus à cela que cela, il aura le comportement exact que vous mentionnez, il ajoute simplement des éléments dans une pile verticale en épinglant en haut à gauche. http://developer.android.com/reference/android/widget/FrameLayout.html – plainjimbo

Répondre

29

Je vous suggère un RelativeLayout au lieu d'un FrameLayout.

En supposant que vous vouliez avoir le TextView toujours en dessous de l'ImageView, j'utiliserais la disposition suivante.

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content"> 
    <ImageView 
     android:id="@+id/imageview" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentTop="true" 
     android:layout_centerInParent="true" 
     android:src="@drawable/icon" 
     android:visibility="visible"/> 
    <TextView 
     android:id="@+id/textview" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_centerInParent="true" 
     android:layout_below="@id/imageview" 
     android:gravity="center" 
     android:text="@string/hello"/> 
</RelativeLayout> 

Notez que si vous définissez l'visibility d'un élément à gone alors l'espace que l'élément consommerait est parti alors que lorsque vous utilisez l'espace invisible au lieu qu'il avait consommer sera préservée.

Si vous voulez avoir la TextView au-dessus du ImageView, alors laissez le android:layout_alignParentTop ou le mettre à false et sur la TextView laisser de l'attribut android:layout_below="@id/imageview". Comme ça.

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content"> 
    <ImageView 
     android:id="@+id/imageview" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentTop="false" 
     android:layout_centerInParent="true" 
     android:src="@drawable/icon" 
     android:visibility="visible"/> 
    <TextView 
     android:id="@+id/textview" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_centerInParent="true" 
     android:gravity="center" 
     android:text="@string/hello"/> 
</RelativeLayout> 

J'espère que c'est ce que vous cherchiez.

+0

Votre explication semble très bonne et cela devrait fonctionner dans mon cas, mais ce n'est pas le cas. Dans mon RelativeLayout, j'ai plus que ce que j'ai dit: 2 vues personnalisées, un LinearLayout, un Button et un TextView. Ce qui est curieux que tout fonctionne, sauf ma vue personnalisée. L'autre vue personnalisée n'est pas influencée comme les attributs fill_parent. Mais, j'essaie de voir si je n'ai pas manqué quelque chose. Je vous remercie. – Alin

+0

Quel est le but de votre vue personnalisée? –

+0

J'ai ajouté le code entier de la vue personnalisée sur la question. Fondamentalement, dessine une grande image en arrière-plan et une plus petite en position x, y. – Alin

260

Nous pouvons aligner une vue dans le centre de la Framelayout en réglant le layout_gravity de la vue des enfants par

en XML:

layout_gravity = "center" 

(ou)

en JAVA:

dans votre code.

+74

Ceci devrait être la réponse acceptée. L'autre change la question plutôt que de répondre. – Muz

+0

Y cette solution n'a pas fonctionné pour moi. Ajout d'Imageview au centre de Frame layout.cap = new ImageView (CameraActivity.this); \t \t LayoutParams params2 = new LayoutParams (LayoutParams.WRAP_CONTENT, \t \t \t \t LayoutParams.WRAP_CONTENT); \t \t params2.gravity = Gravité.CENTRE; \t \t cap.setLayoutParams (params2); \t \t cameraView.addView (capuchon); –

+5

Maintenant, cela a fonctionné pour moi. Mon erreur a été que j'ai été importé mauvais paquet. Après 4 heures j'ai eu mon erreur que le paquet réel devrait importer est android.widget.FrameLayout.LayoutParams; –

Questions connexes