在使用TextView的android:drawableLeft或者android:drawableRight属性的时候,突然想到一个问题:同样的图片在不同分辨率的机器上所占的空间是一样的吗?
出乎意料,居然一样!说明不同的像素密度的机器上图片的像素是不一样的。遂看源码,过程比较啰嗦。直接贴出结论吧。
一般使用的都是BitmapDrawable,其尺寸由getIntrinsicWidth和getIntrinsicHeight给出。以IntrinsicWidth为例,它的计算公式为
1、 ((size * tdensity) + (sdensity >> 1)) / sdensity
size代表bitmap的width ,tdensity表示目标像素密度,sdensity 是机器像素密度,放在res文件夹下的图片都是tdensity=sdensity。也就是说同样的图片在不同像素密度的情况下size是不一样的,这是因为Resources在解释图片的时候做了转换(具体看源码):
2、 size = width * sdensity/indensity
width为图片的真实的宽度,indensity由图片所在的文件夹决定(例如在drawable-mdpi下的 indensity=160)。
举个例子,图片a的真实像素为48*48,假如a放在drawable-hdpi下,在像素密度为240的机器中生成的BitmapDrawable的IntrinsicWidth和IntrinsicHeight为48*48;在像素密度320的机器中为72*72,在像素密度160的机器中为32*32。在屏幕上占的空间都一样为24dp * 24dp。
对于不在res资源文件夹下的图片,生成的Bitmap像素跟原图片的像素一样;但是通过此Bitmap生成的
BitmapDrawable,如果没有指定Resources的话tdensity默认为160(具体rom可能有偏差);由公式1得出的IntrinsicWidth和IntrinsicHeight不一定和图片原本的像素一致。
相关推荐
在Android应用开发中,用户经常需要选择或拍摄照片并进行裁剪,以便适应特定的显示需求,例如设置头像。...通过学习和理解这个Demo,开发者可以更好地处理与图片相关的任务,为用户提供更优质的服务。
bitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight(), Bitmap.Config.ARGB_8888); } Canvas canvas = new Canvas(bitmap); drawable.setBounds(0, 0, canvas.getWidth()...
bitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight(), Bitmap.Config.ARGB_8888); } Canvas canvas = new Canvas(bitmap); drawable.setBounds(0, 0, canvas.getWidth()...
bitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight(), Bitmap.Config.ARGB_8888); } Canvas canvas = new Canvas(bitmap); drawable.setBounds(0, 0, canvas.getWidth()...
bitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight(), Bitmap.Config.ARGB_8888); } Canvas canvas = new Canvas(bitmap); drawable.setBounds(0, 0, canvas.getWidth...
Bitmap bitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight(), Bitmap.Config.ARGB_8888); Canvas canvas = new Canvas(bitmap); drawable.setBounds(0, 0, canvas....
Android UI是Android应用程序开发中的重要组成部分,涉及...理解并熟练掌握这些基本操作,对于优化应用程序的性能和用户体验至关重要。同时,资源的有效管理和使用,以及对高级UI特效的实现,也是提升应用品质的关键。
bitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight(), Bitmap.Config.ARGB_8888); Canvas canvas = new Canvas(bitmap); drawable.setBounds(0, 0, canvas.getWidth(), ...
drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight()); overlay.add(drawable); ``` 在上面的代码中,我们首先获取了`View`的`Overlay`实例,然后创建了一个`BitmapDrawable`并...
bitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight(), Bitmap.Config.ARGB_8888); } Canvas canvas = new Canvas(bitmap); drawable.setBounds(0, 0, canvas.getWidth()...
Bitmap bitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight(), Bitmap.Config.ARGB_8888); Canvas canvas = new Canvas(bitmap); drawable.setBounds(0, 0, canvas....
`Bitmap`则是一种具体的图像格式,它表示一个像素矩阵,可以理解为一张像素图片。`Bitmap`主要用于存储和显示图像数据,比如加载图片到ImageView控件中显示。由于`Bitmap`直接存储像素数据,因此它在显示速度和图像...
bitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight(), Bitmap.Config.ARGB_8888); } Canvas canvas = new Canvas(bitmap); drawable.setBounds(0, 0, canvas.getWidth()...
drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight()); drawable.draw(canvas); return bitmap; } ``` 这个方法首先检查Drawable是否已经是BitmapDrawable,如果是,则直接...
d.setBounds(0, 0, d.getIntrinsicWidth(), d.getIntrinsicHeight()); drawable = d; textView.invalidate(); } @Override public void onBitmapFailed(Exception e, Drawable errorDrawable) {} @Override...
matrix.setRotate(rotationDegrees, imageView.getDrawable().getIntrinsicWidth() / 2, imageView.getDrawable().getIntrinsicHeight() / 2); Bitmap bitmap = ((BitmapDrawable) imageView.getDrawable())....
drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight()); return drawable; } ``` 通过这种方式,我们可以确保图片在TextView中按照其原始比例缩放,同时适应TextView的宽度。...
bitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight(), Bitmap.Config.ARGB_8888); } Canvas canvas = new Canvas(bitmap); drawable.setBounds(0, 0, canvas.getWidth()...
bitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight(), Bitmap.Config.ARGB_8888); } Canvas canvas = new Canvas(bitmap); drawable.setBounds(0, 0, canvas.getWidth()...
Bitmap bitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight(), Bitmap.Config.ARGB_8888); Canvas canvas = new Canvas(bitmap); drawable.setBounds(0, 0, canvas....