একটি দৃশ্যের পরম অবস্থান সেট করুন


180

অ্যান্ড্রয়েডে কোনও দৃশ্যের পরম অবস্থান নির্ধারণ করা কি সম্ভব? (আমি জানি যে একটি আছেAbsoluteLayout , তবে এটি অবমানিত ...)

উদাহরণস্বরূপ, যদি আমার একটি 240x320px স্ক্রিন থাকে তবে আমি কীভাবে এমন একটি সংযুক্ত করতে পারি ImageViewযা 20x20px এর কেন্দ্র অবস্থানে রয়েছে (100,100)?


3
এছাড়াও দেখুন view.setTranslationX()বাview.offsetLeftAndRight()
ড্রু লেসইউর

আমি সবেমাত্র একটি লাইব্রেরি প্রকাশ করেছি যা এখানে আগ্রহী হতে পারে। github.com/ManuelPeinado/ ImageLayout
ম্যানুয়েল

1
এটি এতই কঠিন কারণ 99.9% সময়ের পরম অবস্থানের অ্যান্ড্রয়েড সম্পর্কে একটি খারাপ ধারণা is আপনি যদি এমন অ্যাপ্লিকেশন লিখছেন যা কেবল কোনও দৈহিক ডিভাইসে চালিত হয় তবে এটি কার্যকর হতে পারে তবে এটি সাধারণত নিরাপদ অনুমান নয়। উদাহরণস্বরূপ, গুগল প্লেতে এটি আপলোড করবেন না। এটি আইওএসে দুর্দান্ত কাজ করে কারণ এখানে কেবলমাত্র কয়েকটি মুষ্টিমেয় হার্ডওয়্যার ডিভাইস রয়েছে এবং আপনি প্রতিটিটির জন্য একটি কাস্টম স্টোরিবোর্ড তৈরি করতে পারেন।
21

2
@ অ্যাথথার্ড, আমার ক্রস-প্ল্যাটফর্ম অ্যাপে আমি পর্দার আকার এবং তার উপর ভিত্তি করে সমস্ত কিছু পাই। আমি কেবল "অপ্রচলিত" অ্যাবসুলিউট লায়আউটে স্যুইচ করেছি, এবং এটি দুর্দান্ত কাজ করে।
উইলিয়াম জকুশ

যথেষ্ট পরিমাণে মোটামুটি, তবে এটি আপনার জন্য স্বয়ংক্রিয়ভাবে কোনও সম্পর্কিত লেআউট বা লিনিয়ারলআউট করবে।
এডিথার্ড

উত্তর:


270

আপনি রিলেটিভলআউট ব্যবহার করতে পারেন। ধরা যাক আপনি আপনার লেআউটের ভিতরে অবস্থানে একটি 30x40 ইমেজভিউ চেয়েছিলেন (50,60)। আপনার কার্যকলাপের কোথাও:

// Some existing RelativeLayout from your layout xml
RelativeLayout rl = (RelativeLayout) findViewById(R.id.my_relative_layout);

ImageView iv = new ImageView(this);

RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(30, 40);
params.leftMargin = 50;
params.topMargin = 60;
rl.addView(iv, params);

আরও উদাহরণ:

যথাক্রমে (50,60) এবং (80,90) এ দুটি 30x40 চিত্রদর্শন (একটি হলুদ, একটি লাল) স্থান:

RelativeLayout rl = (RelativeLayout) findViewById(R.id.my_relative_layout);
ImageView iv;
RelativeLayout.LayoutParams params;

iv = new ImageView(this);
iv.setBackgroundColor(Color.YELLOW);
params = new RelativeLayout.LayoutParams(30, 40);
params.leftMargin = 50;
params.topMargin = 60;
rl.addView(iv, params);

iv = new ImageView(this);
iv.setBackgroundColor(Color.RED);
params = new RelativeLayout.LayoutParams(30, 40);
params.leftMargin = 80;
params.topMargin = 90;
rl.addView(iv, params);

স্থান (50,60) এ এক 30x40 হলুদ ImageView এবং অন্য 30x40 লাল ImageView <80,90> আপেক্ষিক হলুদ ImageView:

RelativeLayout rl = (RelativeLayout) findViewById(R.id.my_relative_layout);
ImageView iv;
RelativeLayout.LayoutParams params;

int yellow_iv_id = 123; // Some arbitrary ID value.

iv = new ImageView(this);
iv.setId(yellow_iv_id);
iv.setBackgroundColor(Color.YELLOW);
params = new RelativeLayout.LayoutParams(30, 40);
params.leftMargin = 50;
params.topMargin = 60;
rl.addView(iv, params);

iv = new ImageView(this);
iv.setBackgroundColor(Color.RED);
params = new RelativeLayout.LayoutParams(30, 40);
params.leftMargin = 80;
params.topMargin = 90;

// This line defines how params.leftMargin and params.topMargin are interpreted.
// In this case, "<80,90>" means <80,90> to the right of the yellow ImageView.
params.addRule(RelativeLayout.RIGHT_OF, yellow_iv_id);

rl.addView(iv, params);

1
আমি আজ রাতে যেতে পারি, এটি একটি দুর্দান্ত ধারণা, কেন আমি সে সম্পর্কে ভাবিনি তা জানেন না। যেহেতু আমার কাছে বেশ কয়েকটি ImageViewরাখার দরকার আছে তাই এটি ব্যবহার করা ভাল না FrameLayout?
সেফি

প্রকৃতপক্ষে এটি কাজ করে বলে মনে হয়, তবে এটি কেবল তখনই কাজ করছে যখন কোনও ছবি এইভাবে যুক্ত করে। যদি আমি ২ য় একটি যুক্ত করার চেষ্টা করি তবে প্রথমটি কেবল
নিখোঁজ

1
দুটি চিত্র একে অপরের শীর্ষে রয়েছে। আমি উপরের সমাধানে আমার কিছু কোড যুক্ত করব explain
অ্যান্ডি ঝাং

2
হ্যাঁ, আমি গতকালও খুঁজে পেয়েছি নিজের সমাধান নিজেই খনন করে। আমি ফ্রেম-লেআউট দিয়ে স্টাফও চেষ্টা করি। আমার আসল সমস্যাটি হ'ল আমার কাছে প্রতিটি এলোমেলো (x, y) পজিশন সহ 5 টি চিত্র রয়েছে, তাই আমি রিলেটিভলআউট.আরআইআইইটি বা এর মতো কিছু ব্যবহার করতে পারি না। আশ্চর্যের বিষয় হ'ল আমি 3 টি চিত্র সঠিকভাবে স্থাপন করতে পারি তবে তার মধ্যে 2 টি কাজ করছে না ... আমি বুঝতে পারি না ... আমি আজ রাতে কিছু স্ক্রিনশট এবং কিছু কোড দিয়ে আমার পোস্টটি আপডেট করব।
সেফি

9
এই পদ্ধতিটি ব্যবহার করা অ্যাবসুলিউটলয়আউট ব্যবহারের চেয়ে আরও ভাল কী হবে? কেবলমাত্র AbsoluteLayout অবমূল্যায়ন করা হয়েছে?
নাথান

66

সাধারণভাবে, আপনি বামমার্গিন এবং টপমার্জিন বৈশিষ্ট্যগুলি নির্দিষ্ট করে কনটেন্ট হিসাবে ফ্রেমলাউট ব্যবহার করে একটি নির্দিষ্ট অবস্থানে একটি ভিউ যুক্ত করতে পারেন

নিম্নলিখিত উদাহরণটি পূর্ণ স্ক্রিন ধারক হিসাবে ফ্রেমলাউট ব্যবহার করে পজিশনে (100,200) একটি 20x20px চিত্রদর্শন রাখবে:

এক্সএমএল

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/root"
    android:background="#33AAFF"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >
</FrameLayout>

ক্রিয়াকলাপ / খণ্ড / কাস্টম দর্শন

//...
FrameLayout root = (FrameLayout)findViewById(R.id.root);
ImageView img = new ImageView(this);
img.setBackgroundColor(Color.RED);
//..load something inside the ImageView, we just set the background color

FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(20, 20);
params.leftMargin = 100;
params.topMargin  = 200;
root.addView(img, params);
//...

এটি কৌশলটি করবে কারণ মার্জিনগুলি আপেক্ষিক লেআউট ছাড়াই পরম (এক্স, ওয়াই) স্থানাঙ্ক হিসাবে ব্যবহৃত হতে পারে:

এখানে চিত্র বর্ণনা লিখুন


2
উজ্জ্বল! মূল্য 500! +1
লিসা আন

16

উপরের অ্যান্ডি জাংয়ের উত্তরে কেবল যুক্ত করতে, আপনি যদি চান, আপনি rl.addView এ পরম দিতে পারেন, তারপরে এটি পরে পরিবর্তন করুন, তাই:

params = new RelativeLayout.LayoutParams(30, 40);
params.leftMargin = 50;
params.topMargin = 60;
rl.addView(iv, params);

সমানভাবে ভাল লেখা যেতে পারে:

params = new RelativeLayout.LayoutParams(30, 40);
rl.addView(iv, params);
params.leftMargin = 50;
params.topMargin = 60;

সুতরাং আপনি যদি প্যারামগুলি পরিবর্তনশীল বজায় রাখেন তবে আপনি iv এর লেআউটটি আরএল যুক্ত করার পরে যেকোন সময় পরিবর্তন করতে পারেন।


এই নমুনা পছন্দ। তুমি কি আমাকে পরামর্শ দিতে পারেন কিভাবে আমি পারি এক্স সেট, y অক্ষের যখন আমি XML বিন্যাস চিত্র হচ্ছে (ঝ চিত্রের মাপ পরিবর্তন করতে চেষ্টা করছি এবং আমার কিছু অবস্থানে ইমেজ সেট করতে হবে)।
G_S

আমি ভয় করি আপনি যা জিজ্ঞাসা করছেন তা আমি যথেষ্ট বুঝতে পারি না don't আপনি কি এক্সএমএল লেআউটটি ব্যবহার করে অবস্থিত কোনও বস্তুর সাথে যুক্ত লেআউটপ্যারামস অবজেক্টটি অ্যাক্সেস করার চেষ্টা করছেন? আমি নিশ্চিত না যে এটি কীভাবে হয়েছে। উত্তরটি অন্য কোথাও খুঁজে না পেলে এটির উত্তর দেওয়ার জন্য এটি একটি নতুন প্রশ্ন সেট আপ করার উপযুক্ত।
উদ্বিগ্ন

দয়া করে এই প্রশ্নের কটাক্ষপাত আছে stackoverflow.com/questions/12028404/...
G_S

5

কোডটিতে কোনও পিক্সেল মানকে হার্ডকডিং ছাড়াই আরও পরিচ্ছন্ন এবং গতিশীল উপায়।

আমি ক্লিক করা বোতামের ঠিক নীচে একটি ডায়ালগ (যা আমি উড়ানের উপরে ফুলে তুলি) রাখতে চাইছিলাম।

এবং এটি এইভাবে সমাধান করুন:

    // get the yoffset of the position where your View has to be placed 
    final int yoffset = < calculate the position of the view >

    // position using top margin
    if(myView.getLayoutParams() instanceof MarginLayoutParams) {
        ((MarginLayoutParams) myView.getLayoutParams()).topMargin = yOffset;
    }

তবে আপনাকে নিশ্চিত করতে হবে যে প্যারেন্ট লেআউটটি এর myViewউদাহরণ RelativeLayout

আরও সম্পূর্ণ কোড:

    // identify the button
    final Button clickedButton = <... code to find the button here ...>

    // inflate the dialog - the following style preserves xml layout params
    final View floatingDialog = 
        this.getLayoutInflater().inflate(R.layout.floating_dialog,
            this.floatingDialogContainer, false);

    this.floatingDialogContainer.addView(floatingDialog);

    // get the buttons position
    final int[] buttonPos = new int[2];
    clickedButton.getLocationOnScreen(buttonPos);        
    final int yOffset =  buttonPos[1] + clickedButton.getHeight();

    // position using top margin
    if(floatingDialog.getLayoutParams() instanceof MarginLayoutParams) {
        ((MarginLayoutParams) floatingDialog.getLayoutParams()).topMargin = yOffset;
    }

আপনার জাভা কোডটিতে those পিক্সেল / ডিপিএসের হার্ডকোডিংয়ের পরিবর্তে আপনি লক্ষ্য ভিউটি লেআউট এক্সএমএল ফাইলগুলি ব্যবহার করে নির্ধারিত কোনও লেআউট প্যারামিটারের সাথে সামঞ্জস্য করতে আশা করতে পারেন।


1

স্ক্রিনশট চেক করুন

আপনার ইচ্ছার এক্সওয়াই পয়েন্টে কোনও দৃশ্য রাখুন

বিন্যাস ফাইল

<RelativeLayout 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="com.example.test.MainActivity" >

    <AbsoluteLayout
        android:id="@+id/absolute"
        android:layout_width="match_parent"
        android:layout_height="match_parent" >

        <RelativeLayout
            android:id="@+id/rlParent"
            android:layout_width="match_parent"
            android:layout_height="match_parent" >

            <ImageView
                android:id="@+id/img"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:background="@drawable/btn_blue_matte" />
        </RelativeLayout>
    </AbsoluteLayout>

</RelativeLayout>

জাভা ক্লাস

public class MainActivity extends Activity {

    private RelativeLayout rlParent;
    private int width = 100, height = 150, x = 20, y= 50; 

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        AbsoluteLayout.LayoutParams param = new AbsoluteLayout.LayoutParams(width, height, x, y);
        rlParent = (RelativeLayout)findViewById(R.id.rlParent);
        rlParent.setLayoutParams(param);
    }
}

সম্পন্ন


0

এটি যদি কাউকে সাহায্য করতে পারে তবে আপনি এই অ্যানিম্যাটর ভিউপ্রোপার্টি অ্যানিম্যাটরটিও নীচে দেখতে পারেন

myView.animate().x(50f).y(100f);

myView.animate().translateX(pixelInScreen) 

দ্রষ্টব্য: এই পিক্সেলটি দেখার সাথে তুলনামূলক নয়। এই পিক্সেলটি পর্দার পিক্সেল অবস্থান।

ক্রেডিট বি পি 10 উত্তর


-1

নির্দিষ্ট স্থানে ভিউ সেট করার জন্য কোডের নীচে চেষ্টা করুন: -

            TextView textView = new TextView(getActivity());
            textView.setId(R.id.overflowCount);
            textView.setText(count + "");
            textView.setGravity(Gravity.CENTER);
            textView.setTextSize(TypedValue.COMPLEX_UNIT_SP, 12);
            textView.setTextColor(getActivity().getResources().getColor(R.color.white));
            textView.setOnClickListener(new OnClickListener() {
                @Override
                public void onClick(View v) {
                    // to handle click 
                }
            });
            // set background 
            textView.setBackgroundResource(R.drawable.overflow_menu_badge_bg);

            // set apear

            textView.animate()
                    .scaleXBy(.15f)
                    .scaleYBy(.15f)
                    .setDuration(700)
                    .alpha(1)
                    .setInterpolator(new BounceInterpolator()).start();
            FrameLayout.LayoutParams layoutParams = new FrameLayout.LayoutParams(
                    FrameLayout.LayoutParams.WRAP_CONTENT,
                    FrameLayout.LayoutParams.WRAP_CONTENT);
            layoutParams.topMargin = 100; // margin in pixels, not dps
            layoutParams.leftMargin = 100; // margin in pixels, not dps
            textView.setLayoutParams(layoutParams);

            // add into my parent view
            mainFrameLaout.addView(textView);

-1

আমার কোড Xamarin , আমি ব্যবহার করছি FrameLayout এই কাজের জন্য এবং নিম্নলিখিত আমার কোড হল:

               List<object> content = new List<object>();

        object aWebView = new {ContentType="web",Width="300", Height = "300",X="10",Y="30",ContentUrl="http://www.google.com" };
        content.Add(aWebView);
        object aWebView2 = new { ContentType = "image", Width = "300", Height = "300", X = "20", Y = "40", ContentUrl = "https://www.nasa.gov/sites/default/files/styles/image_card_4x3_ratio/public/thumbnails/image/leisa_christmas_false_color.png?itok=Jxf0IlS4" };
        content.Add(aWebView2);
        FrameLayout myLayout = (FrameLayout)FindViewById(Resource.Id.frameLayout1);
        foreach (object item in content)
        {

            string contentType = item.GetType().GetProperty("ContentType").GetValue(item, null).ToString();
            FrameLayout.LayoutParams param = new FrameLayout.LayoutParams(Convert.ToInt32(item.GetType().GetProperty("Width").GetValue(item, null).ToString()), Convert.ToInt32(item.GetType().GetProperty("Height").GetValue(item, null).ToString()));
            param.LeftMargin = Convert.ToInt32(item.GetType().GetProperty("X").GetValue(item, null).ToString());
            param.TopMargin = Convert.ToInt32(item.GetType().GetProperty("Y").GetValue(item, null).ToString());

            switch (contentType) {
                case "web":{
                        WebView webview = new WebView(this);

                        //webview.hei;
                        myLayout.AddView(webview, param);
                        webview.SetWebViewClient(new WebViewClient());
                        webview.LoadUrl(item.GetType().GetProperty("ContentUrl").GetValue(item, null).ToString());

                        break;
                    }
                case "image":
                    {
                        ImageView imageview = new ImageView(this);

                        //webview.hei;
                        myLayout.AddView(imageview, param);
                        var imageBitmap =  GetImageBitmapFromUrl("https://www.nasa.gov/sites/default/files/styles/image_card_4x3_ratio/public/thumbnails/image/leisa_christmas_false_color.png?itok=Jxf0IlS4");
                        imageview.SetImageBitmap(imageBitmap);


                        break;
                    }

            }

        }

এটি আমার পক্ষে কার্যকর ছিল কারণ তাদের উপস্থিতির ভিত্তিতে একে অপরকে ওভারল্যাপ করার জন্য আমার দেখার সম্পত্তিটির প্রয়োজন ছিল, যেমন দর্শনগুলি একে অপরের উপরে সজ্জিত হয়

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.