উত্তর:
এটি একটি সমাধান, যেহেতু সময়ের সাথে সাথে এপিআইগুলি পরিবর্তন হয় এবং এটি করার অন্যান্য উপায়ও থাকতে পারে তবে অন্যান্য উত্তরগুলি পরীক্ষা করে দেখুন। একটি দাবি দ্রুততর, এবং অন্যটি আরও সহজ বলে দাবি করেছে।
private int getRelativeLeft(View myView) {
if (myView.getParent() == myView.getRootView())
return myView.getLeft();
else
return myView.getLeft() + getRelativeLeft((View) myView.getParent());
}
private int getRelativeTop(View myView) {
if (myView.getParent() == myView.getRootView())
return myView.getTop();
else
return myView.getTop() + getRelativeTop((View) myView.getParent());
}
যদি এটি কাজ করে তবে আমাকে জানান।
এটি প্রতিটি পিতামাতার ধারক থেকে পুনরাবৃত্তভাবে কেবল শীর্ষ এবং বাম অবস্থানগুলি যুক্ত করা উচিত। আপনি চাইলে এটি দিয়ে একটি বাস্তবায়নও করতে Point
পারেন।
অ্যান্ড্রয়েড এপিআই ইতিমধ্যে এটি অর্জনের জন্য একটি পদ্ধতি সরবরাহ করে। এটা চেষ্টা কর:
Rect offsetViewBounds = new Rect();
//returns the visible bounds
childView.getDrawingRect(offsetViewBounds);
// calculates the relative coordinates to the parent
parentViewGroup.offsetDescendantRectToMyCoords(childView, offsetViewBounds);
int relativeTop = offsetViewBounds.top;
int relativeLeft = offsetViewBounds.left;
এখানে ডক
parentViewGroup
করতে চাই যে ভিউ হায়ারার্কির কোনও পিতা-মাতা হতে পারে, সুতরাং এটি স্ক্রোলভিউয়ের জন্যও পুরোপুরি কাজ করে।
দয়া করে ব্যবহার করুন view.getLocationOnScreen(int[] location);
( জাভাদোকগুলি দেখুন )। উত্তরটি পূর্ণসংখ্যার অ্যারে (x = location[0]
এবং y = location[1]
) এ।
View rootLayout = view.getRootView().findViewById(android.R.id.content);
int[] viewLocation = new int[2];
view.getLocationInWindow(viewLocation);
int[] rootLocation = new int[2];
rootLayout.getLocationInWindow(rootLocation);
int relativeLeft = viewLocation[0] - rootLocation[0];
int relativeTop = viewLocation[1] - rootLocation[1];
প্রথমে আমি মূল বিন্যাসটি পেয়েছি তারপরে দৃশ্যের সাথে স্থানাঙ্কের পার্থক্য গণনা করি।
এর getLocationOnScreen()
পরিবর্তে আপনিও ব্যবহার করতে পারেন getLocationInWindow()
।
ম্যানুয়ালি এটি গণনা করার দরকার নেই।
ঠিক এর মতো getGlobalVisibleRect ব্যবহার করুন :
Rect myViewRect = new Rect();
myView.getGlobalVisibleRect(myViewRect);
float x = myViewRect.left;
float y = myViewRect.top;
এছাড়াও মনে রাখবেন যে কেন্দ্রের স্থানাঙ্কগুলির জন্য, এর চেয়ে আরও কিছু:
...
float two = (float) 2
float cx = myViewRect.left + myView.getWidth() / two;
float cy = myViewRect.top + myView.getHeight() / two;
আপনি ঠিক করতে পারেন:
float cx = myViewRect.exactCenterX();
float cy = myViewRect.exactCenterY();
getGlobalVisibleRect
হ'ল globalOffset.set(-mScrollX, -mScrollY);
এটি আপনার কেবল সেই সম্পর্কিত মানগুলি পেতে পারে getScollX/Y
যদি আপনার কেবল আপেক্ষিক কুডিনেটের প্রয়োজন হয়।
আপনি use ব্যবহার করতে পারেন
View.getLocationOnScreen (int [] অবস্থান)
; your আপনার দর্শনের অবস্থানটি সঠিকভাবে পেতে।
কিন্তু একটি হল ধরা যদি আপনি এটি ব্যবহার করার আগে লেআউট স্ফীত হয়ে গেলে আপনাকে ভুল অবস্থানে পাবেন।
এই সমস্যার সমাধান এর ViewTreeObserver
মতো যুক্ত হচ্ছে: -
আপনার দর্শনটির এক্স ওয়াই অবস্থান সংরক্ষণের জন্য বিশ্বব্যাপী অ্যারে ঘোষণা করুন
int[] img_coordinates = new int[2];
এবং তারপরে ViewTreeObserver
লেআউট মুদ্রাস্ফীতিটির জন্য কলব্যাক পেতে আপনার প্যারেন্ট লেআউটটিতে যুক্ত করুন এবং কেবলমাত্র তখনই অবস্থানের অবস্থানটি আনুন অন্যথায় আপনি ভুল xy স্থানাঙ্ক পাবেন
// set a global layout listener which will be called when the layout pass is completed and the view is drawn
parentViewGroup.getViewTreeObserver().addOnGlobalLayoutListener(
new ViewTreeObserver.OnGlobalLayoutListener() {
public void onGlobalLayout() {
//Remove the listener before proceeding
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
parentViewGroup.getViewTreeObserver().removeOnGlobalLayoutListener(this);
} else {
parentViewGroup.getViewTreeObserver().removeGlobalOnLayoutListener(this);
}
// measure your views here
fab.getLocationOnScreen(img_coordinates);
}
}
);
এবং তারপরে এটি ব্যবহার করুন
xposition = img_coordinates[0];
yposition = img_coordinates[1];
আমি নিজের জন্য দুটি ইউটিলিটি পদ্ধতি লিখেছি যা বেশিরভাগ অবস্থাতে কাজ করে বলে মনে হচ্ছে, স্ক্রোল পরিচালনা, অনুবাদ এবং স্কেলিং, তবে আবর্তন নয়। ফ্রেমওয়ার্কে অফসেটডেসেন্ট্যান্টরেক্টটওমাইকার্ডস () ব্যবহার করার চেষ্টা করার পরে আমি এটি করেছি, যার বেমানান যথাযথতা ছিল। এটি কিছু ক্ষেত্রে কাজ করেছে তবে অন্যের ক্ষেত্রে ভুল ফলাফল দিয়েছে।
"পয়েন্ট" হ'ল দুটি উপাদান (x এবং y স্থানাঙ্ক) সহ একটি ফ্লোট অ্যারে, "পূর্বপুরুষ" গাছের শ্রেণিবিন্যাসের "বংশধর" এর উপরে কোথাও একটি ভিউগ্রুপ।
প্রথমে একটি পদ্ধতি যা পূর্বসূরীর বংশধর থেকে স্থানাঙ্কে যায়:
public static void transformToAncestor(float[] point, final View ancestor, final View descendant) {
final float scrollX = descendant.getScrollX();
final float scrollY = descendant.getScrollY();
final float left = descendant.getLeft();
final float top = descendant.getTop();
final float px = descendant.getPivotX();
final float py = descendant.getPivotY();
final float tx = descendant.getTranslationX();
final float ty = descendant.getTranslationY();
final float sx = descendant.getScaleX();
final float sy = descendant.getScaleY();
point[0] = left + px + (point[0] - px) * sx + tx - scrollX;
point[1] = top + py + (point[1] - py) * sy + ty - scrollY;
ViewParent parent = descendant.getParent();
if (descendant != ancestor && parent != ancestor && parent instanceof View) {
transformToAncestor(point, ancestor, (View) parent);
}
}
পূর্ববর্তী থেকে বংশধর পর্যন্ত বিপরীত দিকে:
public static void transformToDescendant(float[] point, final View ancestor, final View descendant) {
ViewParent parent = descendant.getParent();
if (descendant != ancestor && parent != ancestor && parent instanceof View) {
transformToDescendant(point, ancestor, (View) parent);
}
final float scrollX = descendant.getScrollX();
final float scrollY = descendant.getScrollY();
final float left = descendant.getLeft();
final float top = descendant.getTop();
final float px = descendant.getPivotX();
final float py = descendant.getPivotY();
final float tx = descendant.getTranslationX();
final float ty = descendant.getTranslationY();
final float sx = descendant.getScaleX();
final float sy = descendant.getScaleY();
point[0] = px + (point[0] + scrollX - left - tx - px) / sx;
point[1] = py + (point[1] + scrollY - top - ty - py) / sy;
}
যদি কেউ এখনও এটি বের করার চেষ্টা করছে to এভাবেই আপনি কেন্দ্রের এক্স এবং ওয়াই পাবেন view
।
int pos[] = new int[2];
view.getLocationOnScreen(pos);
int centerX = pos[0] + view.getMeasuredWidth() / 2;
int centerY = pos[1] + view.getMeasuredHeight() / 2;
আমি স্রেফ উত্তরটি এখানে পেয়েছি
এতে বলা হয়েছে: getLeft () এবং getTop () পদ্ধতিগুলি আহ্বান করে একটি দৃশ্যের অবস্থান পুনরুদ্ধার করা সম্ভব। প্রাক্তনটি উপাত্তকে উপস্থাপন করে এমন আয়তক্ষেত্রের বাম বা এক্স প্রদান করে। পরবর্তীটি দৃশ্যের প্রতিনিধিত্ব করে এমন আয়তক্ষেত্রের শীর্ষ বা y প্রদান করে। এই পদ্ধতিগুলি উভয়ই তার পিতামাতার তুলনায় ভিউয়ের অবস্থানটি ফিরিয়ে দেয়। উদাহরণস্বরূপ, যখন getLeft () 20 ফেরায়, তার অর্থ ভিউটি তার সরাসরি পিতামাতার বাম প্রান্তের ডানদিকে 20 পিক্সেল অবস্থিত।
সুতরাং ব্যবহার:
view.getLeft(); // to get the location of X from left to right
view.getRight()+; // to get the location of Y from right to left