Android音视频开发(一):通过三种方式绘制图片
在Android平台绘制图片的方式常用的有三种,分别是ImageViewd,SurfaceView以及自定义View。下面分别对这三种绘图方式做介绍。
1. ImageView绘制图片
ImageView绘制图片也是Android中一种最简单的绘图方式,代码为:
Bitmap bitmap = BitmapFactory.decodeFile(Environment.getExternalStorageDirectory().getPath()+File.separator+"11.jpg");
imageView.setImageBitmap(bitmap);
2. SurfaceView绘制图片
SurfaceView绘制图片相对复杂,与一般的View不同,SurfaceView提供一个直接的绘图表面(Surface)嵌入到视图结构层次中。你可以控制这个Surface的格式,大小,SurfaceView负责在屏幕上正确的摆放Surface。简单说就是SurfaceView拥有自己的Surface,它与宿主窗口是分离的。
我们知道窗口中的view共享一个window,window又对应一个Surface,所以窗口中的view共享一个Surface,而SurfaceView拥有自己的Surface。SurfaceView会创建一个置于应用窗口之后的新窗口,SurfaceView相当于在Window上挖一个洞,它就是显示在这个洞里,其他的View是显示在Window上,所以View可以显示在 SurfaceView之上,也可以添加一些层在SurfaceView之上。
SurfaceView的窗口刷新的时候不需要重绘应用程序的窗口而android普通窗口的视图绘制机制是一层一层的,任何一个子元素或者是局部的刷新都会导致整个视图结构全部重绘一次。
使用SurfaceView进行绘图的代码为:
SurfaceView surfaceview = (SurfaceView)findviewById(R.id.surface);
SurfaceView.getHolder().addCallback(new SurfaceHolder.Callback(){
@Override
public void surfaceCreated(SurfaceHolder surfaceHolder){
if(surfaceHold == null){
return;
Paint paint = new Paint();
paint.setAntiAlias(true);
paint.setStyle(Paint.Style.STROKE);
Bitmap bitmap = BitmapFactory.decodeFile(Environment.getExternalStorageDirectory().getPath()+File.seperator+"11.jpg"); //获取bitmap
Canvas canvas = surfaceHolder.lockCanvas(); //先锁定当前surfaceView的画布
canvas.drawBitmap(bitmap,0,0,paint); //执行绘制操作
surfaceHolder.unlockCanvasAndPost(canvas); //解除锁定并显示在界面上
@Override
public void surfaceChanged(SurfaceHolder surfaceHolder,int i,int i1,int i2){
@Override
public void surfaceDestroyed(SurfaceHolder surfaceHolder){
});
【相关学习资料推荐,点击下方链接免费报名,先码住不迷路~】
音视频免费学习地址:FFmpeg/WebRTC/RTMP/NDK/Android音视频流媒体高级开发
【文章福利】免费领取C++音视频学习资料包、大厂面试题、技术视频和学习路线图,资料包括(C/C++,Linux,FFmpeg webRTC rtmp hls rtsp ffplay srs 等等)有需要的可以点击 994289133 加群领取哦~
3. 自定义View绘制图片
public class CustomView extends view{
Paint paint = new Paint();
Bitmap bitmap;
public CustomView(Context context){
super(context);
paint.setAntiAlias(true);
paint.setStyle(Paint.Style.STROKE);
bitmap = BitmapFactory.decodeFile(Environment.getExternalStorageDirectory().getPath()+File.separator+"11.jpg"); //获取bitmap
@Override
protected void onDraw(Canvas canvas){
super.onDraw(canvas);