一、概念区别html
Bitmap - 称做位图,通常位图的文件格式后缀为bmp,固然编码器也有不少如RGB56五、RGB8888。做为一种逐像素的显示对象执行效率高,可是缺点也很明显存储效率低。咱们理解为一种存储对象比较好。java
Drawable - 做为Android平下通用的图形对象,它能够装载经常使用格式的图像,好比GIF、PNG、JPG,固然也支持BMP,固然还提供一些高级的可视化对象,好比渐变、图形等。android
Canvas - 名为画布,咱们能够看做是一种处理过程,使用各类方法来管理Bitmap、GL或者Path路径,同时它能够配合Matrix矩阵类给图像作旋转、缩放等操做,同时Canvas类还提供了裁剪、选取等操做。canvas
Paint - 咱们能够把它看作一个画图工具,好比画笔、画刷。他管理了每一个画图工具的字体、颜色、样式。工具
2、Android读取不一样位置(drawable,asset,SDCard)的图片资源字体
方式一:编码
已将图片保存到drawable目录下,经过图片id得到Drawable或者Bitmap,此方式最经常使用。(若只知道图片的名称,还能够经过图片的名称得到图片的id)spa
(1)经过图片id得到Drawablecode
Drawable drawable=getResource().getDrawable(R.drawable.xxx);orm
(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()));
3、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;
}
4、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;