Java XML与setImageDrawable/setImageBitmap
在我的应用程序中,如果我预加载某些图像,这是有利的。我在AsyncTask中正确地做到了这一点,正如官方文档中所写的那样。但是我有一个问题,关于什么时候应该设置它们 我将展示代码片段。注意,它被简化了(在我的实际代码中,它们的互操作性更好,它检查空值,等等) 让我们先看看原始(未预加载)版本: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
<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来指定图像。用哪一个?有什么区别
ImageView
,顾名思义,用于显示图像。但什么是图像?Bitmap
是一种图像,不难理解,为此我们使用setImageBitmap
。但是,在内部,ImageView
有一个Drawable
,但没有一个Bitmap
,这就是setImageDrawable
的作用。在内部调用setImageBitmap
时,首先位图将被包装到BitmapDrawable
,即-ADrawable
,然后调用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
实际上具有-aDrawable
,这不一定是位图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>