多媒体开发,包含图片,音频,视频等领域。近期参与的新项目,正好涉及在Android客户端上进行多媒体开发,借此一步一步尝试学习和整理资料。java
第一步就从最简单的图片展现来入门:尝试用三种方式来展现图片——ImageView,自定义View,SurfaceView。canvas
这个最简单,稍有Android基础的开发者都会,能够经过在layout文件中定义ImageView的时候指定src为对应图片,亦可在java代码中经过ImageView的setImageDrawable或者setImageBitmap来设置图片,用于展现。ide
代码过于简单,这里不细述。post
自定义View,就是要自定义View的三个方法,onMeasure, onLayout, onDraw,前两个方法用来定义View的size和位置,后一个onDraw才是绘制的具体实现,因此自定义View绘制图片,就要在onDraw中来绘制。学习
public class MyView extends View {
private Bitmap mBitmap;
private Paint mPaint;
public MyView(Context context) {
super(context);
//读取图片为bitmap实例
mBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.image);
//Paint能够定义画笔的颜色粗细等,在画线条,形状等的时候生效,而在画图片的时候颜色粗细等属性无效,因此只须要new一个实例就好
mPaint = new Paint();
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
//canvas意为“画布”,便是View的可绘制区域
canvas.drawBitmap(mBitmap, 0, 0, mPaint);
}
}
复制代码
onDraw会View初始化后进行调用,将图片绘制到View上。this
除此以外,View的postInvalidate方法也会致使重绘,调用onDraw。spa
SurfaceView在Android系统算是比较复杂的存在,它与View有所不一样。最大的区别就是 View只能在主线程渲染,SurfaceView则能够自定义渲染线程。
咱们知道,若是在主线程作过于耗时的操做,超过16ms,就会引发掉帧甚至ANR。而SurfaceView能够不在主线程渲染,因此用SurfaceView来作渲染视频之类的耗时操做,就能够不影响到主线程的渲染。线程
public class SurfaceMainActivity extends Activity implements Callback {
private SurfaceView mSurfaceView;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.mSurfaceView = new SurfaceView(this);
setContentView(mSurfaceView);
//SurfaceView有本身的生命周期,不能直接使用,要经过callback监听到Surface在create以后,destroy以前,才能在其上绘制
mSurfaceView.getHolder().addCallback(this);
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
//Surface已经建立,能够绘制咱们的图片了
drawBitmap(holder);
}
private void drawBitmap(SurfaceHolder holder) {
Bitmap bitmap = null;
try {
//从assets中读test.png建立bitmap实例
bitmap = BitmapFactory.decodeStream(getAssets().open("test.png"));
} catch (IOException e) {
e.printStackTrace();
}
//获取画布
Canvas canvas = holder.lockCanvas();
//画一个大红色背景(清空画布)
canvas.drawColor(Color.RED);
if (bitmap != null) {
//将图片绘制到画布上
canvas.drawBitmap(bitmap,0,0,new Paint());
}
//完成绘制
holder.unlockCanvasAndPost(canvas);
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
//Surface销毁,在这以后,不能再获取画布绘制了
}
}
复制代码
以上是在SurfaceView上绘制一张图片的例子,若是是在surfaceCreated以后,另起一个独立的线程,将视频解析成一帧一帧绘制到Canvas上,那也就作成了一个视频播放器。code