安卓图片视图缩放冲突

4
我正在使用代码创建ImageView
ImageView vlogo = new ImageView(v.getContext());
        RelativeLayout.LayoutParams vlogoParams = new RelativeLayout.LayoutParams(
                RelativeLayout.LayoutParams.WRAP_CONTENT,
                RelativeLayout.LayoutParams.WRAP_CONTENT);
        vlogoParams.addRule(RelativeLayout.ALIGN_TOP,tv_visitor.getId());
        vlogoParams.addRule(RelativeLayout.ALIGN_LEFT, tv_visitor.getId());
        vlogoParams.addRule(RelativeLayout.ALIGN_BOTTOM, tv_visitor.getId());
        vlogo.setLayoutParams(vlogoParams);
        vlogo.setImageResource(R.drawable.star);
        rl.addView(vlogo);

图像通过将其与先前创建的tv_visitor视图(已添加到相对布局)的TOPBOTTOM对齐来“缩放”。但我认为它还没有被布置好(?)。在此代码之前使用.requestLayout并没有改变任何东西。 通过这样做,我将ImageView的高度设置为tv_visitor视图的高度。这是可以的。然而,宽度似乎保持原始状态。 问题就在这里。宽度没有进行缩放。我采取的方法是使.setAdjustViewBounds(true);无效。那么我该怎么办呢? 根据评论的要求,我提供更多信息:
<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/news_scrollView"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#ff000000"
    android:scrollbars="none">
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:id="@+id/fragment_news2">
    <View
        android:id="@+id/anchor_n"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:background="#ffbb00"
        android:layout_alignParentTop="true"
        android:layout_alignParentLeft="true" />
</RelativeLayout>
</ScrollView>

视图作为参数传递,布局通过以下方式获取:
RelativeLayout rl = (RelativeLayout) v.findViewById(R.id.fragment_news2);

你的 tv_visitor View 是什么,它的 LayoutParams 是什么,你确定原始图像没有任何填充吗? - blizzard
它也是用Java创建的。它是一个MATCH_PARENT x WRAP_CONTENT的TextView。它被放置在一个0x0的“锚点”视图的右侧。肯定没有填充和边距。我甚至尝试在Java中设置它们(使用px2dp公式),但这并不能解决问题,因为结果取决于屏幕的不同。 - Bart Lizak
这是由于RelativeLayout中的一个错误引起的,它查询其子项的默认测量值(仅受其自身大小约束限制),然后强制进行自己的修改,而不查询给定子项约束的首选尺寸。作为解决方法,您可以将其包装在另一个容器中,这应该至少允许正确的对齐(尽管容器的宽度仍然相同)。硬编码父级的高度也可以解决此问题。稍后我会添加答案,以便更深入地探索。 - corsair992
1
相关问题:RelativeLayout未正确更新自定义视图的宽度。此外,还请查看有关此问题的开放错误报告:http://b.android.com/63673 - corsair992
1个回答

2
问题是由于Imageview的缩放,因为默认情况下,imageview使用ImageView.ScaleType.FIT_CENTER。根据文档,FIT_CENTER执行以下操作:

计算一个比例,保持原始src纵横比,但也确保src完全适合dst。至少有一个轴(X或Y)将完全适合。结果在dst内居中

由于图像被调整大小并居中,您会看到左右两侧都有额外的空间。为了避免这种情况,请将ScaleType设置为ImageView.ScaleType.FIT_END,这将使结果对齐到右侧并解决问题。
vlogo.setScaleType(ImageView.ScaleType.FIT_END);

那对我有用。谢谢你。然而,它似乎仍然在左边有“隐形边距”。宽度保持不变,但图像在其中向右移动。这并不影响我,在多个屏幕上呈现得很好。 - Bart Lizak
1
@BartLizak 是的,因为只有图像对齐到右侧,所以会存在不可见的边距。为了避免这种情况,您需要在将其分配给ImageView之前调整原始位图的大小(Bitmap.createScaledBitmap)。 - blizzard

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接