我有CustomStrechView
extends
的自定义视图(名为ImageView
)。这个视图的重点是,我可以在不丢失宽高比的情况下获取图像来填充视图。
现在CustomStrechView
在大多数应用程序中使用它时工作正常,但当我尝试在HorizontalScrollView
中应用它时,图像似乎都消失了。我不确定为什么会这样。我已经尝试删除<HorizontalScrollView />
,当我将图像显示回来时,我觉得有一些属性需要设置,但我似乎无法找到它。
任何人都可以指出我做错了什么或更好的方式让自定义视图在HorizontalScrollView
中工作吗?
修改:
在玩了一下之后,我已经确定只有在我对width
维度进行硬编码时才会显示自定义视图,即:
<com.example.dragdropshapes.CustomStrechView
android:layout_width="200dp"
将高度保留为fill_parent
很好......
代码:
以下是我在xml文件中使用自定义视图的方法:
<!-- Removing this makes the images show up -->
<HorizontalScrollView
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:fillViewport="true"
android:layout_marginTop="50dp">
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:showDividers="middle"
android:orientation="horizontal">
<!-- Changing this to a normal ImageView makes the image show up -->
<com.example.dragdropshapes.CustomStrechView
android:id="@+id/pickshapes"
android:layout_height="fill_parent"
android:layout_width="fill_parent"
android:clickable="true"
android:onClick="pickShapes"
android:background="@drawable/border"
android:src="@drawable/ic_launcher"
/>
<!-- There are 5 other custom ImageViews here -->
</LinearLayout>
</HorizontalScrollView>
以下是自定义视图代码的主要部分:
public class CustomStrechView extends ImageView{
private final Drawable srcPic;
private final String TAG = "strechyTag";
private boolean changeSize = false;
private int Xpx;
private int Ypx;
public CustomStrechView(Context context) {
super(context);
srcPic = this.getDrawable();
}
//... other constructors, not really important...
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec){
Log.d(TAG, "in the onMeasure!!\n");
int width, height;
width = MeasureSpec.getSize(widthMeasureSpec);
height = width * srcPic.getIntrinsicHeight() / srcPic.getIntrinsicWidth();
setMeasuredDimension(width, height);
}
}
答案 0 :(得分:0)
通过一些调试,我能够至少部分解决这个问题。事实证明,从width
调用获得的MeasureSpec.getSize(widthMeasureSpec);
为0.因此,计算以宽度和高度结束为0,setMeasuredDimension
调用将使图像不可见。
现在我说我已经解决了部分,因为我仍然不明白为什么我得到的值是0.我 想想 ,因为在HorizontalScrollView
中宽度未确定(取决于其中的内容),因此MeasureSpec.getSize(widthMeasureSpec);
实际正在做的是与父母交谈,以及正常Linear
或RelativeLayout
中的父级具有已定义的宽度,而HorizontalScrollView
中的父级则没有......但这只是猜测。
所以我为它做了一个修正,如果width
为0,我们通过height
进行计算。 height
需要两个案例来覆盖它以避免除以0错误(else if
和else
集体)。
这是我当前的解决方案,其中包含我在问题中提到的相同xml文件。
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec){
int width = MeasureSpec.getSize(widthMeasureSpec);
int height = MeasureSpec.getSize(heightMeasureSpec);
if(width > 0)
height = width * srcPic.getIntrinsicHeight() / srcPic.getIntrinsicWidth();
else if(srcPic.getIntrinsicWidth() < srcPic.getIntrinsicHeight())
width = height / (srcPic.getIntrinsicHeight() / srcPic.getIntrinsicWidth());
else
width = height / (srcPic.getIntrinsicWidth() / srcPic.getIntrinsicHeight());
setMeasuredDimension(width, height);
}