2010-10-29 12 views
53

काम नहीं करता मैं एक FrameLayout जिसमें मैं 2 नियंत्रण है है: - जो उस पर एक छवि और कुछ टेक्स्ट ड्रॉ एक कस्टम दृश्य - एक पाठFrameLayout में एंड्रॉयड केंद्र दृश्य

मैं चाहता हूँ के साथ एक TextView फ्रेमलेआउट में दोनों को केंद्रित करने के लिए, लेकिन मैं इसे करने में सक्षम नहीं हूं। टेक्सव्यू बस ठीक है, जब मैं इसे दृश्यमान करता हूं, तो मेरा क्यूसम दृश्य बाईं तरफ रहता है।

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

मैथियास के लिए, मैं निर्माता में कुछ नहीं करते, यह मैं एक FrameLayout के बजाय एक RelativeLayout सुझाव देंगे सिर्फ सरल

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

आपका कस्टम व्यू कहां से बढ़ाया गया है? निश्चित रूप से आप अपने कन्स्ट्रक्टर में पैरामीटर को संभालने वाले हैं? –

+0

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

+1

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

उत्तर

29

है।

मान लें कि आप 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> 

ध्यान दें कि यदि आप तो अंतरिक्ष gone के एक तत्व के visibility सेट उस तत्व का उपभोग होता है, जबकि जब आप 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> 

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

+0

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

+0

आपके कस्टम व्यू का उद्देश्य क्या है? –

+0

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

260

हम एक्सएमएल में

द्वारा बच्चे को देखने के layout_gravity की स्थापना करके Framelayout के केंद्र में एक दृश्य संरेखित कर सकते हैं:

layout_gravity = "center" 

(या)

जावा में:

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

अपने कोड में।

+74

यह स्वीकार्य उत्तर होना चाहिए। दूसरा जवाब देने के बजाय सवाल बदलता है। – Muz

+0

वाई यह समाधान मेरे लिए काम नहीं किया है। फ्रेम layout.cap = new ImageView (CameraActivity.this) के केंद्र में छविदृश्य जोड़ना; \t \t LayoutParams params2 = नए LayoutParams (LayoutParams.WRAP_CONTENT, \t \t \t \t LayoutParams.WRAP_CONTENT); \t \t params2.gravity = Gravity.CENTER; \t \t cap.setLayout पैराम (पैराम्स 2); \t \t cameraView.addView (टोपी); –

+5

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

संबंधित मुद्दे