我有一个包含自定义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>
答案 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自我意识到它的扩展尺寸。
看起来很笨重,但确实有效。
感谢所有人提出的建议,我的解决方案是收集每个人的建议。