Ich habe ein FrameLayout, in dem ich zwei Steuerelemente habe: - eine benutzerdefinierte Ansicht, in der ein Bild und Text darauf gezeichnet werden - eine Textansicht mit einem Text
Ich möchte beide im FrameLayout zentrieren, aber ich kann es nicht schaffen. Die Texview ist gut zentriert, meine Cusom-Ansicht bleibt auf der linken Seite, wenn ich sie 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>
Für Mathias mache ich nichts im Konstruktor, es ist 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();
}
}
Antworten:
Ich würde ein RelativeLayout anstelle eines FrameLayout vorschlagen.
Angenommen, Sie möchten, dass die Textansicht immer unter der Bildansicht liegt, würde ich das folgende Layout verwenden.
Beachten Sie, dass, wenn Sie das
visibility
eines Elements auf setzen,gone
der Speicherplatz, den dieses Element belegen würde, weg ist, während bei Verwendunginvisible
stattdessen der Speicherplatz, den es verbrauchen würde, erhalten bleibt.Wenn Sie möchten, dass die Textansicht über der Bildansicht liegt, lassen Sie das Attribut einfach weg
android:layout_alignParentTop
oder setzen Sie es auffalse
und in der Textansicht lassen Sie dasandroid:layout_below="@id/imageview"
Attribut weg . So was.Ich hoffe, das haben Sie gesucht.
quelle
Wir können eine Ansicht in der Mitte von ausrichten,
FrameLayout
indem wir die Ansichtlayout_gravity
der untergeordneten Ansicht festlegen.In XML:
Im Java-Code:
Hinweis: Verwenden Sie
FrameLayout.LayoutParams
nicht die anderen vorhandenen LayoutParamsquelle
Folgen Sie einfach dieser Reihenfolge
Sie können eine beliebige Anzahl von Kindern in einem zentrieren
FrameLayout
.Beispielsweise:
Ich zentrierte ein Custom und ein Textview auf einem
FrameLayout
wie diesequelle
FrameLayout
, die einsTextureView
und zwei enthältSurfaceView
. Mit diesem (und demsetZOrderOnTop(true);
auf den Oberflächen habe ich endlich alles überlagertSetzen Sie 'center_horizontal' und 'center_vertical' oder einfach 'center' des Attributs layout_gravity des Widgets
quelle
Um eine Ansicht in Framelayout zu zentrieren, stehen einige Tricks zur Verfügung. Die einfachste, die ich für meine Webansicht und meine Fortschrittsanzeige verwendet habe (sehr ähnlich zu Ihrem Layout mit zwei Objekten), habe ich gerade hinzugefügt
android:layout_gravity="center"
Hier finden Sie vollständiges XML für den Fall, dass jemand anderes dasselbe tun muss
Hier ist meine Ausgabe
quelle