Java XML与setImageDrawable/setImageBitmap

Java XML与setImageDrawable/setImageBitmap,java,android,android-layout,drawable,Java,Android,Android Layout,Drawable,在我的应用程序中,如果我预加载某些图像,这是有利的。我在AsyncTask中正确地做到了这一点,正如官方文档中所写的那样。但是我有一个问题,关于什么时候应该设置它们 我将展示代码片段。注意,它被简化了(在我的实际代码中,它们的互操作性更好,它检查空值,等等) 让我们先看看原始(未预加载)版本: <ImageView android:id="@+id/imageViewMyGraphicalImageElement" android:layout_width="fill_pa

在我的应用程序中,如果我预加载某些图像,这是有利的。我在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>
最后,我设置它的地方:

setContentView(R.layout.main);
...
ImageView imageViewMyGraphicalImageElement= (ImageView) findViewById(R.id.imageViewMyGraphicalImageElement);
imageViewMyGraphicalImageElement.setImageBitmap(sBitmap); 
问题:
显然,基于xml的解决方案在调用setContentView(…)之前就知道图像。预加载版本在调用后设置图像。有什么区别吗?因此,是否可以跳过系统执行的某些自动缩放或其他操作?

没有任何区别。您可以考虑所有的<代码> IVIEVIEW 构造函数与<代码> Android:SRC 属性是调用<代码> SETimaGeReSurCE < /C> > 更新:实际上它使用了
setImageDrawable
,这是
ImageView
构造函数获取属性的实际代码:

    Drawable d = a.getDrawable(com.android.internal.R.styleable.ImageView_src);
    if (d != null) {
        setImageDrawable(d);
    }

参考资料:

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

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

  • setImageDrawable(可绘制可绘制)
  • setImageBitmap(位图bm)
  • setImageResource(int resId)
  • setImageURI(URI)
  • ImageView
    ,顾名思义,用于显示图像。但什么是图像?
    Bitmap
    是一种图像,不难理解,为此我们使用
    setImageBitmap
    。但是,在内部,
    ImageView
    有一个
    Drawable
    ,但没有一个
    Bitmap
    ,这就是
    setImageDrawable
    的作用。在内部调用
    setImageBitmap
    时,首先位图将被包装到
    BitmapDrawable
    ,即-A
    Drawable
    ,然后调用
    setImageDrawable

    这是代码

    public void setImageBitmap(Bitmap bm) {
        setImageDrawable(new BitmapDrawable(mContext.getResources(), bm));
    }
    
    那么,3和4 API呢

    您应该已经知道,这些是从文件路径、Uri或资源文件创建位图的多种方法

    BitmapFactory.decodeFile(String pathName)
    BitmapFactory.decodeStream(Inputstream)
    BitmapFactory.decodeResource(Resource res, int id)  
    BitmapFactory.decodeByteArray(byte[] data)
    
    意识到这一点,很容易理解
    setImageResource
    /
    setImageUri
    setImageBitmap
    一样

    总之,
    setImageDrawable
    是其他API所依赖的基本函数。其他3种方法只是帮助器方法,使您编写的代码更少

    此外,必须记住,
    ImageView
    实际上具有-a
    Drawable
    ,这不一定是
    位图Drawable
    !您可以将任何
    Drawable
    设置为图像视图

    除了通过JavaAPI设置
    Drawable
    ,还可以使用XML属性为
    ImageView
    设置源
    Drawable
    。见下面的例子。请注意,形状可以是图像文件(.png、.jpg、.bmp)或xml文件

    <ImageView
        android:layout_width="match_parent"
        android:layout_height="50dip"
        android:src="@drawable/shape"/>
    
    
    
    shape.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>
    
    
    
    我理解,但我的代码中的区别在于ImageView构造函数(即基于XML的解决方案)是在setContentView之前(或期间)调用的。在编程解决方案中,我在setContentView()之后调用setImageDrawable(或setImageBitmap——两者都适用于我)。我知道Android对位图和布局有自动缩放和其他功能,所以我只是想知道,由于最近调用了setImageDrawable/setImageBitmap,哪些功能被跳过了。@Thomas Calc:如果你检查代码,你会看到所有的
    setImage
    变体本身都有自动缩放和其他功能。不会跳过任何功能。@NHAHDH,感谢您清除格式并使其更具可读性!
    <ImageView
        android:layout_width="match_parent"
        android:layout_height="50dip"
        android:src="@drawable/shape"/>
    
    <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>