android学习日记09--BitMap操作
Bitmap
android里的图像处理重要的类,支持jpg、png、bmp等格式的图像,BitmapDrawable是封装Bitmap的一个对象,
Bitmap实现在android.graphics包中。但是Bitmap类的构造函数是私有的,外面并不能实例化,只能是通过JNI(Java Native Interface JAVA本地调用)实例化。这必然是 某个辅助类提供了创建Bitmap的接口,而这个类的实现通过JNI接口来实例化Bitmap的,这个类就是BitmapFactory。利用BitmapFactory可以从一个指定文件中,利用decodeFile()解出Bitmap;也可以定义的图片资源中,利用decodeResource()解出Bitmap
android支持一些方法对图像的平移、剪切、旋转、缩放等操作这样子可以用一张图片经过变化得到自己想要的,节省很多系统资源。
由于手机系统资源有限,没用的图像要及时回收,否则会产生OOM,isRecycled()判读该Bitmap是否可回收,recycle()强制Bitmap自我回收。
1、android 系统图像的简单变化例子:
// 获取图标图像的实例
Bitmap bitmap = BitmapFactory.decodeResource(this.getResources()
, R.drawable.ic_launcher);
// 绘制图像
canvas.drawBitmap(bitmap, 0, 0, paint);
// 保存当前状态
canvas.save(); // 绕图像中点旋转90度
canvas.rotate(30, bitmap.getWidth()/2, bitmap.getHeight()/2);
// 为了不重叠,画在(50,0)这点,x,y轴相对旋转也发生变化
canvas.drawBitmap(bitmap, 50, 0, paint); //恢复上次保存的状态与save()对应
canvas.restore();
canvas.drawBitmap(bitmap, 100, 100, paint); //平移
canvas.translate(0, 50);
canvas.drawBitmap(bitmap, 100, 100, paint); // 缩放,参数分别表示:x轴缩放2倍,y轴缩放2倍,3,4参数表示缩放的起始点
canvas.scale(2, 2, 50+bitmap.getWidth()/2, 50+bitmap.getHeight()/2);
canvas.drawBitmap(bitmap, 100, 100, paint); // 相对y轴镜像
canvas.scale(1, -1, 50+bitmap.getWidth()/2, 50+bitmap.getHeight()/2);
canvas.drawBitmap(bitmap, 100, 100, paint);
效果如下:

2、png格式和其他图像格式的区别是,png图像支持背景是透明的,
可以多个图像叠加在一起,而其他格式的图片就会被旁白覆盖
//绘制一张背景图片,充满整个屏幕
Bitmap bitmap1 = BitmapFactory.decodeResource(this.getResources()
, R.drawable.background);
canvas.drawBitmap(bitmap1, 0, 0, paint); // png的图片,左边螃蟹边缘是透明的,因此不会有问题
Bitmap bitmap2 = BitmapFactory.decodeResource(this.getResources()
, R.drawable.crab);
canvas.drawBitmap(bitmap2, 20, 200, paint); // jpg的图片,右边螃蟹边缘把背景遮挡了
Bitmap bitmap3 = BitmapFactory.decodeResource(this.getResources()
, R.drawable.carb2);
canvas.drawBitmap(bitmap3, 200, 230, paint);
效果图如下:

左边的螃蟹图片是png格式的,右边则是jpg格式的,明显右边螃蟹还留有矩形的空白。
3、Bitmap通过均匀改变draw的横纵坐标或者切换图片就会呈现动画的效果,

上图是一张波浪的图片
canvas.drawBitmap(bmp, x, y, new Paint());
新建个线程:x+=1,就可以看到海水在动。










上面则是9张卡通鱼的图片,分别命名fish0~fish9,通过来回不断切换图片,就会看到鱼儿在游动
运行效果(由于博主不会录制gif图片,囧!就截2张图,读者自己脑补吧):


SurfaceView主要代码:
public MySurfaceView(Context context) {
super(context);
// TODO Auto-generated constructor stub
sfh = this.getHolder();
sfh.addCallback(this);
paint = new Paint();
paint.setColor(Color.WHITE);
paint.setAntiAlias(true);
setFocusable(true);
for (int i = 0; i < fishBmp.length; i++) {
fishBmp[i] = BitmapFactory.decodeResource(this.getResources(), R.drawable.fish0 + i);
}
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
// TODO Auto-generated method stub
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
// TODO Auto-generated method stub
bmp = BitmapFactory.decodeResource(this.getResources(), R.drawable.water);
x = -bmp.getWidth() + this.getWidth();
//Log.v("chendd", "bmp:"+bmp.getWidth() );
//Log.v("chendd", "this:"+this.getWidth() );
y = this.getHeight() - bmp.getHeight();
flag = true;
//实例线程
th = new Thread(this);
//启动线程
th.start();
//Mydraw();
}
private void Mydraw() {
// TODO Auto-generated method stub
try {
canvas = sfh.lockCanvas();
if (canvas != null) {
canvas.drawColor(Color.WHITE);
canvas.drawBitmap(bmp, x, y, new Paint());
canvas.drawBitmap(fishBmp[currentFrame], this.getWidth()/2, this.getHeight()-60, paint);
}
} catch (Exception e) {
// TODO: handle exception
} finally {
if (canvas != null)
sfh.unlockCanvasAndPost(canvas);
}
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
// TODO Auto-generated method stub
}
@Override
public boolean onTouchEvent(MotionEvent event) {
// TODO Auto-generated method stub
Mydraw();
return true;
}
@Override
public void run() {
// TODO Auto-generated method stub
while (flag) {
long start = System.currentTimeMillis();
Mydraw();
logic();
long end = System.currentTimeMillis();
try {
if (end - start < 10) {
Thread.sleep(10 - (end - start));
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
private void logic() {
// TODO Auto-generated method stub
//Log.v("chendd", "x:"+x );
if(x == (-bmp.getWidth()/2 + this.getWidth())){
x = -bmp.getWidth() + this.getWidth();
}else {
x+=1;
}
currentFrame++;
if (currentFrame >= fishBmp.length) {
currentFrame = 0;
}
}
android学习日记09--BitMap操作的更多相关文章
- android学习日记05--Activity间的跳转Intent实现
Activity间的跳转 Android中的Activity就是Android应用与用户的接口,所以了解Activity间的跳转还是必要的.在 Android 中,不同的 Activity 实例可能运 ...
- android学习日记03--常用控件Dialog
常用控件 9.Dialog 我们经常会需要在Android界面上弹出一些对话框,比如询问用户或者让用户选择.这些功能我们叫它Android Dialog对话框 对话框,要创建对话框之前首先要创建Bui ...
- android学习日记03--常用控件checkbox/radiobutton
常用控件3.checkbox 复选框,确定是否勾选,点击一下勾选,点击第二下取消,当有一系列备选项时适合用checkbox控件,方便用户提交数据. 贴上例子Activity的java代码 packag ...
- android学习日记03--常用控件button/imagebutton
常用控件 控件是对数据和方法的封装.控件可以有自己的属性和方法.属性是控件数据的简单访问者.方法则是控件的一些简单而可见的功能.所有控件都是继承View类 介绍android原生提供几种常用的控件bu ...
- android学习日记02--Activity简介
一.Activity活动 学习Android,第一个都会接触Activity滴,Activity表示一个用户界面,是Android应用程序的入口,可以同时有多个界面,但只会显示栈顶的界面. Activ ...
- Android学习之位图BitMap
BitMap代表一张位图,扩展名可以是.bmp或者.dib.位图是Windows标准格式图形文件,它将图像定义为由点(像素)组成,每个点可以由多种色彩表示,包括2.4.8.16.24和32位色彩.例如 ...
- Android学习一:文件操作
最近在学习安卓相关的编程,对于一门新技术的学习,我想应该跟其他语言一样吧,如C++和C#,也是文件,网络,多线程以及数据库之类的学习了.所以决定先从文件下手,现在将文件的一点学习列在下面: 1.Jav ...
- android学习日记20--连接组件之Intent和IntentFilter
上次刚了解完Android的四大组件,现在学习组件间通信的Intent和IntentFilter 一.Intent 1.简述 Intent(意图)在应用程序运行时连接两个不同组件,是一种运行时的绑定机 ...
- android学习日记0--开发需要掌握的技能
一.开发android,我们需要哪些技能基础 1.Java基础知识 2.Linux基础知识 3.数据库基础知识 4.网络协议 5.Android基础知识 6.服务器端开发知识 1.Java基础知识 很 ...
随机推荐
- WVGA-维基百科
WVGA是一种屏幕分辨率的规格,其中的W意味宽(wide),长宽比为800×480.与之相关的还有VGA(640×480)和FWVGA(854×480). WVGA并不是16:9比例,而是5:3的显示 ...
- jquery 分页控件(一)
以前一直都是用别人的分页控件,虽然用得很爽,但总觉的还是自己写个小插件比较好,这个插件效果.代码等都有参照别人完成的控件.即便功能并不是那么完善,扩展性也不好,bug或许还很多.个人觉得,适合自己用就 ...
- jquery serialize()方法的扩展
Jquery提供的序列化表单方法serialize方法确实方便,但是我在使用的时候发现了一个弊端:当我使用type:“post”进行ajax请求的时候, 这个时候参数data:$("#myf ...
- BZOJ2882: 工艺
题解: 裸的字符串最小表示... 可以戳这里:http://www.cnblogs.com/ACAC/archive/2010/05/23/1742349.html 这里说一下为什么a[i+k]> ...
- python扩展实现方法--python与c混和编程
前言 需要扩展Python语言的理由: 创建Python扩展的步骤 1. 创建应用程序代码 2. 利用样板来包装代码 a. 包含python的头文件 b. 为每个模块的每一个函数增加一个型如PyObj ...
- [.NET WebAPI系列02] WebAPI 中的HTTP通信
[前言] 本节用于承上启下,通过第一节了解的WebAPI的基本语法,Controller CRUD方法的基本格式: 但很多场合,第一节中的Web API Controller方法返回的信息 过于简单, ...
- JAX-RS入门 三 :细节
一.若希望一个Java类能够处理REST请求,则这个类必须至少添加一个@Path("/")的annotation:对于方法,这个annotation是可选的,如果不添加,则继承类的 ...
- 【 D3.js 高级系列 — 1.0 】 文本的换行
在 SVG 中添加文本是使用 text 元素.但是,这个元素不能够自动换行,超出的部分就显示不出来了,怎么办呢? 高级系列开篇前言 从今天开始写高级系列教程.还是那句话,由于本人实力有限,不一定保证入 ...
- 探秘Java虚拟机——内存管理与垃圾回收
本文主要是基于Sun JDK 1.6 Garbage Collector(作者:毕玄)的整理与总结,原文请读者在网上搜索. 1.Java虚拟机运行时的数据区 2.常用的内存区域调节参数 -Xms:初始 ...
- 【转】 当程序崩溃的时候怎么办 Part-2
转自:http://www.tairan.com/archives/1143 欢迎回到当程序崩溃的时候怎么办 教程! 在这个教程的第一部分,我们介绍了SIGABRT和EXC_BAD_ACCESS错误, ...