Android多媒体开发(一)——图片展现

背景

多媒体开发,包含图片,音频,视频等领域。近期参与的新项目,正好涉及在Android客户端上进行多媒体开发,借此一步一步尝试学习和整理资料。java

第一步就从最简单的图片展现来入门:尝试用三种方式来展现图片——ImageView,自定义View,SurfaceView。canvas

实现

ImageView

这个最简单,稍有Android基础的开发者都会,能够经过在layout文件中定义ImageView的时候指定src为对应图片,亦可在java代码中经过ImageView的setImageDrawable或者setImageBitmap来设置图片,用于展现。ide

代码过于简单,这里不细述。post

自定义View

自定义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

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

相关文章
相关标签/搜索