Getting 0 Value for both X and Y Coordinate of view(Imagebutton) in android

安稳与你 提交于 2019-12-03 20:28:15

问题


I want to get X and Y Point of View(ImageButton).

When I try to find X and Y on Click event with below code I get proper X and Y coordinate for View.

    ImageButton imagebutton = findviewbyId(R.id.imagebutton);                       
    imagebutton.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
            int[] posXY = new int[2];
            v.getLocationOnScreen(posXY);
            x = posXY[0];
            y = posXY[1];

            Log.d("X and Y Point", x + " " + y);        
        }
    });

But I want X and Y Co-ordinate before Click on view so I try to get X and Y with below code.

    ImageButton imagebutton = findviewbyId(R.id.imagebutton);                       
    int[] posXY = new int[2];
    imageButton.getLocationOnScreen(posXY);
    x = posXY[0];
    y = posXY[1];

    Log.d("X and Y Point", x + " " + y);

But whenever I try to get X and Y with ClickListener I get X and Y as 0 and 0. So, I do not get Proper X and Y without ClickListener. Could anyone help to solve out what is an actual issue, how can I get Proper X and Y without ClickListener?


回答1:


the reason the returned value is zero is because the ImageButton is not yet created if you call this method in 'onCreate()'. You can use the ViewTreeObserver to get the position:

ViewTreeObserver vto = imagebutton.getViewTreeObserver(); 
vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() { 
    @Override 
    public void onGlobalLayout() { 
        this.imagebutton.getViewTreeObserver().removeGlobalOnLayoutListener(this); 

        int[] posXY = new int[2];

        imagebutton.getLocationOnScreen(posXY);
        x = posXY[0];
        y = posXY[1];

        Log.d("X and Y Point", x + " " + y);  

    } 
});

Happy coding




回答2:


post() gets called after setContentView().

Method setContentView() ends up in callingViewGroup.addView() of the top view, andaddView() call always triggers requestLayout(). In turn, requestLayout() posts a task to the main thread to be executed later. This task will execute measure and layout on the view hierarchy. Now if you post another task it will be put into the queue afterlayout task and, as the result, always executed aftermeasure and layout happen. Thus you will always have valid sizes.

Taken from https://stackoverflow.com/a/21938380

button.post(new Runnable() {
    @Override
    public void run() {
        // get coordinates
    }
});



回答3:


Get the values on onWindowFocusChanged().

@Override
public void onWindowFocusChanged(boolean hasFocus) {
    super.onWindowFocusChanged(hasFocus);

    ImageButton imagebutton = (ImageButton) findViewById(R.id.imagebutton);
    int[] posXY = new int[2];
    imagebutton.getLocationInWindow(posXY);
    int x = posXY[0];
    int y = posXY[1];

    Log.d("X and Y Point", x + " " + y);
}



回答4:


Two options:

  • Implementing your logics in onResume.
  • Using ViewTreeObserver.

    final ViewTreeObserver vto = findViewById(R.id.YOUR_VIEW_ID).getViewTreeObserver(); 
    vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() { 
        @Override 
        public void onGlobalLayout() { 
            vto.removeOnGlobalLayoutListener(this);  
    
            // Get X, Y of the ImageView here
        } 
    });
    


来源:https://stackoverflow.com/questions/35208104/getting-0-value-for-both-x-and-y-coordinate-of-viewimagebutton-in-android

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!