如果我预加载某些图像,在我的应用程序中是有利的。我在AsyncTask中正确地执行了此操作,因为它是在官方文档中编写的。但是我有一个关于何时应该设置的问题/疑问。
我将展示代码段。请注意,它已经简化了(它们的互操作性在我的实际代码中更好,它会检查空值等)。
让我们先看看原始(非预装)版本:
<ImageView
android:id="@+id/imageViewMyGraphicalImageElement"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:scaleType="centerCrop"
android:src="@drawable/my_graphical_element" >
</ImageView>
预加载版本具有以下XML(请注意缺少src属性):
<ImageView
android:id="@+id/imageViewMyGraphicalImageElement"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:scaleType="centerCrop">
</ImageView>
来自预装代码的片段:
sBitmap = bitmapBitmapFactory.decodeResource(context.getResources(), R.drawable.my_graphical_element, options);
// 'sBitmap' is a Bitmap reference, while 'options' is BitmapFactory.Options
最后,我设置它的地方:
setContentView(R.layout.main);
...
ImageView imageViewMyGraphicalImageElement= (ImageView) findViewById(R.id.imageViewMyGraphicalImageElement);
imageViewMyGraphicalImageElement.setImageBitmap(sBitmap);
问题: 显然,基于xml的解决方案在调用 setContentView(...)之前知道图像。预加载版本设置>强调后的图像。有什么区别吗?是否可以跳过系统自动缩放或其他事情?
答案 0 :(得分:4)
我刚刚为此写了一篇文章。希望能够回答你的问题。
https://plus.google.com/112740367348600290235/posts/VNAfFLDcKrw
ImageView
有4个API来指定图像。哪一个使用?有什么区别?
ImageView
,名称,用于显示图像。但是什么是图像? Bitmap
是一张图片,不难理解,我们会为此目的使用setImageBitmap
。但是,在内部,ImageView
有一个Drawable
但不是Bitmap
,而setImageDrawable
就是setImageBitmap
。当您在内部致电BitmapDrawable
时,首先将位图包装到Drawable
,即IS-A setImageDrawable
,然后调用public void setImageBitmap(Bitmap bm) {
setImageDrawable(new BitmapDrawable(mContext.getResources(), bm));
}
。
这是代码。
BitmapFactory.decodeFile(String pathName)
BitmapFactory.decodeStream(Inputstream)
BitmapFactory.decodeResource(Resource res, int id)
BitmapFactory.decodeByteArray(byte[] data)
那么,3和4 API呢?
您应该已经知道,这些是从文件路径,Uri或资源文件创建位图的一系列方法。
setImageResource
意识到这一点,很容易理解setImageUri
/ setImageBitmap
与setImageDrawable
相同。
总而言之,ImageView
是其他API所依赖的原始函数。其他3个只是辅助方法,可以减少代码编写。
此外,请务必注意Drawable
实际上有一个BitmapDrawable
,这不一定是Drawable
!您可以将任何Drawable
设置为图像视图。
除了通过Java API设置Drawable
之外,您还可以使用XML归因来为ImageView
设置源<ImageView
android:layout_width="match_parent"
android:layout_height="50dip"
android:src="@drawable/shape"/>
。见下面的例子。请注意,形状可以是图像文件(.png,.jpg,.bmp)或xml文件。
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle">
<gradient android:startColor="#FFFF0000" android:endColor="#80FF00FF" android:angle="270"/>
<padding android:left="7dp" android:top="7dp android:right="7dp" android:bottom="7dp" />
<corners android:radius="8dp" />
</shape>
shape.xml
{{1}}
答案 1 :(得分:3)
完全没有区别。您可以认为ImageView
构造函数对android:src
属性的所有操作都是调用setImageResource
。
更新:实际上它使用setImageDrawable
,这是ImageView
构造函数获取属性的实际代码:
Drawable d = a.getDrawable(com.android.internal.R.styleable.ImageView_src);
if (d != null) {
setImageDrawable(d);
}