2016-02-04 51 views
2

我想获得X和Y的观点(ImageButton)。获取0值为X和Y坐标的视图(图片按钮)在android

当我尝试找到X和Y点击事件与下面的代码我得到适当的X和Y坐标视图。

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);   
     } 
    }); 

但我希望X和Y坐标之前点击视图,所以我尝试得到X和Y与下面的代码。

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); 

但每当我试图让X与Y ClickListener我得到的X和Y为0和0.So,我不无Clicklistener得到适当的X和Y。 任何人都可以帮助解决什么是实际问题,我如何得到适当的X和Y没有ClickListener。

+1

*服用时*你叫'imageButton.getLocationOnScreen(posXY)'?如果您在实际布局之前调用它,它将始终为'(0,0)'。您需要等待布局来布置视图。 –

+0

那么,我如何才能让X和Y无法点击呢?有没有可能的方法? –

+0

[Here](http://stackoverflow.com/questions/22972022/why-does-calling-getwidth-on-a-view-in-onresume-return-0)你可以找到一些解决方案和一些解释和一个有用的链接。 – Onik

回答

3

返回的值为零的原因是因为如果你调用这个方法尚未创建的ImageButton“的onCreate()”。 可以使用ViewTreeObserver获得位置:

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); 

    } 
}); 

快乐编码

0

两个选项:

  • onResume实现你的逻辑。
  • 使用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 
        } 
    }); 
    
+0

在删除前检查vto是否存在。 – Keshav

+0

@Keshav在这种情况下,不需要检查。 –

+0

让我检查一下,顺便说一句@Keshav什么是vto? –

0

获取有关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); 
} 
2

post()在setContentView()之后被调用。

方法setContentView()结束于调用顶部视图的ViewGroup.addView(),andaddView()调用始终触发requestLayout()。接下来,requestLayout()将任务发布到稍后要执行的主线程中。该任务将在视图层次结构上执行度量和布局。现在,如果您发布另一个任务,它将被放入队列后的布局任务中,并因此总是在测量和布局发生后执行。因此,您将始终拥有有效的尺寸。

https://stackoverflow.com/a/21938380

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

@ HiI'mFrogatto,请帮我解释一下。我想明白。 – Keshav

+0

当视图附加到窗口afaik时,将调用此方法。 – Keshav

+0

但是你会不会针对UI线程运行,并且不保证在绘制布局后启动? –