2015-02-11 78 views
4

我在代码创建ImageView的Android ImageView的缩放confict

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); 

的图像通过它对准TOP和先前创建tv_visitor鉴于BOTTOM(即已经被添加到相对布局)“缩放”。但我认为它尚未放弃(?)。 .requestLayout就在这个代码不会改变一件事情之前。 Picture

通过这样做,我将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); 
+0

什么是您的'tv_visitor视图'和它的'LayoutParams'是什么,你确定原始图像没有任何填充? – blizzard 2015-02-11 21:21:51

+0

它也是用Java创建的。这是一个带有MATCH_PARENT x WRAP_CONTENT的TextView。它放在0x0“锚点”视图的右侧。当然没有填充和边距。我甚至试图在Java中设置它们(使用px2dp公式),但它不能解决它,因为根据屏幕我得到了不同的结果。 – 2015-02-11 21:31:46

+0

这是由'RelativeLayout'中的一个错误引起的,因为它查询它的子对象的默认度量(仅受它自己的大小约束限制),然后强制它自己修改,而不查询给定约束条件的首选维度儿童。作为一种解决方法,您可以将其包装在另一个容器中,该容器应至少允许正确对齐(尽管容器的宽度将保持不变)。对家长的身高进行硬编码也可以解决这个问题。稍后再探讨这个问题后我会添加一个答案。 – corsair992 2015-02-11 21:55:38

回答

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); 
+0

这对我很有用。谢谢。但是,它似乎仍有左边的“隐形边缘”。宽度保持不变,但img向右移动。它不关心我,并在多个屏幕上渲染效果很好。 – 2015-02-11 22:19:46

+1

@BartLizak是的,会有不可见的边距,因为只有图像对齐右侧,Imageview的宽度不会调整大小。为了避免这种情况,您需要在将其分配给ImageView之前调整原始位图('Bitmap.createScaledBitmap')的大小。 – blizzard 2015-02-11 22:38:19