android读取多媒体图片,Android多媒体开发(一)——图片展示

背景

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

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

实现

ImageView

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

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

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

除此之外,View的postInvalidate方法也会导致重绘,调用onDraw。

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上,那也就做成了一个视频播放器。

b739ec46bb5c46d9c0aa4ce35ba1ea56.png

关于找一找教程网

本站文章仅代表作者观点,不代表本站立场,所有文章非营利性免费分享。

本站提供了软件编程、网站开发技术、服务器运维、人工智能等等IT技术文章,希望广大程序员努力学习,让我们用科技改变世界。

[Android多媒体开发(一)——图片展示]http://www.zyiz.net/tech/detail-112031.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值