উত্তর:
হানিকম্বের নীচে যে কোনও জিনিসের জন্য (এপিআই স্তর 11) আপনাকে ব্যবহার করতে হবে setLayoutParams(...)
।
আপনি মউচাক আপনার সমর্থন সীমিত এবং করতে পারেন আপ আপনি ব্যবহার করতে পারেন setX(...)
, setY(...)
, setLeft(...)
, setTop(...)
, ইত্যাদি
হ্যাঁ, আপনি অ্যান্ড্রয়েডে গতিরূপে দর্শনের অবস্থান সেট করতে পারেন। তেমনি আপনার এক্সএমএল ফাইলের একটি অন্তর্ভুক্ত ImageView
রয়েছে LinearLayout
o সুতরাং আপনি এর অবস্থানটি মাধ্যমে সেট করতে পারেন 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);
আমি আশা করি এটি আপনার অবস্থান নির্ধারণে সহায়ক হবে।
ইতিমধ্যে বিভিন্ন বৈধ উত্তর রয়েছে, তবে সংশ্লিষ্ট এপিআই স্তরের নিষেধাজ্ঞাগুলি ব্যতীত কোন ক্ষেত্রে কোন পদ্ধতি (গুলি) ব্যবহার করা উচিত তা সঠিকভাবে কেউ বলেছিল বলে মনে হয় না:
যদি আপনি কোনও বিন্যাস চক্রের জন্য অপেক্ষা করতে পারেন এবং পিতামাতার দর্শন গোষ্ঠী সমর্থন করে 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()
লেআউট সিস্টেমের বাইরে কাজ করে এবং সংশ্লিষ্ট মানগুলি লেআউট সিস্টেম দ্বারা নির্ধারিত বাম / উপরে / নীচে / ডান মানগুলিকে অতিরিক্ত অফসেট হিসাবে বিবেচনা করা হয়, সেই অনুসারে ভিউ স্থানান্তরিত। এনিমেশনগুলির জন্য এগুলি যুক্ত করা হয়েছে বলে মনে হয় (যেখানে কোনও বিন্যাস চক্রের মাধ্যমে না গিয়ে তাত্ক্ষণিক প্রভাব প্রয়োজন)।
marginLeft
ব্যবহার করে নির্ধারণ করা যাবে setLayoutParams
সঙ্গে একটি new FrameLayout.LayoutParams(width, height)
যার উপর আপনার সেটmarginLeft
নাইনওয়েলড্রয়েডস নামে একটি গ্রন্থাগার রয়েছে , যা আপনাকে অ্যানিমেশন লাইব্রেরিটিকে পুরোপুরি এক সংস্করণে ব্যবহার করতে দেয়।
এর অর্থ আপনি কিছুটা ভিন্ন ইন্টারফেসের সাহায্যে বাম, ডান, অনুবাদ এক্স / ওয়াই সংজ্ঞায়িত করতে পারেন।
এটা যেভাবে কাজ করে:
ViewHelper.setTranslationX(view, 50f);
আপনি কেবল ভিউহেল্পার শ্রেণি থেকে স্থিতিশীল পদ্ধতিগুলি ব্যবহার করেন, ভিউটি পাস করুন এবং কোনটিকে আপনি সেট করতে চান তা কোন মানকেই সরিয়ে দিন।
আমি ব্যবহার setTranslationX
এবং সুপারিশ করব setTranslationY
। আমি কেবল এটি নিজেই শুরু করছি, তবে এগুলি দৃশ্যের সরানোর সবচেয়ে নিরাপদ এবং পছন্দের উপায় বলে মনে হচ্ছে। আমার ধারণা, আপনি ঠিক কী করতে চাইছেন তা অনেকটা নির্ভর করে তবে এটি 2 ডি অ্যানিমেশনের জন্য আমার পক্ষে ভালভাবে কাজ করছে।
আপনি যদি হানিকম্ব এসডিকে (এপিআই লেভেল 11) ব্যবহার করেন তবে আপনি নিম্নলিখিত পদ্ধতিগুলি ব্যবহার করার চেষ্টা করতে পারেন।
view.setX(float x);
প্যারামিটার এক্স এই দর্শনটির ভিজ্যুয়াল এক্স অবস্থান।
view.setY(float y);
প্যারামিটার y এই দর্শনটির ভিজ্যুয়াল y অবস্থান।
আমি আশা করি এটি আপনার পক্ষে সহায়ক হবে। :)
সমস্ত API স্তরের সমর্থনের জন্য আপনি এটি এ জাতীয়ভাবে ব্যবহার করতে পারেন :
ViewPropertyAnimator.animate(view).translationYBy(-yourY).translationXBy(-yourX).setDuration(0);
এর পিতামাতার তুলনায় এই দর্শনটির বাম অবস্থান নির্ধারণ করুন:
view.setLeft(int leftPosition);
এর অভিভাবকের তুলনায় এই দর্শনটির সঠিক অবস্থান নির্ধারণ করুন:
view.setRight(int rightPosition);
এর পিতামাতার তুলনায় এই দর্শনটির শীর্ষ অবস্থানটি নির্ধারণ করুন:
view.setTop(int topPosition);
তার পিতামাতার তুলনায় এই দর্শনটির নীচের অবস্থানটি সেট করুন:
view.setBottom(int bottomPositon);
উপরোক্ত পদ্ধতিগুলি পিতামাতার সাথে সম্পর্কিত অবস্থানটি নির্ধারণ করতে ব্যবহৃত হয়।
লেআউটপ্যারাম ব্যবহার করুন। আপনি যদি লিনিয়ারলআউট ব্যবহার করে থাকেন তবে আপনাকে 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);
নোট: নোট করুন যে আপনি ইমেজভিউ.সেট লেফট (ইনট ডিমে) ব্যবহার করতে পারেন, তবে এটি উপাদানটির অবস্থান নির্ধারণ করতে পারবেন না, এটি কেবল উপাদানটির বাম সীমান্তের অবস্থান নির্ধারণ করবে, বাকিগুলি একই অবস্থানে থাকবে ।
আমি দেখতে পেয়েছি যে @ স্টেফান হস্টাইন আমার অভিজ্ঞতার খুব কাছাকাছি এসেছেন তবে 100% নিশ্চিত নন। আমার পরামর্শটি হ'ল:
setLeft()
/ setRight()
/ setBottom()
/ setTop()
কখনও কখনও কাজ করবে না।setX()
setY()
করুন। (আপনি হয়ত আরও বেশি পার্থক্য অনুসন্ধান করতে চান এবংsetLeft()
setX()
)পজিশনিংয়ের সাথে একটি জিনিস মনে রাখতে হবে হ'ল প্রতিটি ভিউয়ের পিতামাতার মতামতের সাথে তুলনামূলক একটি সূচি থাকে। সুতরাং আপনার যদি তিনটি মতামত সহ রৈখিক বিন্যাস থাকে তবে উপরের ক্ষেত্রে সাবউভিউগুলির প্রতিটি সূচক থাকবে: 0, 1, 2।
এটি আপনাকে এইরকম কিছু করে পিতামাতার দৃশ্যে শেষ অবস্থানে (বা শেষের দিকে) একটি ভিউ যুক্ত করতে দেয়:
int childCount = parent.getChildCount();
parentView.addView(newView, childCount);
বিকল্পভাবে আপনি নীচের মতো কিছু ব্যবহার করে একটি দৃশ্য প্রতিস্থাপন করতে পারেন:
int childIndex = parentView.indexOfChild(childView);
childView.setVisibility(View.GONE);
parentView.addView(newView, childIndex);
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.
- তাই সম্ভবত এটি ভাল ধারণা নয়;)