문제

뷰 왼쪽 상단의 절대 화면 픽셀 좌표를 얻으려고 합니다.그러나 내가 찾을 수 있는 모든 방법은 다음과 같습니다. getLeft() 그리고 getRight() 그것들은 모두 뷰의 부모에 상대적인 것처럼 보이기 때문에 작동하지 않습니다. 0.이를 수행하는 올바른 방법은 무엇입니까?

도움이 된다면 '그림을 다시 정리하기' 게임을 위한 것입니다.사용자가 상자를 그려 여러 조각을 선택할 수 있기를 바랍니다.내 가정은 그렇게 하는 가장 쉬운 방법은 다음과 같다는 것입니다. getRawX() 그리고 getRawY() ~로부터 MotionEvent 그런 다음 해당 값을 조각이 포함된 레이아웃의 왼쪽 상단 모서리와 비교합니다.조각의 크기를 알면 몇 개의 조각이 선택되었는지 확인할 수 있습니다.사용할 수 있다는 것을 깨달았습니다 getX() 그리고 getY()MotionEvent, 그러나 이는 어떤 부분이 선택되었는지 결정하는 것을 더 어렵게 만드는 상대 위치를 반환하기 때문입니다.(불가능하지는 않지만, 불필요하게 복잡해 보입니다.)

편집하다:이것은 질문 중 하나에 따라 보관 용기의 크기를 얻으려고 시도한 코드입니다. TableLayout 모든 퍼즐 조각을 보관하는 테이블입니다.

TableLayout tableLayout = (TableLayout) findViewById(R.id.tableLayout);
Log.d(LOG_TAG, "Values " + tableLayout.getTop() + tableLayout.getLeft());

편집 2:제안된 답변 중 더 많은 것을 따라 시도한 코드는 다음과 같습니다.

public int[] tableLayoutCorners = new int[2];
(...)

TableLayout tableLayout = (TableLayout) findViewById(R.id.tableLayout);
tableLayout.requestLayout();
Rect corners = new Rect();
tableLayout.getLocalVisibleRect(corners);
Log.d(LOG_TAG, "Top left " + corners.top + ", " + corners.left + ", " + corners.right
            + ", " + corners.bottom);

cells[4].getLocationOnScreen(tableLayoutCorners);
Log.d(LOG_TAG, "Values " + tableLayoutCorners[0] + ", " + tableLayoutCorners[1]);

이 코드는 모든 초기화가 완료된 후에 추가되었습니다.이미지는 TableLayout.Cells[0]은 왼쪽 상단입니다. ImageView, 저는 셀[4]가 중간 어딘가에 있고 가장 확실하게 좌표가 (0,0)이어서는 안 되기 때문에 선택했습니다.

위에 표시된 코드는 여전히 로그에 모두 0을 표시합니다. 다양한 퍼즐 조각이 올바르게 표시되기 때문에 실제로 이해가 되지 않습니다.(tableLayoutCorners 및 기본 가시성에 대해 public int를 시도했는데 둘 다 동일한 결과를 제공했습니다.)

이게 중요한지는 모르겠지만, ImageViews에는 원래 크기가 제공되지 않습니다.크기 ImageViews는 표시할 이미지를 제공할 때 View에 의해 초기화 중에 자동으로 결정됩니다.로깅 코드가 이미지가 제공되고 자동으로 크기가 조정된 후에도 값이 0이 되는 데 기여할 수 있습니까?이에 대응하기 위해 코드를 추가했습니다. tableLayout.requestLayout() 위에 표시된 대로 시도했지만 도움이 되지 않았습니다.

도움이 되었습니까?

해결책

다른 팁

허용 된 답변은 실제로 위치를 얻는 방법을 알려주지 않았으므로 여기에 조금 더 자세한 내용이 있습니다. 당신은 안에지나갑니다 int 길이 2의 배열과 값은보기 (x, y) 좌표 (상단, 왼쪽 코너)로 대체됩니다.

int[] location = new int[2];
myView.getLocationOnScreen(location);
int x = location[0];
int y = location[1];

메모

  • 교체 getLocationOnScreen ~와 함께 getLocationInWindow 대부분의 경우 동일한 결과를 제공해야합니다 ( 이 답변). 그러나 대화 상자 나 사용자 정의 키보드와 같은 작은 창에있는 경우, 필요에 더 적합한 것을 선택해야합니다.
  • 당신은 얻을 것입니다 (0,0) 이 메소드를 호출하면 onCreate 전망이 아직 제시되지 않았기 때문입니다. 당신은 a를 사용할 수 있습니다 ViewTreeObserver 레이아웃이 완료된시기를 듣고 측정 된 좌표를 얻을 수 있습니다. (보다 이 답변.)

먼저 시야의 로컬 Visible 직사각형을 가져와야합니다.

예를 들어 :

Rect rectf = new Rect();

//For coordinates location relative to the parent
anyView.getLocalVisibleRect(rectf);

//For coordinates location relative to the screen/display
anyView.getGlobalVisibleRect(rectf);

Log.d("WIDTH        :", String.valueOf(rectf.width()));
Log.d("HEIGHT       :", String.valueOf(rectf.height()));
Log.d("left         :", String.valueOf(rectf.left));
Log.d("right        :", String.valueOf(rectf.right));
Log.d("top          :", String.valueOf(rectf.top));
Log.d("bottom       :", String.valueOf(rectf.bottom));

이것이 도움이되기를 바랍니다

글로벌 레이아웃 리스너를 사용하는 것은 항상 저에게 잘 작동했습니다. 레이아웃이 변경되면 물건을 재구성 할 수 있다는 이점이 있습니다.

public void onCreate(Bundle savedInstanceState)
{
     super.onCreate(savedInstanceState);

     // inflate your main layout here (use RelativeLayout or whatever your root ViewGroup type is
     LinearLayout mainLayout = (LinearLayout ) this.getLayoutInflater().inflate(R.layout.main, null); 

     // set a global layout listener which will be called when the layout pass is completed and the view is drawn
     mainLayout.getViewTreeObserver().addOnGlobalLayoutListener(
       new ViewTreeObserver.OnGlobalLayoutListener() {
          public void onGlobalLayout() {
               //Remove the listener before proceeding
               if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
                    mainLayout.getViewTreeObserver().removeOnGlobalLayoutListener(this);
               } else {
                    mainLayout.getViewTreeObserver().removeGlobalOnLayoutListener(this);
               }

               // measure your views here
          }
       }
     );

     setContentView(mainLayout);
 }

Romain Guy의 의견에 따라 문제를 해결한 방법은 다음과 같습니다.이 문제가 있는 다른 사람에게도 도움이 되기를 바랍니다.

실제로 화면에 배치되기 전에 뷰의 위치를 ​​얻으려고 노력했지만 그런 일이 일어나고 있는지는 전혀 분명하지 않았습니다.해당 줄은 초기화 코드가 실행된 후에 배치되었으므로 모든 것이 준비되었다고 가정했습니다.그러나 이 코드는 여전히 onCreate()에 있었습니다.Thread.sleep()을 실험하면서 onCreate()부터 onResume()까지 실행이 완료될 때까지 레이아웃이 실제로 마무리되지 않는다는 것을 발견했습니다.따라서 실제로 레이아웃이 화면에 배치되기 전에 코드가 실행되려고 했습니다.OnClickListener(또는 다른 리스너)에 코드를 추가하면 레이아웃이 완료된 후에만 실행될 수 있으므로 올바른 값을 얻을 수 있습니다.


아래 줄은 커뮤니티 편집으로 제안되었습니다.

사용 해주세요 onWindowfocuschanged(boolean hasFocus)

첫 번째 방법 :

~ 안에 코 틀린 보기를위한 간단한 확장을 만들 수 있습니다.

fun View.getLocationOnScreen(): Point
{
    val location = IntArray(2)
    this.getLocationOnScreen(location)
    return Point(location[0],location[1])
}

그리고 단순히 좌표를 받으십시오.

val location = yourView.getLocationOnScreen()
val absX = location.x
val absY = location.y

두 번째 방법 :

두 번째 방법은 더 간단합니다.

fun View.absX(): Int
{
    val location = IntArray(2)
    this.getLocationOnScreen(location)
    return location[0]
}

fun View.absY(): Int
{
    val location = IntArray(2)
    this.getLocationOnScreen(location)
    return location[1]
}

그리고 단순히 절대 X를 얻습니다 view.absX() 그리고 y view.absY()

내 utils 기능은 get view 위치에 대해 반환합니다. Point 객체 x value 그리고 y value

public static Point getLocationOnScreen(View view){
    int[] location = new int[2];
    view.getLocationOnScreen(location);
    return new Point(location[0], location[1]);
}

사용

Point viewALocation = getLocationOnScreen(viewA);

이 코드를 사용하여 정확한 x 및 y cordinates를 찾으십시오.

int[] array = new int[2];
ViewForWhichLocationIsToBeFound.getLocationOnScreen(array);
if (AppConstants.DEBUG)
    Log.d(AppConstants.TAG, "array  X = " + array[0] + ", Y = " + array[1]);
ViewWhichToBeMovedOnFoundLocation.setTranslationX(array[0] + 21);
ViewWhichToBeMovedOnFoundLocation.setTranslationY(array[1] - 165);

내 견해를 조정하기 위해 몇 가지 값을 추가/빼 냈습니다. 전체보기가 팽창 한 후에만이 라인을 수행하십시오.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top