比如Drawable中有一系列连续的图片,img_0.png, img_1.png, img_2.png ...
如果要动态获取这些图片,通过"R.drawable.img_x"的ID方式指定是不行的,因为这个ID无法动态变化,即你是无法通过字符串拼接的方法来实现的。

但可以通过下面方式获取:

String imgname = "img_" + idx;
int imgid = getResources().getIdentifier(imgname, "drawable", "com.vtion.sleb.activities");
EditText.setBackgroundResource(imgid);

根据传递的idx的值不同,就可以动态的获取img_x所对应名称的图片资源了。

参数:imgname:为drawable文件夹中图片的名称--不包括后缀.png   .jpg 等。

其中"com.vtion.sleb.activities"指的是你的package name,就是Java文件最开始一行的那个。

一、概念区别

Bitmap - 称作位图,一般位图的文件格式后缀为bmp,当然编码器也有很多如RGB565、RGB8888。作为一种逐像素的显示对象执行效率高,但是缺点也很明显存储效率低。我们理解为一种存储对象比较好。

Drawable - 作为Android平下通用的图形对象,它可以装载常用格式的图像,比如GIF、PNG、JPG,当然也支持BMP,当然还提供一些高级的可视化对象,比如渐变、图形等。

Canvas - 名为画布,我们可以看作是一种处理过程,使用各种方法来管理Bitmap、GL或者Path路径,同时它可以配合Matrix矩阵类给图像做旋转、缩放等操作,同时Canvas类还提供了裁剪、选取等操作。

Paint - 我们可以把它看做一个画图工具,比如画笔、画刷。他管理了每个画图工具的字体、颜色、样式。

二、Android读取不同位置(drawable,asset,SDCard)的图片资源

方式一:

已将图片保存到drawable目录下,通过图片id获得Drawable或者Bitmap,此方式最常用。(若只知道图片的名称,还可以通过图片的名称获得图片的id)

(1)通过图片id获得Drawable

Drawable drawable=getResource().getDrawable(R.drawable.xxx);

(2)通过图片id获得Bitmap

Resource res=gerResource();

Bitmap bitmap=BitmapFactory.decodeResource(res, id);

(3)通过图片的名称获得图片的id(两种方法)

int id =res.getIdentifier(name, defType, defPackage); //name:图片的名,defType:资源类型(drawable,string。。。),defPackage:工程的包名

Drawable drawable=getResource().getDrawable(id);

方式二:

已将图片保存到assest目录下,知道图片的名称,通过inputstream获得图片Drawabl

或者 Bitmap

AssetManager asm=getAssetMg();

InputStream is=asm.open(name);//name:图片的名称

(1)获得Drawable

Drawable da = Drawable.createFromStream(is, null);

(2)获得Bitmap

Bitmap bitmap=BitmapFactory.decodeStream(is);

方式三: 图片保存在sdcard,通过图片的路径h

/图片路径

String imgFilePath = Environment.getExternalStorageDirectory().toString()

+ “/DCIM/device.png”;

(1)文件输入流

fis = new FileInputStream(new File(imgFilePath));//文件输入流

Bitmap bmp = BitmapFactory.decodeStream(fis);

(2)

ImageView iv = (ImageView) findViewById(R.id.image);

Bitmap bit = BitmapFactory.decodeFile("/sdcard/android.bmp");

iv.setImageBitmap(bit);

iv.setImageDrawable(Drawable.createFromPath(new File(Environment.getExternalStorageDirectory(), "camera.jpg").getAbsolutePath()));

三、Drawable、Bitmap、byte[]之间的转换

1)      Drawble转Bitmap

public static Bitmap drawableToBitmap(Drawable drawable) {

Bitmap bitmap = Bitmap

.createBitmap(

drawable.getIntrinsicWidth(),

drawable.getIntrinsicHeight(),

drawable.getOpacity() != PixelFormat.OPAQUE ? Bitmap.Config.ARGB_8888

: Bitmap.Config.RGB_565);

Canvas canvas = new Canvas(bitmap);

//canvas.setBitmap(bitmap);

drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());

drawable.draw(canvas);

return bitmap;

}

2) 从资源中获取Bitmap

Resources res=getResources();

Bitmap bmp=BitmapFactory.decodeResource(res, R.drawable.pic);

3) Bitmap → byte[]

private byte[] Bitmap2Bytes(Bitmap bm){

ByteArrayOutputStream baos = new ByteArrayOutputStream();

bm.compress(Bitmap.CompressFormat.PNG, 100, baos);

return baos.toByteArray();

}

4) byte[] → Bitmap

private Bitmap Bytes2Bimap(byte[] b){

if(b.length!=0){

return BitmapFactory.decodeByteArray(b, 0, b.length);

}

else {

return null;

}

}

//将assets文件中资源取出,并将图片从bitmap转换成drawable格式

public static Drawable getDrawableFromAssetFile(Context context,String fileName){

Bitmap image = null;

BitmapDrawable drawable=null;

try{

AssetManager am = context.getAssets();

InputStream is = am.open(fileName);

image = BitmapFactory.decodeStream(is);

drawable= new BitmapDrawable(context.getResources(), image);

is.close();

}catch(Exception e){

}

return drawable;

}

四、APK程序里的drawable—hdpi、drawable—mdpi、drawable—ldpi详解

自己DIY过APK程序的达人们肯定会对于android中放置图片的地方drawable—hdpi、drawable—mdpi、drawable—ldpi这三个感到好奇。肯定心里会想,放在哪一个都行,只要是在android中的res目录下的drawable中就行,系统会自己找到。有心的朋友肯定会他把弄个究竟。我以前对drawable—hdpi、drawable—mdpi、drawable—ldpi这三个也了解了一下,但是只是字面上的,没有真正理解透彻,到今天我才算有稍深点的理解。drawable—hdpi看他的单词名肯定知道他是放置高分辨率的图片,drawable—mdpi放置中等分辨率的图片,drawable—ldpi放置低分辨率的图片。大部分人都把的图片放在drawable—mdpi中。起初我认为随便将图片放置在三个当中的任意一个都行,但是今天我知道了。在分辨率低于480*800时把图片放在drawable—mdpi中是不会有什么影响,但是当分辨率为420*800或高于它时就会出问题了。你的手机屏幕有那么大但是他会将图片拉伸,当加载图片后让你感觉该屏幕没有实际的大小,而如果将图片放到drawable—hdpi中则该问题就不会存在了。比如手机屏幕的大小为420*800如果你将图片放在drawable—mdpi中,那么你就要准备一张340*525分辨率的图片,今天我就遇到了,很是让我郁闷当时我还以为屏幕有误差,查阅其他代码后才发现自己把图片放错了位置。

1)不同的layout

Android手机屏幕大小不一,有480×320, 640×360, 800×480.怎样才能让App自动适应不同的屏幕呢?

其实很简单,只需要在res目录下创建不同的layout文件夹,比如layout-640×360,layout-800×480,所有的layout文件在编译之后都会写入R.java里,而系统会根据屏幕的大小自己选择合适的layout进行使用。

2)hdpi、mdpi、ldpi

在之前的版本中,只有一个drawable,而2.1版本中有drawable-mdpi、drawable-ldpi、drawable-hdpi三个,这三个主要是为了支持多分辨率。

drawable- hdpi、drawable- mdpi、drawable-ldpi的区别:

(1)drawable-hdpi里面存放高分辨率的图片,如WVGA (480×800),FWVGA (480×854)

(2)drawable-mdpi里面存放中等分辨率的图片,如HVGA (320×480)

(3)drawable-ldpi里面存放低分辨率的图片,如QVGA (240×320)

系统会根据机器的分辨率来分别到这几个文件夹里面去找对应的图片。

在开发程序时为了兼容不同平台不同屏幕,建议各自文件夹根据需求均存放不同版本图片。

3)横屏竖屏

以下步骤是网上流传的,不过我自己之前是通过图形化界面实现这个配置,算是殊途同归,有空我会把图片贴上来。

还要说明一点:每个activity都有这个属性screenOrientation,每个activity都需要设置,可以设置为竖屏(portrait),也可以设置为无重力感应(nosensor)。

要让程序界面保持一个方向,不随手机方向转动而变化的处理办法:

在AndroidManifest.xml里面配置一下就可以了。加入这一行android:screenOrientation=”landscape”。

例如(landscape是横向,portrait是纵向):

对于Android游戏开发我们不得不像iPhone那样思考兼容 Android平板电脑,对于苹果要考虑iPad、iPhone 3GS和iPhone 4等屏幕之间的兼容性,对于几乎所有的分辨率总结了大约超过20中粉笔阿女郎的大小和对应关系,对于开发Android游戏而言可以考虑到未来的3.0以及很多平板电脑的需要。

常规的我们可能只考虑QVGA,HVGA,WVGA,FWVGA和DVGA,但是抛去了手机不谈,可能平板使用类似WSVGA的1024×576以及WXGA的1280×768等等。

QVGA = 320 * 240;

WQVGA = 320 * 480;

WQVGA2 = 400 * 240;

WQVGA3 = 432 * 240;

HVGA = 480 * 320;

VGA = 640 * 480;

WVGA = 800 * 480;

WVGA2 = 768 * 480;

FWVGA = 854 * 480;

DVGA = 960 * 640;

PAL = 576 * 520;

NTSC = 486 * 440;

SVGA = 800 * 600;

package com.vtion.sleb.banca.utils;

import java.io.ByteArrayOutputStream;
import java.io.InputStream; import android.content.Context;
import android.content.res.AssetManager;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.PixelFormat;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable; public class BitmapUtil { /**
* Drawble转Bitmap
* @param drawable
* @return
*/
public static Bitmap drawableToBitmap(Drawable drawable) {
Bitmap bitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight(), drawable.getOpacity() != PixelFormat.OPAQUE ? Bitmap.Config.ARGB_8888 : Bitmap.Config.RGB_565);
Canvas canvas = new Canvas(bitmap);
// canvas.setBitmap(bitmap);
drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());
drawable.draw(canvas);
return bitmap;
} /**
* 从资源中获取Bitmap
* @param context 上下文
* @param id Drawable的id R.id.xxx
* @return
*/
public static Bitmap getBitmapFromRes(Context context, int id) {
Resources res = context.getResources();
Bitmap bmp = BitmapFactory.decodeResource(res, id);
return bmp; } /**
* Bitmap → byte[]
* @param bm
* @return
*/
private byte[] Bitmap2Bytes(Bitmap bm) {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
bm.compress(Bitmap.CompressFormat.PNG, 100, baos);
return baos.toByteArray();
} /**
* byte[] → Bitmap
* @param b
* @return
*/
private Bitmap Bytes2Bimap(byte[] b) {
if (b.length != 0) {
return BitmapFactory.decodeByteArray(b, 0, b.length);
} else {
return null;
}
} /**
* 将assets文件中资源取出,并将图片从bitmap转换成drawable格式
* @param context
* @param fileName
* @return
*/
public static Drawable getDrawableFromAssetFile(Context context, String fileName) {
Bitmap image = null;
BitmapDrawable drawable = null;
try {
AssetManager am = context.getAssets();
InputStream is = am.open(fileName);
image = BitmapFactory.decodeStream(is);
drawable = new BitmapDrawable(context.getResources(), image);
is.close();
} catch (Exception e) {
}
return drawable;
}
}

Android中 Bitmap Drawable Paint的获取、转换以及使用的更多相关文章

  1. Android中Bitmap, Drawable, Byte,ID之间的转化

    Android中Bitmap, Drawable, Byte,ID之间的转化 1.  Bitmap 转化为 byte ByteArrayOutputStream out = new ByteArray ...

  2. Android中Bitmap, Drawable, Byte之间的转化

    1.  Bitmap 转化为 byte ByteArrayOutputStream out = new ByteArrayOutputStream(); bitmap.compress(Bitmap. ...

  3. Android中的Drawable和动画

    Android中Drawable是一种可以在Canvas上进行绘制抽象的概念,种类很多,常见的颜色和图片都可以是一个Drawable.Drawable有很多种,它们表示一种图像的概念,但是它们又不全是 ...

  4. Android中各种Drawable总结

    在Android中,Drawable使用广泛,但是种类也多,基于<Android开发艺术探索>中对Drawable的讲解,总结了如下表格.

  5. android中Bitmap的放大和缩小的方法

    android中Bitmap的放大和缩小的方法 时间 2013-06-20 19:02:34  CSDN博客原文  http://blog.csdn.net/ada168855/article/det ...

  6. Android中Bitmap、Drawable、byte[]转换

    public byte[] getBitmapByte(Bitmap bitmap){ ByteArrayOutputStream out = new ByteArrayOutputStream(); ...

  7. Android中Bitmap,byte[],Drawable相互转化

    一.相关概念 1.Drawable就是一个可画的对象,其可能是一张位图(BitmapDrawable),也可能是一个图形(ShapeDrawable),还有可能是一个图层(LayerDrawable) ...

  8. 【Android】[转] Android中Bitmap,byte[],Drawable相互转化

    一.相关概念 1.Drawable就是一个可画的对象,其可能是一张位图(BitmapDrawable),也可能是一个图形(ShapeDrawable),还有可能是一个图层(LayerDrawable) ...

  9. Android中Bitmap和Drawable

    一.相关概念 1.Drawable就是一个可画的对象,其可能是一张位图(BitmapDrawable),也可能是一个图形(ShapeDrawable),还有可能是一个图层(LayerDrawable) ...

随机推荐

  1. (Problem 7)10001st prime

    By listing the first six prime numbers: 2, 3, 5, 7, 11, and 13, we can see that the 6th prime is 13. ...

  2. LOVEU

    闲来无事,自己编写一个小程序,自娱自乐 //date: 2013/8/14 //designer :pengxiaoen //function : printf the word love #incl ...

  3. JavaScript:获取系统当前时间,构造格式化的字符串

    var getNowFormatDate = function() {    var date = new Date();    var seperator1 = "-";    ...

  4. svn修改log信息

    在linux下安装了SVN服务器来做版本控制. 有天提交文件忘记了填写SVN提交日志,于是在项目中使用右键,show log,找到我提交的无日志的那条记录,点击右健,选择了“Edit log mess ...

  5. 由于物化视图定义为on commit导致update更新基表慢的解决方案

    由于物化视图定义为on commit导致update更新基表慢的解决方案 以下是模拟和解决测试过程: (模拟update慢的过程) 1.首先基于基表创建物化视图日志: create materiali ...

  6. 变相的取消Datagridview控件的选中状态

    思路:把每一列的文字颜色设为黑色,选中时候的背景为白色,颜色为黑色.每一列都这样设置,那么变相的达到了取消选中效果. 图:

  7. BZOJ 1260: [CQOI2007]涂色paint( 区间dp )

    区间dp.. dp( l , r ) 表示让 [ l , r ] 这个区间都变成目标颜色的最少涂色次数. 考虑转移 : l == r 则 dp( l , r ) = 1 ( 显然 ) s[ l ] = ...

  8. JVM调优总结(八)-典型配置举例2

    常见配置汇总 堆设置 -Xms:初始堆大小 -Xmx:最大堆大小 -XX:NewSize=n:设置年轻代大小 -XX:NewRatio=n:设置年轻代和年老代的比值.如:为3,表示年轻代与年老代比值为 ...

  9. mysql服务无法启动

    可能是没有data文件夹,可以新建或拷贝以前的data文件夹到安装目录.

  10. aix网络管理

    lsdev -Cc adapter | grep ent 列出网卡 lsdev -Cc adapter 或者lscfg | grep -i adpter   显示已经安装的网卡 lsdev -Cc i ...