安卓之Skia

原创 2015年07月09日 19:16:58

【概念】

    Skia 是 Google 一个底层的图形、图像、动画、 SVG 、文本等多方面的图形库,是 Android 中图形系统的引擎。

        Android里画图或者渲染图像,都需要Skia提供的API接口,或者是间接提供。

    所有Activity或者View或者其他控件的显示,在底层都是通过Skia提供的函数进行显示的。

       Canvas是通过Native方式,调用底层的SkCanvas的。

【源码相关目录】

1.头 文件 --- android/external/skia/include

2.源文件  --- android/external/skia/src

3.封 装层 --- android/framework /base/core/jni    &&  android/framework/base/core/jni/android/graphics 

            (对Skia引擎进行了封装,以便让java代码方便的调用.主要是 对Canvas, Bitmap, Graphics, Picture等等的封装,

             以及和libui库的结合使用。)

【代码角度分析】

  skia 有大概 80,000 行代码,基于 C++ 开发。

应用层到底层的调用关系


【涉及到的3个库】
     libcorecg.so    包含/skia/src/core的部分内容,比如其中的Region,Rect是在SurfaceFlinger里面计算可是区域的操作基本单位;


     libsgl.so         包含/skia/src/core|effects|images|ports|utils的部分和全部内容,

  这个实现了skia大部分的图形效果,以及图形格式的编解码;


     libskiagl.so     包含/skia/src/gl里面的内容,主要用来调用opengl实现部分效果。

【运用小例子 -- 专业图像处理软件

因为Android平台对应用程序的内存限制,并且java的处理效率低下;所以有这么一个方法:NDK+Skia

采用这种方法,绘制屏幕,将会少消耗一半的内存,有没有很开心的感觉!

【缺点】

Skia 本身不是很稳定,所以Skia并没有被包含在NDK的发布包中

使用Skia引擎时的注意事项

1.静态编译,这种方法其实并不好,因为我们在项目中一般都会结合Java对象和NDK来使用Skia,
  静态编译可能会造成一些难以预料的问题。
2.关于Skia库libskia.so,可以直接从相关设备上提取,不过由于Skia库的不稳定性,版本依赖非常严重。 
  adb pull /system/lib/libskia.so 这样的命令就可以。
3.编译自己的动态库时,需要包含正确版本的Skia源文件,一定不能混用,
  比如用3.1版本的源文件来编译用于4.0版本的动态库,这样非常容易出问题。
4.在做Skia相关的应用时,一定要做好版本关联。可以使用git下载不同版本的Android的skia源文件。
【核心类 -- SKCanvas 
最主要的是 SKCanvas 类,几乎整个 Android GUI 系统的底层绘制,都是由这个类来完成的。
     三种绘制功能:

基本图形绘制 如 drawARGB,drawLine 函数 )

图像文件绘制( drawBitmap 函数)

文本绘制( drawText 函数)

Skia 的图像编解码部分:

external/include/image/SKImageDecoder.h // 把图像文件或者流解码到 skia 的内部内存SKBitmap 中 ;

external/include/image/SKImageEncoder.h // 把 skia 内部内存 SKBitmap 编码成文件或流的形式;

这些接口需要具体的类实现,主要代码在 src/image 文件中

  JNI 接口:

Skia 底层库到 Java 上层的支持

代码路径为:frameworks/base/core/jni/android/graphic/ 主要为 Canvas.cpp 文件。

Android 的图形包( graphics ):

它通过调用图形系统的 JNI ,在 Android 的 Java 框架中和 Java 应用程序中, 进行2D 绘制的功能

(基本图形、图片文件,文字)也是通过调用它来实现的。

代码路径为:frameworks/base/graphics/java/android/graphics/

Canvas.cpp 文件实现了 Android 图形系统中最重要的一个类 android.graphic.canvas

【代码Demo集合】

http://www.360doc.com/content/13/0401/16/7891085_275323215.shtml

http://blog.csdn.net/youngkingyj/article/details/16880279












Android随笔之——Android广播机制Broadcast详解

在Android中,有一些操作完成以后,会发送广播,比如说发出一条短信,或打出一个电话,如果某个程序接收了这个广播,就会做相应的处理。这个广播跟我们传统意义中的电台广播有些相似之处。之所以叫做广播,就...
  • wangyingtong
  • wangyingtong
  • 2015年03月11日 15:29
  • 196

安卓之SetOnPageChangeListener

API解释 1.onPageSelected(int position):这个方法有一个参数position,代表哪个页面被选中。当用手指滑动翻页的时候,如果翻动成功了(滑动的距离够长),手指抬...
  • xxdw1992
  • xxdw1992
  • 2018年01月09日 09:31
  • 104

安卓之Fragment详解

两种创建Fragment的方式: 1.在layout中添加 2.在Activity中动态添加。 在layout中添加: 在activity_main.xml中添加一个fragment: ...
  • u010335298
  • u010335298
  • 2015年01月09日 17:35
  • 664

安卓之Broadcast广播

1.知识图谱 1.Android广播机制概述 Android广播分为两个方面:广播发送者和广播接收者,通常情况下,BroadcastReceiver指的就是广播接收者(广播接收器)...
  • YDCookie
  • YDCookie
  • 2017年07月13日 18:29
  • 74

安卓之动画制作

1.知识图谱 (补间动画和帧动画) 1.补间动画的效果图: (alpha透明度)                                                 ...
  • YDCookie
  • YDCookie
  • 2017年06月26日 21:33
  • 130

安卓之recycleview

首先recycleview的使用代码 RecyclerView mRecyclerView= (RecyclerView) view.findViewById(R.id.LV); ...
  • qq_31552755
  • qq_31552755
  • 2016年11月29日 11:33
  • 151

安卓之ANR

ANR是什么?怎么样避免ANR?         安卓中,如果你的应用有一段时间响应不灵敏,系统会向用户显示一个对话框这个对话框称作应用程序无响应(Application not respondin...
  • qq_31552755
  • qq_31552755
  • 2016年11月09日 17:42
  • 145

安卓之json 发送数据

唉。累死了这两天,bug伴随着代码量,觉还睡不好。公司催文档又催的急。我会写代码啊!让我干什么服务器,我去,又无聊又没技术含量的活,而且我还看不见后台的代码,也就是说错了我还不知道是哪错了。烦死了,比...
  • xiaoseqingchun
  • xiaoseqingchun
  • 2013年12月10日 23:00
  • 1123

安卓之相对布局

android:layout_above   讲该控件的底部置于给定的ID的控件之上  android:layout_below   讲该控件的底部置于给定的ID的控件之下 android:lay...
  • xuewenke
  • xuewenke
  • 2013年10月09日 23:54
  • 418

安卓之嵌套布局

xmlns:tools="http://schemas.android.com/tools"     android:layout_width="match_parent"     android...
  • xuewenke
  • xuewenke
  • 2013年10月09日 23:50
  • 554
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:安卓之Skia
举报原因:
原因补充:

(最多只允许输入30个字)