当容器视图缩放为centerInside时,在android imageview中找到位图的位置

时间:2012-09-11 14:15:58

标签: android bitmap imageview relativelayout

我有一个包含自定义ImageView的RelativeLayout,scaleType =“centerInside”,我加载一个位图(通常小于imageView)。如何获取位图绘制位置的顶部/左侧位置?我需要能够将addView放在相对于位图的位置上。

   RelativeLayout view = (RelativeLayout) inflater.inflate(R.layout.scroll_scaled, container, false);
ContentImageView image = (ContentImageView) view.findViewById(R.id.base_page);
Bitmap bm = mInterfaceActivity.getPageImage(mPageNumber);
image.setImageBitmap(bm);`

布局文件scrolled_scaled

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<ImageView
    android:scaleType="centerInside"
    android:id="@+id/base_page"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#ff00ff00"
    android:contentDescription="@string/product_page"
    android:src="@android:drawable/ic_menu_report_image" >
</ImageView>
</RelativeLayout>

4 个答案:

答案 0 :(得分:3)

你需要使用Drawable的界限自己做数学。

ImageView test = (ImageView) findViewById(R.id.base_page);
Rect bounds = test.getDrawable().getBounds();
int x = (test.getWidth() - bounds.right) / 2;
int y = (test.getHeight() - bounds.bottom) / 2;

首先,我们计算View中未被图像使用的空间。然后,由于它居中,额外的空间在图像之前和之后均匀分布,因此它将该长度的一半绘制到View

这些数字是相对于View的位置,但如果需要,您可以添加视图X和Y.

答案 1 :(得分:2)

此方法返回imageView内的图像边界。

/**
 * Helper method to get the bounds of image inside the imageView.
 *
 * @param imageView the imageView.
 * @return bounding rectangle of the image.
 */
public static RectF getImageBounds(ImageView imageView) {
    RectF bounds = new RectF();
    Drawable drawable = imageView.getDrawable();
    if (drawable != null) {
        imageView.getImageMatrix().mapRect(bounds, new RectF(drawable.getBounds()));
    }
    return bounds;
}

答案 2 :(得分:1)

更新2:如果你使用未指定的宽度和高度(例如wrap_content),getX和getY将返回0。而不是iv.getX()iv.getY()替换为此问题的答案:Getting View's coordinates relative to the root layout然后将图像的边界添加到这些值。

您可以通过将ImageView的位置添加到drawable内部的左上角来完成此操作。像这样:

ImageView iv = (ImageView)findViewById(R.id.image_view);
Drawable d = iv.getDrawable();
Rect bounds = d.getBounds();
int top = iv.getY() + bounds.top;
int left = iv.getX() + bounds.left;

更新:对于缩放的图像,您必须将顶部和左侧坐标乘以图像比例,以获得更准确的定位。你可以这样做:

Matrix m = iv.getImageMatrix();
float[] values = new float[9];
m.getValues(values);
float scaleX = values[Matrix.MSCALE_X];
float scaleY = values[Matrix.MSCALE_Y];

然后你必须乘以scaleY顶部,左边乘以scaleX。

答案 3 :(得分:0)

基于反馈和一些重试,结束了两部分解决方案。

我创建了子视图,并在“近似”中将它们添加到RelativeLayout 位置,但为View.INVISIBLE。

我对RelativeLayout ViewGroup进行了超级分类,并且在我走过的onLayout中 儿童观点列表,并将它们放在我现在的“适当”位置 让RelativeLayout自我意识到它的扩展尺寸。

看起来很笨重,但确实有效。

感谢所有人提出的建议,我的解决方案是收集每个人的建议。