Android BitmapDrawable()的使用

查看源码BitmapDrawable.java。BitmapDrawable有若干个构造方法。

New BitmapDrawable(Bitmap bitmap)是早期的一个构造方法,在android 4.0已经过时,部分代码如下:

this(new BitmapState(bitmap), null);

而google提倡使用new BitmapDrawable(Bitmap bitmap,Resources res),其部分代码如下:

this(new BitmapState(bitmap), res);

可见以上两个方法均调用了一个私有的方法: BitmapDrawable(BitmapState state, Resources res),不同的是前者传入一个Resources的NULL值,后者传入了一个非NULL值。在BitmapDrawable(BitmapState
state, Resources res)方法中部分代码如下:

if (res != null) {

mTargetDensity = res.getDisplayMetrics().densityDpi;// BitmapDrawable(Bitmap,Resources )  go here

} else {

mTargetDensity = state.mTargetDensity; // BitmapDrawable(Bitmap) go here

}

看来当前BitmapDrawable是保存一个目标密度,这个密度如果传入了Resources对象,会根据Resources确定一个正确的密度(S4为480)。否则会采用BitmapState的目标密度,而它的目标密度会有一个默认值:

int mTargetDensity = DisplayMetrics.DENSITY_DEFAULT;

再查看DisplayMetrics.java源码,有如下定义:

public static final int DENSITY_DEFAULT = DENSITY_MEDIUM;//这个值为240

总上所述,在S4 ,new BitmapDrawable(Bitmap)得到了一个240的目标密度。而new BitmapDrawable(Bitmap bitmap,Resources res)得到一个480的目标密度。当计算Bitmap的宽高有:

mBitmapWidth = mBitmap.getScaledWidth(mTargetDensity);

mBitmapHeight = mBitmap.getScaledHeight(mTargetDensity);

总结,因为两个构造方法参数不同,得到两个不同的宽高值,于是在绘制中就出现界面异常。(具体为什么算出来的Width和height差异很大还需要继续调查,有兴趣的可以再查查)

时间: 2024-10-08 20:58:41

Android BitmapDrawable()的使用的相关文章

Android BitmapDrawable

功能:显示缩略图,大小为40*40 //通过openRawResource获取一个inputStream对象 InputStream inputStream = getResources().openRawResource(R.drawable.test); //通过一个InputStream创建一个BitmapDrawable对象 BitmapDrawable drawable = new BitmapDrawable(inputStream); //通过BitmapDrawable对象获得B

Android的Bitmap和BitmapDrawable类解析-android学习之旅(六十)

使用简单图片 使用Drawable对象 bitmap和BitmapDrawable对象 package peng.liu.test; import android.app.Activity; import android.content.res.AssetFileDescriptor; import android.content.res.AssetManager; import android.graphics.BitmapFactory; import android.graphics.dr

Android Bitmap、BitmapDrawable、Stream转换整合

package com.soai.imdemo; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.InputStream; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.grap

Android中的WeakReference 弱引用

WeakReference 弱引用 定义:弱引用,与强引用(我们常见的引用方式)相对:特点是:GC在回收时会忽略掉弱引用对象(忽略掉这种引用关系),即:就算弱引用指向了某个对象,但只要该对象没有被强引用指向,该对象也会被GC检查时回收掉. 强引用实例自然不会被GC回收! 如何引出弱引用?弱引用的实际用途是什么? 什么是内存泄漏?Java使用有向图机制,通过GC自动检查内存中的对象:如果GC发现一个或一组对象为不可达的状态,则将该对象从内存中回收.也就是说:一个对象不被任何引用所指向,则该对象会在

Android 解决图片大量下载:软引用必须懂4点

Android 解决图片大量下载:软引用必须懂4点 可能对于Android开发者来说,软引用这个词有的会不是很熟悉,软引用在Java开发中用的比较多,但是,在Android开发中引用软引用,会给我们解决很多难题. AD: 1.对象的强.软.弱和虚引用 为了能更加灵活控制对象的生命周期,需要知道对象引用的4中级别,由高到低依次为 :强引用.软引用.弱引用和虚引用 备注: 这四种的区别: ⑴强引用(StrongReference) 强引用是使用最普遍的引用.如果一个对象具有强引用,那垃圾回收器绝不会

android 集成系统分享和第三方分享案例

现在很多的应用基本都会集成分享这个功能,该功能包括系统分享(比如邮件,短信)和第三方分享(比如QQ和微信).其中有些公司会选择使用第三方的库来简化这些操作,加快开发,用的比较多的比如友盟社会化分享SDK,缺点就是自由度太低,因为可能你仅仅只是需要QQ和微信,其他的公司就会选择自己导入所需要的第三方SDK来自定义分享功能,自由度高,于是这篇博客主要来介绍后一种自定义分享功能的案例demo,下图是demo的运行效果: 具体分析一下源码,由于分享的内容根据需求的不同而不同,为了简单起见,我们就以最常用

Android基础入门教程——8.1.2 Android中的13种Drawable小结 Part 2

Android基础入门教程--8.1.2 Android中的13种Drawable小结 Part 2 标签(空格分隔): Android基础入门教程 本节引言: 本节我们继续来学习Android中的Drawable资源,上一节我们学习了: ColorDrawable:NinePatchDrawable: ShapeDrawable:GradientDrawable!这四个Drawable~ 而本节我们继续来学习接下来的五个Drawable,他们分别是: BitmapDrawable:Insert

Android内存那点事儿

好久没有写了,不是忘了,也不是懒,是因为迷茫了~~不知道该学什么,该写什么,该走什么样子的路,该做什么样子的人.我嘴笨,不知道怎么把自己会的讲给别人,我愿意分享,所以我就写出来,不管是对的,错的,希望大家能取其精华去其糟粕,不要因为我而误导诸位.废话不多说了~~ 你的应用内存泄漏了么? 要看是不是存在内存泄漏,首先我们要看到内存信息,如何看到内存信息呢?这里介绍一种方法,打开Eclipse连接手机,到DDMS中,选择要分析的应用,点击Update Heap也就是下图中1的图标,点击1图标之后会在

android 解决 多品牌手机拍照问题,尤其是小米手机

先上个图吧 .点击头像弹出下面对话框,然后直接上代码. 头像是自定义控件实现的圆形头像,当然就目前而言 想要实现 圆形头像的资料太多了,随便找个就行 <com.kuibu.jucai.widget.CircleImageView style="@style/UserFaceImageStyle" app:border_color="@color/white" app:border_width="2dip" android:id="