• Android音视频开发(一):通过三种方式绘制图片


    在Android平台绘制图片的方式常用的有三种,分别是ImageViewd,SurfaceView以及自定义View。下面分别对这三种绘图方式做介绍。

    1. ImageView绘制图片

    ImageView绘制图片也是Android中一种最简单的绘图方式,代码为:

    1. Bitmap bitmap = BitmapFactory.decodeFile(Environment.getExternalStorageDirectory().getPath()+File.separator+"11.jpg");
    2. 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进行绘图的代码为:

    本文福利, 免费领取C++音视频学习资料包、技术视频,内容包括(音视频开发,面试题,FFmpeg webRTC rtmp hls rtsp ffplay srs↓↓↓↓↓↓见下面↓↓文章底部点击免费领取↓↓

    1. SurfaceView surfaceview = (SurfaceView)findviewById(R.id.surface);
    2. SurfaceView.getHolder().addCallback(new SurfaceHolder.Callback(){
    3. @Override
    4. public void surfaceCreated(SurfaceHolder surfaceHolder){
    5. if(surfaceHold == null){
    6. return;
    7. }
    8. Paint paint = new Paint();
    9. paint.setAntiAlias(true);
    10. paint.setStyle(Paint.Style.STROKE);
    11. Bitmap bitmap = BitmapFactory.decodeFile(Environment.getExternalStorageDirectory().getPath()+File.seperator+"11.jpg"); //获取bitmap
    12. Canvas canvas = surfaceHolder.lockCanvas(); //先锁定当前surfaceView的画布
    13. canvas.drawBitmap(bitmap,0,0,paint); //执行绘制操作
    14. surfaceHolder.unlockCanvasAndPost(canvas); //解除锁定并显示在界面上
    15. }
    16. @Override
    17. public void surfaceChanged(SurfaceHolder surfaceHolder,int i,int i1,int i2){
    18. }
    19. @Override
    20. public void surfaceDestroyed(SurfaceHolder surfaceHolder){
    21. }
    22. });

    3. 自定义View绘制图片 

    1. public class CustomView extends view{
    2. Paint paint = new Paint();
    3. Bitmap bitmap;
    4. public CustomView(Context context){
    5. super(context);
    6. paint.setAntiAlias(true);
    7. paint.setStyle(Paint.Style.STROKE);
    8. bitmap = BitmapFactory.decodeFile(Environment.getExternalStorageDirectory().getPath()+File.separator+"11.jpg"); //获取bitmap
    9. }
    10. @Override
    11. protected void onDraw(Canvas canvas){
    12. super.onDraw(canvas);
    13. //不建议在onDraw做任何分配内存的操作
    14. if(bitmap != null){
    15. canvas.drawBitmap(bitmap,0,0,paint);
    16. }
    17. }
    18. }

    最后需要注意:以上读取图片需要获得读取权限,需要在.xml文件中加入以下代码:

    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

     这三种方式都成功了展示出来了,下一篇将讲解—— [Android 音视频开发(二):使用 AudioRecord 采集音频PCM并保存到文件]

    如果你对音视频开发感兴趣,或者对本文的一些阐述有自己的看法,可以在下方的留言框,一起探讨。

    本文福利, 免费领取C++音视频学习资料包、技术视频,内容包括(音视频开发,面试题,FFmpeg webRTC rtmp hls rtsp ffplay srs↓↓↓↓↓↓见下面↓↓文章底部点击免费领取↓↓

  • 相关阅读:
    【毕业季·进击的技术er】1076万毕业生,史上最难就业季?卷又卷不过,躺又躺不平,敢问路在何方?
    想学设计模式、想搞架构设计,先学学 UML 系统建模吧
    [Python]实现短信验证码的发送
    软件教程 | Jupyter&stata之stata_kernel攻略
    JMX监控Kafka offset,kafka流量监控,kafka metrics
    Linux: memory: memblock: debug
    复习Day15:栈与队列part02:20. 有效的括号、1047.删除字符串中所有相邻重复项
    【Spring】——2、使用@ComponentScan自动扫描组件并指定扫描规则
    SEO 对企业的重要性
    前端HTML相关知识
  • 原文地址:https://blog.csdn.net/m0_60259116/article/details/126974921