Android: LinearLayout में बॉर्डर कैसे बनाएं


197

मेरे पास तीन फाइलें हैं। एक्सएमएल, ड्रा फ़ंक्शन और मुख्य गतिविधि। LinearLayoutमेरी XML फ़ाइल में कुछ है।

<LinearLayout android:orientation="horizontal"
              android:layout_width="fill_parent"
              android:layout_height="fill_parent"
              android:layout_weight="1">
    <LinearLayout android:layout_width="fill_parent"
                  android:layout_height="fill_parent"
                  android:layout_weight="1"
                  android:background="#ef3"
                  android:id="@+id/img01"/>
    <LinearLayout android:layout_width="fill_parent"
                  android:layout_height="fill_parent"
                  android:layout_weight="1"
                  android:background="#E8A2B4"
                  android:id="@+id/img02"/>
</LinearLayout>

यह ड्रा समारोह है:

public class getBorder extends TextView {
    public getBorder(Context context) {
        super(context);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        Paint paint = new Paint();

        paint.setColor(android.graphics.Color.RED);

        canvas.drawLine(0, 0, this.getWidth() - 1, 0, paint);
        canvas.drawLine(0, 0, 0, this.getHeight() - 1, paint);
        canvas.drawLine(this.getWidth() - 1, 0, this.getWidth() - 1,
            this.getHeight() - 1, paint);
        canvas.drawLine(0, this.getHeight() - 1, this.getWidth() - 1,
            this.getHeight() - 1, paint);
    }
}

और यह मुख्य गतिविधि है:

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    final getBorder getBorder = new getBorder(this);
    final LinearLayout img01 = (LinearLayout) findViewById(R.id.img01);
    img01.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            getBorder.setWidth(100);
            getBorder.setHeight(100);
            img01.addView(getBorder);
        }
    });       
}

कार्यक्रम सीमा खींच सकता है, लेकिन आकार फिट नहीं था LinearLayout। और जब मैं LinearLayoutफिर से क्लिक करता हूं , तो प्रोग्राम क्रैश हो जाता है।

एक और बात, मैं चाहता हूं कि केंद्र के दो सर्कल बनाएं LinearLayout, लेकिन मैं केंद्र के निर्देशांक का पता कैसे लगा सकता हूं?

जवाबों:


459

क्या आपको वास्तव में उस प्रोग्राम को करने की आवश्यकता है?

बस शीर्षक पर विचार: आप Android के रूप में एक आकार का उपयोग कर सकते हैं: पृष्ठभूमि ...

उदाहरण के लिए, के res/drawable/my_custom_background.xmlरूप में परिभाषित करते हैं:

<shape xmlns:android="http://schemas.android.com/apk/res/android"
       android:shape="rectangle">
  <corners
      android:radius="2dp"
      android:topRightRadius="0dp"
      android:bottomRightRadius="0dp"
      android:bottomLeftRadius="0dp" />
  <stroke
      android:width="1dp"
      android:color="@android:color/white" />
</shape>

और एंड्रॉइड को परिभाषित करें: पृष्ठभूमि = "@ drawable / my_custom_background"।

मैंने परीक्षण नहीं किया है, लेकिन यह काम करना चाहिए।

अपडेट करें:

मुझे लगता है कि अगर आपकी ज़रूरतों पर खरा उतरता है तो xml शेप की ड्रॉबल रिसोर्स पावर का फायदा उठाना बेहतर है। "स्क्रैच" प्रोजेक्ट से (एंड्रॉइड -8 के लिए), रेस / लेआउट / main.xml को परिभाषित करें

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@drawable/border"
    android:padding="10dip" >
    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Hello World, SOnich"
        />
    [... more TextView ...]
    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Hello World, SOnich"
        />
</LinearLayout>

और एक res/drawable/border.xml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
       android:shape="rectangle">
   <stroke
        android:width="5dip"
        android:color="@android:color/white" />
</shape>

जिंजरब्रेड डिवाइस पर काम करने की सूचना दी। ध्यान दें कि आपको android:paddingLinearLayout को android:widthआकार / स्ट्रोक के मूल्य से संबंधित करना होगा । कृपया, @android:color/whiteअपने अंतिम आवेदन में उपयोग न करें, बल्कि एक परियोजना परिभाषित रंग।

आप android:background="@drawable/border" android:padding="10dip"अपने दिए गए नमूने में से प्रत्येक LinearLayout पर लागू कर सकते हैं ।

LinearLayout की पृष्ठभूमि के रूप में कुछ मंडलियों को प्रदर्शित करने से संबंधित आपकी अन्य पोस्ट के लिए, मैं एक LinLLout की पृष्ठभूमि में सही मंडलियों को प्रदर्शित करने के लिए कुछ काम पाने के लिए इनसेट / स्केल / लेयर ड्रॉबल रिसोर्स ( आगे की जानकारी के लिए ड्रा करने योग्य संसाधन) के साथ खेल रहा हूं लेकिन असफल रहा इस समय…

के उपयोग में आपकी समस्या स्पष्ट रूप से रहती है getBorder.set{Width,Height}(100);। तुम ऐसा क्यों करते हैं एक onClick विधि में?

इस बिंदु को याद न करने के लिए मुझे और जानकारी की आवश्यकता है: आप उस प्रोग्राम को क्यों करते हैं? क्या आपको एक गतिशील व्यवहार की आवश्यकता है? आपका इनपुट ड्रॉइंग पीएनजी है या शेपड्रावेबल स्वीकार्य है? आदि।

जारी रखने के लिए (हो सकता है कि कल और जैसे ही आप जो कुछ हासिल करना चाहते हैं, उस पर और अधिक उपलब्धियाँ प्रदान करें ...)



@ रेनॉड बॉर्डर का रंग समस्यात्मक रूप से बदलने का एक तरीका है?
user1940676

12
निश्चित नहीं है कि यह मामला क्यों था, लेकिन जब मैंने इस पर प्रयोग किया तो मुझे LinearLayoutसीमा के रंग से एक ठोस भरण मिला, जब तक कि मैंने निम्नलिखित बच्चे को shapeतत्व में नहीं जोड़ा :<solid android:color="@android:color/transparent" />
dahvyd

2
मेरे लिए यह वही था जिसे मुझे जोड़ना था, <solid android:color="@color/lighter_gray" />अन्यथा मुझे एक काले रंग की पृष्ठभूमि मिल गई
Panciz

1
यह विधि पूरी तरह से काम करती है; हालाँकि, यह दो परत "ओवरट्रैक" बनाता है, जो प्रदर्शन के लिए वास्तव में खराब है, भले ही आप पृष्ठभूमि को "अशक्त" या "पारदर्शी" पर सेट करें। क्या कोई इस समस्या को ठीक करने का तरीका सुझा सकता है?
सैम रमज़ानली

16

LinearLayout / RelativeLayout बढ़ाएं और इसे सीधे XML पर उपयोग करें

package com.pkg_name ;
...imports...
public class LinearLayoutOutlined extends LinearLayout {
    Paint paint;    

    public LinearLayoutOutlined(Context context) {
        super(context);
        // TODO Auto-generated constructor stub
        setWillNotDraw(false) ;
        paint = new Paint();
    }
    public LinearLayoutOutlined(Context context, AttributeSet attrs) {
        super(context, attrs);
        // TODO Auto-generated constructor stub
        setWillNotDraw(false) ;
        paint = new Paint();
    }
    @Override
    protected void onDraw(Canvas canvas) {
        /*
        Paint fillPaint = paint;
        fillPaint.setARGB(255, 0, 255, 0);
        fillPaint.setStyle(Paint.Style.FILL);
        canvas.drawPaint(fillPaint) ;
        */

        Paint strokePaint = paint;
        strokePaint.setARGB(255, 255, 0, 0);
        strokePaint.setStyle(Paint.Style.STROKE);
        strokePaint.setStrokeWidth(2);  
        Rect r = canvas.getClipBounds() ;
        Rect outline = new Rect( 1,1,r.right-1, r.bottom-1) ;
        canvas.drawRect(outline, strokePaint) ;
    }

}

<?xml version="1.0" encoding="utf-8"?>

<com.pkg_name.LinearLayoutOutlined
   xmlns:android="http://schemas.android.com/apk/res/android"
   android:orientation="vertical"
    android:layout_width=...
    android:layout_height=...
   >
   ... your widgets here ...

</com.pkg_name.LinearLayoutOutlined>

34
कृपया, onDraw()विधि में मेमोरी आवंटित न करें, अपनी वस्तुओं को एक init()विधि में बनाएं , जिसे निर्माता द्वारा कहा जाता है और उन्हें onDraw()विधि में पुन: उपयोग करें । में आवंटन onDraw()प्रति सेकंड (60 बार कहा जाता है) खराब प्रदर्शन, बैटरी, आदि के लिए होता है
लुइस सीएडी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.