XML与setImageDrawable / setImageBitmap

时间:2012-06-10 20:40:09

标签: java android android-layout drawable

如果我预加载某些图像,在我的应用程序中是有利的。我在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(...)之前知道图像。预加载版本设置强调后的图像。有什么区别吗?是否可以跳过系统自动缩放或其他事情?

2 个答案:

答案 0 :(得分:4)

我刚刚为此写了一篇文章。希望能够回答你的问题。

https://plus.google.com/112740367348600290235/posts/VNAfFLDcKrw

ImageView有4个API来指定图像。哪一个使用?有什么区别?

  1. setImageDrawable(Drawable drawable)
  2. setImageBitmap(Bitmap bm)
  3. setImageResource(int resId)
  4. setImageURI(URI uri)
  5. 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 / setImageBitmapsetImageDrawable相同。

    总而言之,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);
    }

参考:ImageView.java