फ्रेमलैटआउट में Android केंद्र दृश्य काम नहीं करता है


83

मेरे पास एक फ्रेम-आउट है जिसमें मेरे 2 नियंत्रण हैं: - एक कस्टम दृश्य जो एक छवि और उस पर कुछ पाठ खींचता है - एक पाठ के साथ एक टेक्स्टव्यू

मैं फ्रेमलैट में दोनों को केंद्र में रखना चाहता हूं लेकिन मैं इसे करने का प्रबंधन नहीं कर सकता। टेक्सव्यू ठीक-ठाक केंद्रित है, मेरा क्यूसोम दृश्य बाईं ओर बना हुआ है, जब मैं इसे दृश्यमान बनाता हूं।

<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();
    }
}

1
आपका कस्टम दृश्य कहां से बढ़ा है? सुनिश्चित करें कि आप अपने निर्माता में मापदंडों को संभाल रहे हैं?
मथियास कॉनराड

क्या कोई विशेष कारण है कि आपको फ्रेमलेयआउट का उपयोग करना है और टेक्स्ट व्यू व्यू के शीर्ष पर प्रदर्शित होना है?
ओक्टेवियन ए। डामियन

1
हाँ, फ्रेमलेआउट आपको ऐसा नहीं करने देगा। यह वास्तव में सिर्फ एक दृश्य को धारण करने के लिए है। यदि आप इससे अधिक जोड़ते हैं, तो इसका सटीक व्यवहार होगा जिसका आप उल्लेख कर रहे हैं, यह बस ऊपरी बाईं ओर पिन करके एक ऊर्ध्वाधर स्टैक में तत्वों को जोड़ता है। developer.android.com/reference/android/widget/FrameLayout.html
plainjimbo

जवाबों:


42

मैं एक FrameLayout के बजाय एक RelativeLayout सुझाता हूँ।

मान लें कि आप 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इसके स्थान का उपयोग करते हैं तो यह संरक्षित होगा।

यदि आप ImageView के शीर्ष पर TextView रखना चाहते हैं तो बस इसे छोड़ दें 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>

मुझे आशा है कि यह वही है जो आप ढूंढ रहे थे।


आपकी व्याख्या बहुत अच्छी लगती है और इसे मेरे मामले में काम करना चाहिए, लेकिन ऐसा नहीं है। मेरे RelativeLayout में मैंने जितना कहा है, उससे अधिक है: 2 कस्टम दृश्य, एक LinearLayout, एक बटन और एक पाठ दृश्य। क्या उत्सुक है कि सब कुछ काम करता है मेरे कस्टम दृश्य exept। अन्य कस्टम दृश्य इसे fill_parent विशेषताओं के रूप में प्रभावित नहीं करता है। लेकिन, मैं यह देखने की कोशिश कर रहा हूं कि कहीं मैं चूक तो नहीं गया। धन्यवाद।
एलिन

आपके कस्टम दृश्य का उद्देश्य क्या है?
ऑक्टेवियन ए। डामियन

मैंने प्रश्न पर कस्टम दृश्य का पूरा कोड जोड़ा है। मूल रूप से पृष्ठभूमि के रूप में एक बड़ी छवि और एक्स, वाई स्थिति पर एक छोटी सी तस्वीर है।
अल्विन

यदि आप अपने ImageView के लिए एक src निर्दिष्ट करते हैं तो यह केवल अपेक्षा के अनुसार काम करता है। यदि आप एक ImageView के नीचे पाठ (या बटन या जो कुछ भी) डालने की कोशिश कर रहे हैं, जो बाद में आबाद हो जाएगा तो आप कुछ परेशानी में चलेंगे क्योंकि आप अपने बटन का आकार या जो भी हो जब तक onResume नहीं कर पाएंगे ( ) पूरा कर दिया है।

4
आप जहाँ भी संभव हो RelativeLayouts से बचना चाहते हैं। प्रत्येक RelativeLayout को 2 माप पास की आवश्यकता होती है - इसलिए नेस्टेड RelativeLayouts का घातीय माप समय होता है। हर बार जब आप एक नया नेस्टेड रिलेटिवआउट जोड़ते हैं, तो आपका माप समय दोगुना हो जाता है।
मार्टिन कोन्सेनी

387

हम बच्चे के दृश्य को FrameLayoutसेट करके केंद्र के दृश्य को संरेखित कर सकते layout_gravityहैं।

XML में:

android:layout_gravity="center"

जावा कोड में:

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

नोट: FrameLayout.LayoutParamsअन्य मौजूदा लेआउटप्राम्स का उपयोग न करें


108
यह स्वीकृत उत्तर होना चाहिए। दूसरा व्यक्ति उत्तर देने के बजाय प्रश्न को बदल देता है।
मुज

Y इस समाधान ने मेरे लिए काम नहीं किया। फ़्रेम लेआउट के केंद्र में इमेजिंग। शीर्षक = नया ImageView (CameraActivity.isis); LayoutPamsams params2 = नया लेआउटपराम (LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); params2.gravity = Gravity.CENTER; cap.setLayoutParams (params2); cameraView.addView (टोपी);
आकांक्षा राठौर

8
अब इसके लिए मेरे लिए काम किया। मेरी गलती थी कि मैं गलत पैकेज आयात किया गया था। 4 घंटे के बाद मुझे मेरी गलती मिली कि वास्तविक पैकेज का आयात होना चाहिए android.widget.FrameLayout.LayoutParams;
आकांक्षा राठौर

2
@ आकांक्षा जो केवल सही उत्तर है :) आप लोग फ्रेमलेआउट में एक दृश्य को केन्द्रित करने के लिए फ्रेमलैटआउट का उपयोग करें।
hrules6872

5

बस इस आदेश का पालन करें

आप किसी भी संख्या में बच्चे को केंद्र में रख सकते हैं FrameLayout

<FrameLayout
    >
    <child1
        ....
        android:layout_gravity="center"
        .....
        />
    <Child2
        ....
        android:layout_gravity="center"
        />
</FrameLayout>

तो कुंजी है

android:layout_gravity="center"बच्चे के विचारों में जोड़ना ।

उदाहरण के लिए:

मैं एक केंद्रित 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>

परिणाम:

यहां छवि विवरण दर्ज करें


1
यह एकमात्र उत्तर था जिसने मेरे लिए काम किया। मेरे पास एक FrameLayoutहै जिसमें एक TextureViewऔर दो हैं SurfaceView। इसके साथ (और setZOrderOnTop(true);सतहों पर मैं आखिरकार ओवरलेइंग
Xavi

1

विजेट के लेआउट_ग्रेविटी विशेषता के 'सेंटर_होर्टल' और 'सेंटर_वर्टिकल' या सिर्फ 'सेंटर' सेट करें

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

0

Framelayout में दृश्य देखने के लिए, कुछ उपलब्ध ट्रिक्स हैं। मैंने अपने वेबव्यू और प्रोग्रेसबार (आपके दो ऑब्जेक्ट लेआउट के समान) के लिए सबसे सरल उपयोग किया, मैंने अभी जोड़ा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>

यहाँ मेरा आउटपुट है

स्क्रीनशॉट

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.