У меня есть FrameLayout, в котором у меня есть 2 элемента управления: - настраиваемое представление, которое рисует изображение и некоторый текст на нем - текстовое представление с текстом
Я хочу центрировать оба объекта в FrameLayout, но мне это не удается. Texview отцентрирован просто отлично, мой пользовательский вид остается с левой стороны, когда я делаю его видимым.
<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>
Для Матиаса я ничего не делаю в конструкторе, это просто
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();
}
}
Ответы:
Я бы предложил RelativeLayout вместо FrameLayout.
Предполагая, что вы хотите, чтобы TextView всегда находился ниже ImageView, я бы использовал следующий макет.
<?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>
Обратите внимание, что если вы установите
visibility
для элемента значение,gone
то пространство, которое будет занимать этот элемент, исчезнет, тогда как при использованииinvisible
вместо этого пространство, которое он будет использовать, будет сохранено.Если вы хотите, чтобы TextView был поверх ImageView, просто оставьте
android:layout_alignParentTop
или установите его,false
а в TextView оставьтеandroid:layout_below="@id/imageview"
атрибут. Как это.<?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>
Надеюсь, это то, что вы искали.
источник
Мы можем выровнять вид по центру
FrameLayout
, установивlayout_gravity
дочернее представление.В XML:
android:layout_gravity="center"
В коде Java:
FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); params.gravity = Gravity.CENTER;
Примечание:
FrameLayout.LayoutParams
не используйте другие существующие LayoutParamsисточник
Просто следуйте этому порядку
Вы можете центрировать любое количество детей в файле
FrameLayout
.<FrameLayout > <child1 .... android:layout_gravity="center" ..... /> <Child2 .... android:layout_gravity="center" /> </FrameLayout>
Например:
Я сосредоточил CustomView и TextView на
FrameLayout
подобном<FrameLayout android:layout_width="wrap_content" android:layout_height="wrap_content" > <com.airbnb.lottie.LottieAnimationView android:layout_width="180dp" android:layout_height="180dp" android:layout_gravity="center" app:lottie_fileName="red_scan.json" app:lottie_autoPlay="true" app:lottie_loop="true" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:textColor="#ffffff" android:textSize="10dp" android:textStyle="bold" android:padding="10dp" android:text="Networks Available: 1\n click to see all" android:gravity="center" /> </FrameLayout>
источник
FrameLayout
есть одинTextureView
и дваSurfaceView
. С этим (иsetZOrderOnTop(true);
на Surfaces я, наконец, все сосредоточил наложениеУстановите center_horizontal и center_vertical или просто center для атрибута layout_gravity виджета
<?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MovieActivity" android:id="@+id/mainContainerMovie" > <android.support.v7.widget.Toolbar android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="#3a3f51b5" /> <ProgressBar android:id="@+id/movieprogressbar" style="?android:attr/progressBarStyle" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_vertical|center_horizontal" /> </FrameLayout>
источник
Для центрирования вида в Framelayout есть несколько приемов. Самый простой, который я использовал для своего Webview и Progressbar (очень похож на ваш двухобъектный макет), я только что добавил
android:layout_gravity="center"
Вот полный XML на случай, если кому-то еще нужно сделать то же самое.
<?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".WebviewPDFActivity" android:layout_gravity="center" > <WebView android:id="@+id/webView1" android:layout_width="match_parent" android:layout_height="match_parent" /> <ProgressBar android:id="@+id/progress_circular" android:layout_width="250dp" android:layout_height="250dp" android:visibility="visible" android:layout_gravity="center" /> </FrameLayout>
Вот мой результат
источник