2010-10-29 9 views
53

Ich habe einen FrameLayout, in dem ich habe 2 Kontrollen: - eine benutzerdefinierte Ansicht, die ein Bild zieht und einen Text auf es - ein Textview mit einem TextAndroid Ansicht Zentrum in FrameLayout funktioniert nicht

Ich mag um beide im FrameLayout zu zentrieren, aber ich schaffe es nicht. Das Texview ist genau zentriert, meine cusom Ansicht bleibt auf der linken Seite, wenn ich es sichtbar mache.

<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> 

Um Mathias, ich mache nichts im Konstruktor, es ist nur einfach

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

Wohin wird Ihre benutzerdefinierte Ansicht erweitert? Sicher, Sie behandeln die Parameter in Ihrem Konstruktor? –

+0

Gibt es einen besonderen Grund, dass Sie ein FrameLayout verwenden müssen und das TextView über der Ansicht angezeigt wird? –

+1

Ja, das FrameLayout lässt dich das nicht machen. Es ist wirklich nur für das Halten einer einzigen Ansicht. Wenn Sie mehr als das hinzufügen, wird es genau das Verhalten haben, das Sie erwähnen, es fügt einfach Elemente in einem vertikalen Stapel hinzu, indem Sie oben links pinnen. http://developer.android.com/reference/android/widget/FrameLayout.html – plainjimbo

Antwort

29

ich anstelle eines FrameLayout ein RelativeLayout vorschlagen würde.

Angenommen, Sie möchten das TextView immer unter dem ImageView haben, würde ich folgendes Layout verwenden.

<?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> 

Beachten Sie, dass, wenn Sie die visibility eines Elements gone dann den Raum gesetzt würde das Element verbrauchen während weg ist, wenn Sie verwenden invisible statt der Raum es bleiben erhalten verbrauchen würde.

Wenn Sie die Textview auf das Image dann einfach lassen Sie die android:layout_alignParentTop oder setzen Sie sich auf false und auf der Textview lassen Sie die android:layout_below="@id/imageview" Attribute haben wollen. So was.

<?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> 

Ich hoffe, das ist, was Sie gesucht haben.

+0

Ihre Erklärung sieht sehr gut aus und es sollte in meinem Fall funktionieren, aber das tut es nicht. In meinem RelativeLayout habe ich mehr als ich sagte: 2 benutzerdefinierte Ansichten, ein LinearLayout, eine Schaltfläche und eine TextView. Was ist neugierig, dass alles außer meiner benutzerdefinierten Ansicht funktioniert. Die andere benutzerdefinierte Ansicht wird nicht wie die Attribute fill_parent beeinflusst. Aber ich versuche zu sehen, ob ich etwas verpasst habe. Vielen Dank. – Alin

+0

Was ist der Zweck Ihrer benutzerdefinierten Ansicht? –

+0

Ich habe den gesamten Code der benutzerdefinierten Ansicht zu der Frage hinzugefügt. Zeichnet grundsätzlich ein großes Bild als Hintergrund und einen kleineren auf x, y Position. – Alin

260

Wir, indem die layout_gravity der Kind Ansicht von

in XML eine Ansicht im Zentrum des Framelayouts ausrichten können:

layout_gravity = "center" 

(oder)

in JAVA:

LayoutParams lp = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); 
lp.gravity = Gravity.CENTER; 

in Ihrem Code.

+74

Dies sollte die akzeptierte Antwort sein. Der andere ändert die Frage, anstatt sie zu beantworten. – Muz

+0

Y diese Lösung hat für mich nicht funktioniert. Imageview in der Mitte von 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 = Gravity.CENTER; \t \t cap.setLayoutParams (params2); \t \t cameraView.addView (Cap); –

+5

Jetzt hat es für mich funktioniert. Mein Fehler war, dass ich falsches Paket importiert habe. Nach 4 Stunden habe ich meinen Fehler, dass das tatsächliche Paket importieren soll, android.widget.FrameLayout.LayoutParams; –