【问题标题】:Android ImageView scaling conflictAndroid ImageView 缩放冲突
【发布时间】:2015-02-11 20:25:56
【问题描述】:

我正在代码中创建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); 无法正常工作。我应该如何继续?

根据 cmets 的要求,我提供更多信息:

<?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 是什么,你确定原始图像没有任何填充?
  • 它也是用 Java 创建的。这是一个带有 MATCH_PARENT x WRAP_CONTENT 的 TextView。它位于 0x0“锚”视图的右侧。肯定没有填充和边距。我什至尝试在 Java 中设置它们(使用 px2dp 公式),但它并没有解决它,因为我根据屏幕得到不同的结果。
  • 这是由RelativeLayout 中的一个错误引起的,它会查询其子项的默认测量值(仅受其自身的大小约束),然后强制其进行修改,而不查询考虑到孩子的限制,首选尺寸。作为一种解决方法,您可以将其包装在另一个容器中,这至少应该允许正确对齐(尽管容器的宽度将保持不变)。硬编码父母的身高也应该解决这个问题。稍后我会在对此进行更多探索后添加答案。
  • 相关问题:RelativeLayout not properly updating width of custom view。另请参阅关于它的开放错误报告:b.android.com/63673

标签: android imageview android-relativelayout scaling bounds


【解决方案1】:

问题是由于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);

【讨论】:

  • 这对我有用。谢谢你。但是,它的左侧似乎仍然有“隐形边距”。宽度保持不变,但 img 在其中向右移动。它与我无关,并且在多个屏幕上呈现出色。
  • @BartLizak 是的,会有不可见的边距,因为只有图像右对齐,所以 Imageview 的宽度没有调整大小。为避免这种情况,您需要在将原始位图 (Bitmap.createScaledBitmap) 分配给 ImageView 之前调整其大小。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-23
  • 1970-01-01
相关资源
最近更新 更多