概述
SViewBase for Android 提供三维模型基本的浏览、模型属性操作、基本三维对象操作、动画播放、测量、批注等功能的实现接口,
可实现基本的 三维模型展示功能,以便于用户个性化定制属于自己的产品。
需要快速集成使用的用户,可选择有基本功能界面的控件版本 SViewFrame for Android 集成控件进行集成。
集成准备
集成之前需要熟悉集成环境以便快速准确的集成相关功能界面。详细集成准备如下所示:
集成环境
SViewBase for Android 开发库集成需要的环境:
- 开发环境:JDK7或以上版本
- 开发工具:Android Studio或Eclipse
- 运行环境: Android 8.0及以上的设备
集成说明
SDK包解压SDK后得到以下内容:

其中,
Android Studio 文件夹包含了Android Studio所需的文件;Doc文件夹为SDK相关文档;
Demo包含了Android Studio演示工程
Android Studio集成
控件资源
Android studio文件夹下的sviewbase.aar及HUAWEI AR Engine SDK_v2.0.0.aar文件为控件资源

资源导入
打开Android Studio,将sviewbase.aar添加到您工程的libs文件夹下,如图所示。

修改app的build.gradle 配置文件
{ repositories { flatDir { dirs 'libs' } }
添加一个本地仓库,并把libs目录作为仓库的地址。修改dependencies: 添加sviewbase及华为arEngine依赖,
其中name就是libs目录下sviewbase.aar文件名称;
dependencies { api(name: 'sviewbase', ext: 'aar') //内部使用了华为ar,需要添加依赖; api(name: 'HUAWEI AR Engine SDK_v2.0.0', ext: 'aar') }
选择你的project 鼠标右键选择
【open Module Settings】

选择你的module Dependencies 选项卡,选择+号,选择
【File dependency】
找到需要导入的jar包,点击ok


点击Rebuild Project按钮重新构建工程
注意事项:
- 若遇到aapt finished with non-zero exit value 1 异常,请将SDK的build.gradle中的 buildToolsVersion 设置为与app中build.gradle文件的buildToolsVersion相同, 然后Rebuild Project。;
- 若遇到module 合并时的重名冲突问题,请尝试重命名冲突的文件并Rebuild Project;
-
如果提示:mergeDebugResources AAPT err,你可以在app 下的build.gradle 文件下添加
aaptOptions.cruncherEnabled = false aaptOptions.useNewCruncher = false
主体功能集成
应用权限声明
由于控件需要SDCard读写,录音等权限,请在AndroidManifest里面加入如下权限配置:
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.CHANGE_CONFIGURATION" /> //OpenGLES 渲染器版本设定 <uses-feature android:glEsVersion="0x00020000" />
控件资源初始化
在创建SViewBase控件对象之前,需要初始化SViewBase所需的本地资源,OpenGLES版本等信息。此过程一般在Application中进行,
基本流程如下,此代码可以从Demo工程拷贝,根据需要做配置修改。
/** * 初始化SView参数 */ public void initSViewBaseConfig () { String assertDataPath = "SViewData"; UIHelper.setDefaultContext(this); if (SDCardHelper.ExistSDCard()) { appWorkingPath = SDCardHelper.getSDRootDir() + "Dsoft/" + NAME; } else { appWorkingPath = Environment.getRootDirectory().getPath() + "/Dsoft/" + NAME; } /** * appWorkingPath: 设置的工作路径,一般在/android/data/xxx包名/files/下 * assertDataPath: 资源文件的文件夹名; * GLES版本号; */ SView.initSDK(this, appWorkingPath, assertDataPath, SViewConfig.GLESVERSION20); }
申请授权文件sview.lic,在第一次运行时拷贝到工作目录/data文件夹下;
或者参考demo中写法,放在Asserts/SViewData/data文件夹下,在assets.lst中添加 data/sview.lic。
申请授权地址
智能测量功能集成
通过对拾取、预选及创建等相关接口的组合,实现快速测量尺寸,提高测量的易用性及用户体验;
- 使用拾取器(或自定义拾取器)调用拾取接口传递坐标值,获取拾取到的特征点、线、面等对象;
- 记录拾取到的对象并设置预选状态;
- 使用类型及关系判断相关接口,确定对象之间的关系;
- 调用对应的距离或角度测量接口创建测量对象;
预显
- 根据传递的坐标值(x,y)获取拾取到的特征点、线、面等对象
- 设置拾取到的对象的预选状态
//获取拾取对象(getPickShapeByType(x,y)) //1、根据拾取器坐标获取拾取到的对象集 SShape sShape ; Map<Integer, SShape> pickShape = getSView().getSmartMeasureFactory().getPickShape(x, y); //2、根据拾取优先级获取拾取到的对象 for (SShape.ShapeType shapeType : getSView().getSmartMeasureFactory().getPickTypes()) { sShape = pickShape.get(shapeType.getValue()); if (notNull(sShape)) { break; } } 3、设置预选状态 getSView().getSmartMeasureFactory().preView(sShape, true);
关系判断
- 线、面对象的类型判断详见 SViewBase for Android API
- 两个对象之间的关系判断(如两直线之间的平行、相交等关系)。
//例 判断两直线是否平行 1、记录拾取到的线对象; SLine firstLineShape = getPickShapeByType( x, y); SLine secondLineShape = getPickShapeByType( x, y); 2、判断拾取对象关系 //是否平行 boolean isParallel = getSView().getSmartMeasureFactory().isParallel(firstLineShape, secondLineShape);
距离测量
- 根据传递的坐标值(x,y)获取拾取到的特征点、线、面等对象
- 记录并设置拾取到的对象的预选状态
- 根据拾取到的对象类型执行距离测量
//例 点线距离测量 1、记录拾取到的点、线对象; SPoint pntShape = getPickShapeByType( x, y); SLine lineShape = getPickShapeByType( x, y); 2、执行距离测量,如果满足是弧线,则进行点到弧线圆心的距离测量 //判断是否是圆弧线 boolean isCircleLine = getSView().getSmartMeasureFactory().isCircleLine(lineShape); Measure measure; if(isCircleLine){ //执行点到圆弧圆心的距离测量 measure = getSView().getSmartMeasureFactory().createPntCircleLineDistanceMeasure(pntShape, lineShape); }else{ //执行点到圆弧最近距离测量 measure = getSView().getSmartMeasureFactory().createPntLineDistanceMeasure(pntShape, lineShape);; }
角度测量
- 根据传递的坐标值(x,y)获取拾取到的线、面对象
- 记录并设置拾取到的对象的预选状态
- 根据拾取到的对象类型执行角度测量
//例 面面角度测量 1、记录拾取对象; SFace firstFaceShape = getPickShapeByType( x, y); SFace secondFaceShape = getPickShapeByType( x, y); 2、判断是否是平面,只有平面可以进行角度测量 boolean isPlaneFace1 = getSView().getSmartMeasureFactory().isPlaneFace(firstFaceShape); boolean isPlaneFace2 = getSView().getSmartMeasureFactory().isPlaneFace(secondFaceShape); Measure measure; if(isPlaneFace1 && isPlaneFace2){ //执行面面角度测量 measure = getSView().getSmartMeasureFactory().createFaceFaceAngleMeasure(firstFaceShape, secondFaceShape); }
Demo说明
调用控件方法
SView对象支持通过xml布局文件和代码两种方式初始化,这里提供通过xml布局文件初始化的流程,详细使用请参考Demo工程。
view1 = (SView) findViewById(R.id.sview_view_view);
常见问题
- 集成控件后,能够显示菜单但是模型显示界面为黑色。
- 集成控件出现打开模型空白或者没有授权。
这是由于SViewBase所依赖的C++动态库,没有打包进入您的apk导致,请清理工程重新生成apk再试。
可能的原因有两个:
1).授权时间到期。请重新申请更新授权信息。
2).so文件读取异常。集成初期一般为这个原因,
请检查是否存在多个存在so文件的文件夹:如同时存在x86.armeabi,armeabi-v7a,armeabi-v8a....,建议在性能要求不过分要求的情况下只保留armeabi-v7a即可 。
3).运行设备系统为64位导致。
可以在项目的gradle中增加强制使用armv7a下的so文件并使用32位集成控件,或者集成含arm64-v8a的64位控件。参考代码如下:
defaultConfig { ndk{ abiFilters "armeabi-v7a"//使用32位集成控件; //abiFilters "armeabi-v7a","arm64-v8a"//使用64位集成控件; } }查看SViewBase接口文档