Yanıtlar:
Bu bir çözümdür, ancak API'lar zaman içinde değiştiğinden ve bunu yapmanın başka yolları olabileceğinden, diğer yanıtları kontrol ettiğinizden emin olun. Biri daha hızlı, diğeri daha kolay olduğunu iddia ediyor.
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());
}
Bunun işe yarayıp yaramadığını bana bildirin.
Her bir üst konteynerin üst ve sol konumlarını tekrar tekrar eklemelidir. İsterseniz bir ile de uygulayabilirsiniz Point
.
Android API bunu başarmak için zaten bir yöntem sunuyor. Bunu dene:
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;
İşte doktor
parentViewGroup
görünüm hiyerarşisinde herhangi bir ebeveyn olabileceğini belirtmek istiyorum , bu yüzden ScrollView için de mükemmel çalışıyor.
Lütfen kullanın view.getLocationOnScreen(int[] location);
( Javadoc'lara bakınız ). Cevap tamsayı dizisidir (x = location[0]
ve 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];
Önce kök düzenini alıp görünümle koordinat farkını hesaplıyorum.
Bunun getLocationOnScreen()
yerine de kullanabilirsiniz getLocationInWindow()
.
Manuel olarak hesaplamaya gerek yok.
Bunun için getGlobalVisibleRect kullanın :
Rect myViewRect = new Rect();
myView.getGlobalVisibleRect(myViewRect);
float x = myViewRect.left;
float y = myViewRect.top;
Ayrıca, merkez koordinatlar için aşağıdakine benzer bir şey yerine şunları unutmayın:
...
float two = (float) 2
float cx = myViewRect.left + myView.getWidth() / two;
float cy = myViewRect.top + myView.getHeight() / two;
Sadece şunları yapabilirsiniz:
float cx = myViewRect.exactCenterX();
float cy = myViewRect.exactCenterY();
getGlobalVisibleRect
yapmasıdır globalOffset.set(-mScrollX, -mScrollY);
sadece ile bu değerleri alabilir bu yüzden getScollX/Y
sadece göreli koordinatları gerekiyorsa.
`
view.getLocationOnScreen (int [] konum)
; `` görünümünüzün konumunu doğru şekilde almak için.
Ama bir var yakalamak düzeni yanlış pozisyon alacak şişirilmiş edilmeden önce bunu kullanırsanız.
Bu sorunun çözümü şöyle ekliyor ViewTreeObserver
: -
Görünümünüzün xy konumunu depolamak için diziyi global olarak bildirin
int[] img_coordinates = new int[2];
ve daha sonra ViewTreeObserver
mizanpaj enflasyonu için geri arama almak için üst mizanpajınızı ekleyin ve yalnızca görüş pozisyonunu getirin, aksi takdirde yanlış xy koordinatları elde edersiniz
// 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);
}
}
);
ve sonra böyle kullan
xposition = img_coordinates[0];
yposition = img_coordinates[1];
Kendime çoğu koşulda işe yarayan iki yarar yöntemi yazdım, kaydırma, çeviri ve ölçeklendirme işledim, ancak döndürme değil. Bu tutarsız doğruluk vardı çerçevede offsetDescendantRectToMyCoords () kullanmaya çalıştıktan sonra yaptım. Bazı durumlarda işe yaradı, ancak diğerlerinde yanlış sonuçlar verdi.
"nokta" iki elemanlı bir kayan dizidir (x & y koordinatları), "ata", ağaç hiyerarşisinde "alt öğenin" üstünde bir yerde bir görünüm grubudur.
İlk olarak, soy koordinatlarından ataya giden bir yöntem:
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);
}
}
Daha sonra, atadan soydan nesile:
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;
}
Birisi hala bunu anlamaya çalışıyorsa. Merkezinin X ve Y merkezlerini bu şekilde elde edersiniz view
.
int pos[] = new int[2];
view.getLocationOnScreen(pos);
int centerX = pos[0] + view.getMeasuredWidth() / 2;
int centerY = pos[1] + view.getMeasuredHeight() / 2;
Cevabı burada buldum
Diyor ki: getLeft () ve getTop () yöntemlerini çağırarak bir görünümün konumunu almak mümkündür. Birincisi, görünümü temsil eden dikdörtgenin sol veya X koordinatını döndürür. İkincisi, görünümü temsil eden dikdörtgenin üst veya Y koordinatını döndürür. Bu yöntemlerin her ikisi de görünümün üst öğeye göre konumunu döndürür. Örneğin, getLeft () 20 döndürdüğünde, görünüm doğrudan üst öğesinin sol kenarının 20 piksel sağında bulunur.
bu yüzden kullanın:
view.getLeft(); // to get the location of X from left to right
view.getRight()+; // to get the location of Y from right to left