অ্যান্ড্রয়েড: লিনিয়ারলআউটে সীমানা কীভাবে আঁকবেন


197

আমার কাছে তিনটি ফাইল আছে। এক্সএমএল, ড্র অনুষ্ঠান এবং প্রধান ক্রিয়াকলাপ। LinearLayoutআমার এক্সএমএল ফাইলটিতে আমার কিছু রয়েছে।

<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, তবে কীভাবে আমি কেন্দ্রের স্থানাঙ্কগুলি বের করতে পারি?

উত্তর:


458

আপনার কি সত্যিই প্রোগ্রামিকভাবে এটি করা দরকার?

কেবল শিরোনাম বিবেচনা করে: আপনি অ্যান্ড্রয়েড হিসাবে একটি শেপড্রেবল ব্যবহার করতে পারেন: পটভূমি…

উদাহরণস্বরূপ, আসুন এই 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>

এবং অ্যান্ড্রয়েড সংজ্ঞায়িত করুন: ব্যাকগ্রাউন্ড = "@ অঙ্কনযোগ্য / আমার_কাস্টম_ব্যাকগ্রাউন্ড"।

আমি পরীক্ষা করিনি তবে এটি কাজ করা উচিত।

হালনাগাদ:

আমি মনে করি যে এটি যদি আপনার প্রয়োজনের সাথে খাপ খায় তবে এক্সএমএল আকারের অঙ্কনযোগ্য রিসোর্স পাওয়ারটি উত্তোলন করা ভাল। একটি "স্ক্র্যাচ" প্রকল্পের সাথে (অ্যান্ড্রয়েড -8 এর জন্য), রেজ / লেআউট / মেইন.এমএমএল সংজ্ঞায়িত করুন

<?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:paddingলাইনারলআউটটি android:widthআকার / স্ট্রোকের মানের সাথে সম্পর্কিত করতে হবে। দয়া করে @android:color/whiteআপনার চূড়ান্ত অ্যাপ্লিকেশনটিতে ব্যবহার করবেন না বরং একটি প্রকল্পের সংজ্ঞায়িত রঙ।

android:background="@drawable/border" android:padding="10dip"আপনার সরবরাহিত নমুনা থেকে আপনি প্রতিটি লিনিয়ারলআউটটিতে আবেদন করতে পারেন ।

লিনিয়ারলআউটের ব্যাকগ্রাউন্ড হিসাবে কিছু চেনাশোনা প্রদর্শন সম্পর্কিত আপনার অন্যান্য পোস্টগুলির বিষয়ে, আমি লিনিয়ারলআউটের পটভূমিতে নিখুঁত চেনাশোনা প্রদর্শনের জন্য কাজ করার জন্য কিছু পেতে ইনসেট / স্কেল / লেয়ার অঙ্কনযোগ্য সংস্থানগুলি ( আরও তথ্যের জন্য অঙ্কনযোগ্য সংস্থানগুলি দেখুন ) এর সাথে খেলছি তবে ব্যর্থ হয়েছে এখন…

আপনার সমস্যা স্পষ্টভাবে ব্যবহারের মধ্যে থাকে getBorder.set{Width,Height}(100);। অনক্লিক পদ্ধতিতে আপনি কেন এটি করেন?

বিষয়টি মিস করতে আমার আরও তথ্যের প্রয়োজন: আপনি প্রোগ্রামিকভাবে কেন এটি করেন? আপনার কি গতিশীল আচরণ দরকার? আপনার ইনপুট অঙ্কনযোগ্য png হয় বা ShapeDrawable গ্রহণযোগ্য? প্রভৃতি

চালিয়ে যাওয়া (সম্ভবত আগামীকাল এবং যত তাড়াতাড়ি আপনি কী অর্জন করতে চান তার উপর আরও যথার্থতা সরবরাহ করার সাথে সাথে)…



@ রেনাউদ কি সমস্যাযুক্তভাবে সীমান্তের রঙ পরিবর্তন করার কোন উপায় আছে?
ব্যবহারকারী 1940676

12
কেন এটি ঘটেছে তা নিশ্চিত নয়, তবে আমি যখন এটি ব্যবহার LinearLayoutকরতাম তখন সীমান্তের রঙটি থেকে আমি পূর্ণ পূরণ করি, যদি না আমি নীচের শিশুটিকে shapeউপাদানটিতে যুক্ত করি:<solid android:color="@android:color/transparent" />
দাহভিদ

2
আমার জন্য এটি একই ছিল আমাকে একটি যুক্ত করতে হয়েছিল, <solid android:color="@color/lighter_gray" />অন্যথায় আমি একটি কালো পটভূমি পেয়েছি
প্যানসিজ

1
এই পদ্ধতিটি পুরোপুরি কার্যকর হয়; তবে এটি দুটি স্তর "ওভারড্র" তৈরি করে যা কার্য সম্পাদনের জন্য সত্যই খারাপ, এমনকি যদি আপনি ব্যাকগ্রাউন্ডটিকে "নাল" বা "স্বচ্ছ" হিসাবে সেট করেন। এই সমস্যা সমাধানের জন্য কেউ কি কোনও উপায় প্রস্তাব করতে পারেন?
স্যাম রামজানলি

16

লিনিয়ারলআউট / রিলেটিভলআউট প্রসারিত করুন এবং এটি সরাসরি এক্সএমএলে ব্যবহার করুন

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০ বার বলা হয়) খারাপ কর্মক্ষমতা, ব্যাটারি ড্রেন ইত্যাদির দিকে নিয়ে যায়
লুই সিএডি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.