Java ImageView getLocationtOnScreen android

Java ImageView getLocationtOnScreen android,java,android,Java,Android,我正在尝试获取屏幕上图像的坐标。我当前在活动中有一个ImageView。我知道getLocationOnScreen()方法只能在创建布局后调用,因此在oncreate函数中调用此方法将返回[0,0]。但是我不知道如何让这个方法返回正确的值。我已经尝试过隐藏各种超类方法,比如onstart方法或onTouchEvent方法,但它仍然会返回[0,0]。我目前拥有的代码如下: @Override public void onCreate(Bundle savedInstanceState) {

我正在尝试获取屏幕上图像的坐标。我当前在活动中有一个ImageView。我知道getLocationOnScreen()方法只能在创建布局后调用,因此在oncreate函数中调用此方法将返回[0,0]。但是我不知道如何让这个方法返回正确的值。我已经尝试过隐藏各种超类方法,比如onstart方法或onTouchEvent方法,但它仍然会返回[0,0]。我目前拥有的代码如下:

@Override
public void onCreate(Bundle savedInstanceState) 
{
    // Some code here after which ..
    image = (ImageView) findViewById(R.id.imageVfi);        
    image.setImageBitmap(imageData.entrySet().iterator().next().getValue());
}
然后我有了我已经重写的onStart方法

@Override
public void onStart()
{
    super.onStart();        
    image.setOnTouchListener(new View.OnTouchListener() {
        public boolean onTouch(View v, MotionEvent event) {
            int[] dim = new int[2];
            image.getLocationOnScreen(dim);
            new AlertDialog.Builder(DisplayPicture.this)
            .setIcon(R.drawable.icon)
            .setTitle("Touch coordinates : " +
                    String.valueOf(dim[0]) + "x" + String.valueOf(dim[1]))
            .setPositiveButton("OK", 
                     new DialogInterface.OnClickListener() {   
                 public void onClick(DialogInterface dialog, int which) 
                 {
                     // TODO Auto-generated method stub
                 }
            }).show();
            // image calculations go here
            return true;

        }
    });
}   

这将返回0X0给我。非常感谢您的帮助。

如果您的活动中只有图像视图,则默认情况下它将位于左上角,坐标为0x0。

如果您的活动中只有图像视图,然后,默认情况下,它将位于左上角,坐标为0x0。

ImageView不提供在屏幕上获取其图像位置的方法。您只能查询ImageView本身的位置。您可以尝试使用ImageView.getImageMatrix(),但我不确定当图像只是居中(与缩放等相反)时是否填充它。

ImageView不提供获取其图像在屏幕上位置的方法。您只能查询ImageView本身的位置。您可以尝试使用ImageView.getImageMatrix(),但我不确定当图像只是居中(而不是缩放等)时是否填充它

解决方案:

按照下面Romain Guy提供的建议,我能够获得坐标,但在onStart overidden方法中添加了以下代码

display = ((WindowManager) getSystemService(WINDOW_SERVICE)).getDefaultDisplay();
            int orientation = display.getOrientation();
            float rowStart=0, rowEnd=0, columnStart=0, columnEnd=0;
            if(orientation ==0)
            {
                final Matrix matrix = image.getImageMatrix();
                float[] values = new float[9];
                matrix.getValues(values);
                rowStart = values[0];
                columnStart = values[5];
                rowEnd = image.getWidth()-rowStart;
                columnEnd = image.getHeight()-columnStart;
            }else if(orientation == 1)
            {
                final Matrix matrix = image.getImageMatrix();
                float[] values = new float[9];
                matrix.getValues(values);
                rowStart = values[2];
                columnStart = values[3];
                rowEnd = image.getWidth()-rowStart;
                columnEnd = image.getHeight()-columnStart;
            }

按照上述建议解决问题

解决方案:

按照下面Romain Guy提供的建议,我能够获得坐标,但在onStart overidden方法中添加了以下代码

display = ((WindowManager) getSystemService(WINDOW_SERVICE)).getDefaultDisplay();
            int orientation = display.getOrientation();
            float rowStart=0, rowEnd=0, columnStart=0, columnEnd=0;
            if(orientation ==0)
            {
                final Matrix matrix = image.getImageMatrix();
                float[] values = new float[9];
                matrix.getValues(values);
                rowStart = values[0];
                columnStart = values[5];
                rowEnd = image.getWidth()-rowStart;
                columnEnd = image.getHeight()-columnStart;
            }else if(orientation == 1)
            {
                final Matrix matrix = image.getImageMatrix();
                float[] values = new float[9];
                matrix.getValues(values);
                rowStart = values[2];
                columnStart = values[3];
                rowEnd = image.getWidth()-rowStart;
                columnEnd = image.getHeight()-columnStart;
            }

我想补充一点,我认为它将整个屏幕视为图像,因为当我调用image.getHeight()函数时,它返回800像素,image.getWidth函数返回480像素,这与屏幕分辨率相同。然而,实际可见的图像并不占据整个屏幕。你知道我如何修复这个问题吗?请注意,其余空白区域不在原始图像中。我只是意识到我在IVIEVIEW上被称为GETLooSoCon屏幕方法,而我的图像没有占据整个视图。这意味着我必须以某种方式将屏幕坐标映射到实际的图像坐标。我不知道该怎么做,我想补充一点,我认为它将整个屏幕视为图像,因为当我调用image.getHeight()函数时,它返回800像素,image.getWidth函数返回480像素,这与屏幕分辨率相同。然而,实际可见的图像并不占据整个屏幕。你知道我如何修复这个问题吗?请注意,其余空白区域不在原始图像中。我只是意识到我在IVIEVIEW上被称为GETLooSoCon屏幕方法,而我的图像没有占据整个视图。这意味着我必须以某种方式将屏幕坐标映射到实际的图像坐标。我不知道我该怎么做不,我已经使用android:scaleType=“center”将其定位在中心,因此返回的坐标不正确。我有一个临时修复方法,就是缩放图像以适应屏幕,但图像会丢失其纵横比。@k9ty尝试使用“fit center”缩放图像。然后你可以得到图像矩阵并计算屏幕上图像的大小。由此可以得到坐标=图像视图的位置+(图像视图的宽度或高度/2-图像的宽度或高度/2)。是否使用宽度或高度进行计算取决于屏幕和图像的纵横比。否,我使用android:scaleType=“center”将其定位在中心,因此返回的坐标不正确。我有一个临时修复方法,就是缩放图像以适应屏幕,但图像会丢失其纵横比。@k9ty尝试使用“fit center”缩放图像。然后你可以得到图像矩阵并计算屏幕上图像的大小。由此可以得到坐标=图像视图的位置+(图像视图的宽度或高度/2-图像的宽度或高度/2)。是否使用宽度或高度进行计算取决于屏幕和图像的纵横比。非常感谢。我能够按照建议使用getImageMatrix获得图像坐标。我在下面添加了很多解决方案。我能够按照建议使用getImageMatrix获得图像坐标。我在下面添加了我的解决方案