安卓之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












相关文章推荐

安卓之问卷调查

  • 2015年01月23日 14:25
  • 1.18MB
  • 下载

安卓之Bitmap ,offset,stride含义

package com.example.bitmapcreate; import java.io.ByteArrayOutputStream; import android.util.Log; im...

安卓之实现一个简单的电话拨号功能

1.首先,新建一个安卓项目,打开项目

安卓之使用BASIC AUTH进行登录验证

public String Get(String netUrl,String usr,String psw){ URL url = new URL(netUrl); Username...

安卓之service常用用法详解

安卓一直是半吊子水平,在写一个小东西时,发现自己对service的理解还不够,特总结如下:service的创建public class MinaService extends Service{ ...

安卓之相机Camera

这两天看了下官方关于camera的api,然后了解到可以通过调用系统的Camera和自定义相机两种方式。现在我来介绍简单的,也是菜鸟选手轻松入门的这种。通过调用自带的相机拍照并获取图片,设定到imag...

溜溜学安卓之常用适配器总结

这几天学习了一下安卓的gridview和listview,其中难点感觉在适配器上,经过学习,感觉掌握了一些规律,今天打完球洗个澡,感觉状态刚刚好,总结一下作为我以后的笔记,如有不对,请指正。...
  • l6l6l
  • l6l6l
  • 2016年06月26日 21:06
  • 179

安卓之MediaRecorder(多媒体录制)

在安卓API中有个MediaRecorder类,MediaRecorder中给我们提供方法可以录制音频和视频文件。我们可以通过下面这个流程来熟悉具体的几个方法并且使用的位置和作用。 通过官方...

安卓之手机状态栏的设置和背景色的改变

qq实现了沉浸状态栏的效果,如下图:  如图,好多应用如金山词霸等也实现了这样的效果。这样的效果很酷炫,其实设置很简单。  不过要说明的是,这种效果只能在API19以及以上版本中才能够做到...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:安卓之Skia
举报原因:
原因补充:

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