• 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↓↓↓↓↓↓见下面↓↓文章底部点击免费领取↓↓

  • 相关阅读:
    AcWing 3639.链表合并
    【数据结构】抽象数据类型
    Linux下JSON解析工具
    SRM供应商管理系统如何助力口腔护理企业实现采购战略的转型升级
    Keeplived练习
    开放实验室管理系统 毕业设计 JAVA+Vue+SpringBoot+MySQL
    洛谷千题详解 | P1010 [NOIP1998 普及组] 幂次方【C++、Java、Python、Pascal语言】
    Nacos服务注册与发现
    【BLE】HID设备的实现(蓝牙自拍杆、蓝牙键盘、蓝牙鼠标、HID复合设备)
    数据结构之链表详解(1)
  • 原文地址:https://blog.csdn.net/m0_60259116/article/details/126974921