আমি কীভাবে অ্যানড্রয়েডে গতিরূপে দৃশ্যের অবস্থান সেট করতে পারি?


102

কোডের মাধ্যমে আমি কীভাবে অবস্থানের অবস্থানটি পরিবর্তন করতে পারি? এর এক্স, ওয়াই অবস্থান পরিবর্তন করার মতো। এটা কি সম্ভব?

উত্তর:


117

হানিকম্বের নীচে যে কোনও জিনিসের জন্য (এপিআই স্তর 11) আপনাকে ব্যবহার করতে হবে setLayoutParams(...)

আপনি মউচাক আপনার সমর্থন সীমিত এবং করতে পারেন আপ আপনি ব্যবহার করতে পারেন setX(...), setY(...), setLeft(...), setTop(...), ইত্যাদি


40
সেটটপ () বিকাশকারী.অ্যান্ড্রয়েড / রেফারেন্স / অ্যান্ড্রয়েড / ভিউ / এর দস্তাবেজগুলি থেকে : sets the top position of this view relative to its parent. This method is meant to be called by the layout system and should not generally be called otherwise, because the property may be changed at any time by the layout.- তাই সম্ভবত এটি ভাল ধারণা নয়;)
কাটজেনহুট

47

হ্যাঁ, আপনি অ্যান্ড্রয়েডে গতিরূপে দর্শনের অবস্থান সেট করতে পারেন। তেমনি আপনার এক্সএমএল ফাইলের একটি অন্তর্ভুক্ত ImageViewরয়েছে LinearLayouto সুতরাং আপনি এর অবস্থানটি মাধ্যমে সেট করতে পারেন B তবে আপনার এক্সএমএল ফাইলটিতে LayoutParamsনেওয়া LayoutParamsলেআউট অনুযায়ী নেওয়া নিশ্চিত করুন taken গৃহীত লেআউট LayoutParamsঅনুসারে আলাদা ।

সেট করার কোডটি এখানে:

    LayoutParams layoutParams=new LayoutParams(int width, int height);
    layoutParams.setMargins(int left, int top, int right, int bottom);
    imageView.setLayoutParams(layoutParams);

আমি আশা করি এটি আপনার অবস্থান নির্ধারণে সহায়ক হবে।


15
এছাড়াও নোট করুন যে আপনাকে অবশ্যই android.widget.LinearLayout.LayoutParams আমদানি করতে হবে; কারণ ডিফল্টটি ভিউগ্রুপের লেআউটপ্যারামগুলি হয়
ডেভিড টি।

এটি Android 8+ এ কাজ করছে বলে মনে হয় না। আপনি কি একই ধরনের সমস্যার মুখোমুখি হয়েছেন?
মাইফ্ল্যাশল্যাব

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

33

ইতিমধ্যে বিভিন্ন বৈধ উত্তর রয়েছে, তবে সংশ্লিষ্ট এপিআই স্তরের নিষেধাজ্ঞাগুলি ব্যতীত কোন ক্ষেত্রে কোন পদ্ধতি (গুলি) ব্যবহার করা উচিত তা সঠিকভাবে কেউ বলেছিল বলে মনে হয় না:

  • যদি আপনি কোনও বিন্যাস চক্রের জন্য অপেক্ষা করতে পারেন এবং পিতামাতার দর্শন গোষ্ঠী সমর্থন করে MarginLayoutParams(বা একটি সাবক্লাস), সে অনুযায়ী marginLeft/ সেট করুন marginTop

  • আপনার যদি অবিলম্বে এবং অবিরামভাবে অবস্থান পরিবর্তন করতে হয় (যেমন একটি পপআপমেনু অ্যাঙ্কারের জন্য), layout(l, t, r, b)একই সাথে একই স্থানাঙ্কগুলির সাথে কল করুন । লেআউট সিস্টেমটি পরে কী তা নিশ্চিত করবে এটি প্রিম্প্ট করে।

  • তাত্ক্ষণিক (অস্থায়ী) পরিবর্তনের জন্য (যেমন অ্যানিমেশন), পরিবর্তে setX()/ setY()ব্যবহার করুন। যে ক্ষেত্রে প্যারেন্টের আকার Wrap_CHILDREN এর উপর নির্ভর করে না, ক্ষেত্রে setX()/ setY()একচেটিয়াভাবে ব্যবহার করা ভাল ।

  • কখনইsetLeft() / setRight()/ setBottom()/ ব্যবহার করবেন নাsetTop() , নীচে দেখুন।

পটভূমি : mLeft/ mTop/ mBottom/ mRightক্ষেত্রগুলি লেআউটে সংশ্লিষ্ট লেআউটপ্যারামগুলি () থেকে পূর্ণ হবে। লেআউটটিকে অ্যান্ড্রয়েড ভিউ লেআউট সিস্টেম দ্বারা নিখুঁতভাবে এবং অ্যাসিঙ্ক্রোনালি বলা হয়। সুতরাং, MarginLayoutParamsস্থায়ীভাবে অবস্থান নির্ধারণের জন্য এটিকে সেট করা নিরাপদ এবং পরিষ্কার উপায় বলে মনে হচ্ছে। তবে অ্যাসিঙ্ক্রোনাস লেআউট ল্যাগ কিছু ক্ষেত্রে সমস্যা হতে পারে, যেমন কার্সার রেন্ডার করার জন্য ভিউ ব্যবহার করার সময় এবং এটি একই সাথে পুনরায় অবস্থান এবং পপআপমেনু অ্যাঙ্কর হিসাবে পরিবেশন করা উচিত। এই ক্ষেত্রে, কলিং layout()আমার পক্ষে ভাল কাজ করেছে।

সঙ্গে সমস্যা setLeft()এবং setTop()আছেন:

  • তাদের একা কল করা যথেষ্ট নয় - আপনারও কল করতে হবে setRight()এবং setBottom()ভিউটি প্রসারিত বা সঙ্কুচিত করা এড়াতে হবে।

  • এই পদ্ধতির প্রয়োগ অপেক্ষাকৃত জটিল দেখায় (= তাদের প্রত্যেকের দ্বারা দেখা আকারের পরিবর্তনের জন্য অ্যাকাউন্টে কিছু কাজ করা)

  • তারা মনে হয় ইনপুট ক্ষেত্রগুলির সাথে অদ্ভুত সমস্যা সৃষ্টি করে: সম্পাদনা পাঠ্য নরম সংখ্যাসূচক কীবোর্ড কখনও কখনও অঙ্কগুলিতে অনুমতি দেয় না

setX()এবং setY()লেআউট সিস্টেমের বাইরে কাজ করে এবং সংশ্লিষ্ট মানগুলি লেআউট সিস্টেম দ্বারা নির্ধারিত বাম / উপরে / নীচে / ডান মানগুলিকে অতিরিক্ত অফসেট হিসাবে বিবেচনা করা হয়, সেই অনুসারে ভিউ স্থানান্তরিত। এনিমেশনগুলির জন্য এগুলি যুক্ত করা হয়েছে বলে মনে হয় (যেখানে কোনও বিন্যাস চক্রের মাধ্যমে না গিয়ে তাত্ক্ষণিক প্রভাব প্রয়োজন)।


হ্যালো স্টিফান আপনি কী এমন কয়েকটি বই বা নিবন্ধের পরামর্শ দিতে পারেন যেখানে আমি বুঝতে পারি যে অ্যান্ড্রয়েড লেআউট সিস্টেমটি কীভাবে কাজ করে। আমি লেআউটের () onMeasure () onDraw () কলগুলির ক্রমটি বুঝতে পারি, তবে এটি আরও বিশদ জানতে চাই। অগ্রিম ধন্যবাদ
সের্গেই ব্রাজনিক

দুর্ভাগ্যক্রমে আমি পারি না - সর্বোত্তম এবং সুনির্দিষ্ট উল্লেখটি
হ'ল

আমি দৃশ্য পরিবর্তন করতে সেটওয়াই ব্যবহার করি, এটি কি পরবর্তী লেআউট চক্রের সাথে পরিবর্তিত হয়, তাত্ক্ষণিকভাবে নয়?
সংকেত দিন

আপনি কিভাবে এই নির্ধারণ করেছেন?
স্টিফান হস্টেইন

এটা তোলে এর মূল্য যে ইশারা marginLeftব্যবহার করে নির্ধারণ করা যাবে setLayoutParamsসঙ্গে একটি new FrameLayout.LayoutParams(width, height)যার উপর আপনার সেটmarginLeft
lucidbrot

18

নাইনওয়েলড্রয়েডস নামে একটি গ্রন্থাগার রয়েছে , যা আপনাকে অ্যানিমেশন লাইব্রেরিটিকে পুরোপুরি এক সংস্করণে ব্যবহার করতে দেয়।

এর অর্থ আপনি কিছুটা ভিন্ন ইন্টারফেসের সাহায্যে বাম, ডান, অনুবাদ এক্স / ওয়াই সংজ্ঞায়িত করতে পারেন।

এটা যেভাবে কাজ করে:

ViewHelper.setTranslationX(view, 50f);

আপনি কেবল ভিউহেল্পার শ্রেণি থেকে স্থিতিশীল পদ্ধতিগুলি ব্যবহার করেন, ভিউটি পাস করুন এবং কোনটিকে আপনি সেট করতে চান তা কোন মানকেই সরিয়ে দিন।


16

আমি ব্যবহার setTranslationXএবং সুপারিশ করব setTranslationY। আমি কেবল এটি নিজেই শুরু করছি, তবে এগুলি দৃশ্যের সরানোর সবচেয়ে নিরাপদ এবং পছন্দের উপায় বলে মনে হচ্ছে। আমার ধারণা, আপনি ঠিক কী করতে চাইছেন তা অনেকটা নির্ভর করে তবে এটি 2 ডি অ্যানিমেশনের জন্য আমার পক্ষে ভালভাবে কাজ করছে।


13

আপনি যদি হানিকম্ব এসডিকে (এপিআই লেভেল 11) ব্যবহার করেন তবে আপনি নিম্নলিখিত পদ্ধতিগুলি ব্যবহার করার চেষ্টা করতে পারেন।

view.setX(float x);

প্যারামিটার এক্স এই দর্শনটির ভিজ্যুয়াল এক্স অবস্থান।

view.setY(float y);

প্যারামিটার y এই দর্শনটির ভিজ্যুয়াল y অবস্থান।

আমি আশা করি এটি আপনার পক্ষে সহায়ক হবে। :)


4
আমি ২.২ ফ্রয়েতে কাজ করছি এবং এই পদ্ধতিগুলি এতে উপলব্ধ নয়।
অরুণ বদোল

7

সমস্ত API স্তরের সমর্থনের জন্য আপনি এটি এ জাতীয়ভাবে ব্যবহার করতে পারেন :

ViewPropertyAnimator.animate(view).translationYBy(-yourY).translationXBy(-yourX).setDuration(0);

কারণ তিনি অবস্থান পরিবর্তন করতে চান এবং উপরের সমাধানটি আরও ভাল এবং অ্যানিমেশনের প্রয়োজন নেই
ফায়ারজেঙ্ক

এছাড়াও, অনুবাদটির কারণে স্ক্রিনটি (আংশিক) অফ স্ক্রিনে যেতে পারে
মেওয়া

4

এর পিতামাতার তুলনায় এই দর্শনটির বাম অবস্থান নির্ধারণ করুন:

view.setLeft(int leftPosition);

এর অভিভাবকের তুলনায় এই দর্শনটির সঠিক অবস্থান নির্ধারণ করুন:

view.setRight(int rightPosition);

এর পিতামাতার তুলনায় এই দর্শনটির শীর্ষ অবস্থানটি নির্ধারণ করুন:

view.setTop(int topPosition);

তার পিতামাতার তুলনায় এই দর্শনটির নীচের অবস্থানটি সেট করুন:

view.setBottom(int bottomPositon);

উপরোক্ত পদ্ধতিগুলি পিতামাতার সাথে সম্পর্কিত অবস্থানটি নির্ধারণ করতে ব্যবহৃত হয়।


দুঃখিত, এই পদ্ধতিগুলি উপলভ্য নয় you আপনি কি আমাকে কোনও কোড প্রেরণ করতে পারেন?
অরুণ বদোল

4
"এই পদ্ধতিটি লেআউট সিস্টেম দ্বারা কল করার জন্য বোঝানো হয় এবং সাধারণত অন্যথায় বলা উচিত নয়, কারণ বিন্যাসের দ্বারা সম্পত্তি যে কোনও সময়ে পরিবর্তিত হতে পারে।"
জিড্যাঞ্জার

4

লেআউটপ্যারাম ব্যবহার করুন। আপনি যদি লিনিয়ারলআউট ব্যবহার করে থাকেন তবে আপনাকে android.widget.LinearLayout.LayoutParams আমদানি করতে হবে, অন্যথায় আপনি যে লেআউটটি ব্যবহার করছেন তার জন্য লেআউটপ্যারামগুলির যথাযথ সংস্করণ আমদানি করতে পারেন, বা এটি ক্লাসকাস্টএক্সসেপশন ঘটায় , তারপরে:

LayoutParams layoutParams = new LayoutParams(int width, int height);
layoutParams.setMargins(int left, int top, int right, int bottom);
imageView.setLayoutParams(layoutParams);

নোট: নোট করুন যে আপনি ইমেজভিউ.সেট লেফট (ইনট ডিমে) ব্যবহার করতে পারেন, তবে এটি উপাদানটির অবস্থান নির্ধারণ করতে পারবেন না, এটি কেবল উপাদানটির বাম সীমান্তের অবস্থান নির্ধারণ করবে, বাকিগুলি একই অবস্থানে থাকবে ।


সুতরাং কীভাবে আমরা আসল দৃশ্যের প্রভাব ছাড়াই দৃশ্যটিকে নির্দিষ্ট অবস্থানে নিয়ে যেতে পারি?
জেমস

আমি নিশ্চিত না যে আমি আপনার সমস্যাটি বুঝতে পেরেছি কারণ আপনি যদি কোনও মতামত সরিয়ে নিতে চান তবে আপনি এটি সরিয়ে নিয়ে যাচ্ছেন তা পরিবর্তন করে ফেলবে। যাইহোক, আপনি যদি অন্যের থেকে এটির থেকে স্বাধীনভাবে কোনও দৃশ্য সরিয়ে নিতে চান তবে আপনার মূল বিন্যাসটি ব্লাউউআউট ভিউয়ের প্রয়োজন হতে পারে এর অভ্যন্তরে আপনি নিজের স্বাধীন দৃষ্টিভঙ্গি স্থাপন করতে পারেন (আপনি যদি এটি আপনার মূল দর্শনের অধীনে যেতে চান তবে অবশ্যই আপনি আপনার মূল ছবির আগে
ফ্রেম-লেআউটটি স্থাপন

3

এতে RelativeLayoutআপনার দৃষ্টিভঙ্গিটি ব্যবহার করুন , আপনার দৃষ্টিভঙ্গি RelativeLayout.LayoutParamsথেকে অবজেক্ট পান এবং আপনার প্রয়োজন অনুযায়ী মার্জিন সেট করুন। তারপরে আপনার মতামতটি কল requestLayout()করুন। এটিই আমি জানি।


1

আমি দেখতে পেয়েছি যে @ স্টেফান হস্টাইন আমার অভিজ্ঞতার খুব কাছাকাছি এসেছেন তবে 100% নিশ্চিত নন। আমার পরামর্শটি হ'ল:

  • setLeft()/ setRight()/ setBottom()/ setTop()কখনও কখনও কাজ করবে না।
  • আপনি যদি সাময়িকভাবে কোনও অবস্থান নির্ধারণ করতে চান (যেমন অ্যানিমেশন করার জন্য, কোনও শ্রেণিবিন্যাসকে প্রভাবিত করে না) যখন ভিউ যুক্ত করা হয় এবং প্রদর্শিত হয় , কেবল / পরিবর্তে ব্যবহারsetX()setY() করুন। (আপনি হয়ত আরও বেশি পার্থক্য অনুসন্ধান করতে চান এবংsetLeft()setX() )
  • এবং নোট করুন যে এক্স, ওয়াই সম্পূর্ণ নিখুঁত বলে মনে হচ্ছে এবং এটি AbsoluteLayout দ্বারা সমর্থিত ছিল যা এখন অবচয় করা হয়েছে। সুতরাং, আপনি অনুভব করছেন এক্স, ওয়াই সম্ভবত আর সমর্থিত নয়। এবং হ্যাঁ, এটি কেবল আংশিক। এর অর্থ যদি আপনার ভিউ যুক্ত করা থাকে, setX (), setY () পুরোপুরি কাজ করবে ; অন্যথায়, আপনি যখন ভিউ গ্রুপের বিন্যাসে (যেমন ফ্রেমলআউট, লিনিয়ারলআউট , রিলেটিভ লেআউট ) একটি ভিউ যুক্ত করার চেষ্টা করবেন , আপনাকে অবশ্যই অবশ্যই এর লেআউটপ্যারামগুলি মার্জিন লেফট, মার্জিনটপ দিয়ে সেট করতে হবে ( এক্ষেত্রে সেটএক্স (), সেটওয়াই () কখনও কখনও কাজ করবে না)।
  • MarginLeft এবং marginTop দ্বারা দৃষ্টিকোণ সেট অবস্থান একটি হল unsynchronized প্রক্রিয়া। সুতরাং শ্রেণিবিন্যাস আপডেট করতে কিছুটা সময় প্রয়োজন । যদি আপনি এর জন্য মার্জিন সেট করার পরে সরাসরি ভিউটি ব্যবহার করেন তবে আপনি একটি ভুল মান পেতে পারেন

0

পজিশনিংয়ের সাথে একটি জিনিস মনে রাখতে হবে হ'ল প্রতিটি ভিউয়ের পিতামাতার মতামতের সাথে তুলনামূলক একটি সূচি থাকে। সুতরাং আপনার যদি তিনটি মতামত সহ রৈখিক বিন্যাস থাকে তবে উপরের ক্ষেত্রে সাবউভিউগুলির প্রতিটি সূচক থাকবে: 0, 1, 2।

এটি আপনাকে এইরকম কিছু করে পিতামাতার দৃশ্যে শেষ অবস্থানে (বা শেষের দিকে) একটি ভিউ যুক্ত করতে দেয়:

int childCount = parent.getChildCount();
parentView.addView(newView, childCount);

বিকল্পভাবে আপনি নীচের মতো কিছু ব্যবহার করে একটি দৃশ্য প্রতিস্থাপন করতে পারেন:

int childIndex = parentView.indexOfChild(childView);
childView.setVisibility(View.GONE);

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