若设置为环形视频全景展示,需设置视频宽高比:
全景服务有应用外全景展示调用和应用内全景展示调用两种用法:
应用外全景展示调用是指通过全景SDK的API获取一个Intent,然后跳转至全景服务中的Activity进行全景图的浏览。该调用方式全景服务会在调用该服务的应用外新建一个窗口进行全景信息展示,与之有关的接口为loadImageInfo 和loadImageInfoWithPermission 。
应用内全景展示调用是指应用在自己进程内,通过全景SDK的API进行全景图的浏览。该方式更为灵活,全景服务相当于返回一个全景图层,调用该服务的应用可以灵活确定这个图层的展示位置以及在图层上叠加其他图层信息,如广告信息。与之有关的接口为getLocalInstance 及PanoramaLocalInterface 中包含的接口。
如果开发者想在自己的应用内以视图控件的形式展示全景图,且能够快速切换全景图与控制方式,此时就需要用应用内全景展示调用的方式来实现。具体实现步骤如下:
PanoramaLocalInterface getLocalInstance(Context context);
| Parameter | Description |
|---|---|
| context | 应用上下文,如果需要主动触发升级,需要传入Activity。 |
调用示例:
- PanoramaInterface.PanoramaLocalInterface mLocalInstance = Panorama.getInstance().getLocalInstance(this);
调用示例:
- if (mLocalInstance.init() != 0) {
- //do something
- return;
- }
此接口会初始化全景SDK所需的资源,所以成功初始化是后续接口能正确调用的前提。
图片全景展示:
int setImage(Uri uri, int type);
| Parameter | Description |
|---|---|
| uri | 将要加载的全景图URI,支持以file、content及android.resource开头的三类Uri。 |
| type | 图片类型,当前支持球形全景图(IMAGE_TYPE_SPHERICAL)、环形(柱状)全景图(IMAGE_TYPE_RING)。 |
调用示例:
- if (mLocalInstance.setImage(uri, PanoramaInterface.IMAGE_TYPE_SPHERICAL) != 0) {
- //do something
- return;
- }
视频全景展示:
Parameter | Description |
type | 视频解码后的图片类型 |
调用示例:
- Surface videoSurface = mLocalInstance.getSurface(PanoramaInterface.IMAGE_TYPE_RING);
获取Surface后,需在MediaPlayer中进行设置。
部分示例:
- Uri uri = Uri.parse("android.resource://" + getPackageName() + "/" + R.raw.pano);
- mPlayer = new MediaPlayer();
- try {
- mPlayer.setDataSource(getApplicationContext(), uri);
- } catch (IOException e) {
- e.printStackTrace();
- return;
- }
- mPlayer.setLooping(true);
- mPlayer.setSurface(videoSurface);
若设置为环形视频全景展示,需设置视频宽高比:
完整代码示例请参见完整调用示例。
可选步骤:设置视频宽高比
int setValue(String name, String value);
Parameter | Description |
name | 需要设置的属性名称。 |
value | 需要设置的属性值。 |
调用示例:
- mLocalInstance.setValue(PanoramaInterface.KEY_VIDEO_RATIO, String.valueOf(mPlayer.getVideoWidth() / mPlayer.getVideoHeight()));
设置视频的宽高比需开发者保证其正确性,建议在MediaPlayer资源加载prepare后,通过getVideoWidth()、getVideoHeight()获取宽高后进行设置。
步骤四(可选):设置属性,以极坐标形式展示全景图
int setValue(String name, String value);
| Parameter | Description |
|---|---|
| name | 需要设置的属性名称。 |
| value | 需要设置的属性值。 |
调用示例:
- int ret = mLocalInstance .setValue(PanoramaInterface.KEY_RENDER_MODE, PanoramaInterface.VALUE_RENDER_MODE_POLAR);
- if (ret != ResultCode.SUCCEED) {
- //error process
- }
| Parameter | Description |
|---|---|
| mode | 设置全景图浏览的控制方式。 当前支持的类型有:手机姿态控制、触摸控制或二者同时控制。 使用触摸控制需要开发者调用updateTouchEvent。 |
调用示例:
mLocalInstance.setControlMode(PanoramaInterface.CONTROL_TYPE_POSE); // CONTROL_TYPE_TOUCH or CONTROL_TYPE_MIX
该接口支持手机姿态控制、触摸控制以及二者同时控制,共三种浏览控制模式,支持运行过程中实时切换。
调用示例:
- View view = mLocalInstance.getView();
- //直接展示全景图
- setContentView(view);
开发者可以根据自己的实际需求将获取到的View添加到自己的布局中。
void updateTouchEvent(MotionEvent event);
| Parameter | Description |
|---|---|
| event | Android标准触摸事件。 |
调用示例:
- View view = mLocalInstance.getView();
- view.setOnTouchListener(new View.OnTouchListener() {
- @Override
- public boolean onTouch(View v, MotionEvent event) {
- if (mLocalInstance != null) {
- mLocalInstance.updateTouchEvent(event);
- }
- return true;
- }
- });
调用示例:
- mLocalInstance.deInit();
当不再需要使用应用内全景展示服务能力时,须调用该接口来销毁资源,否则会出现资源泄露。
图片全景完整调用示例:
- public class LocalDisplayActivity extends AppCompatActivity implements View.OnClickListener, View.OnTouchListener {
- private static final String LOG_TAG = "PanoramaKitDemo";
- private PanoramaInterface.PanoramaLocalInterface mLocalInstance;
- private ImageButton mImageButton;
- private boolean mChangeButtonCompass = false;
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.display_err);
- final Uri uri = Uri.parse("android.resource://" + getPackageName() + "/" + R.raw.panoramaPic);
- // 获取PanoramaLocalInterface实例对象
- mLocalInstance = Panorama.getInstance().getLocalInstance(this);
- // 判断初始化以及设置图片是否成功
- if (mLocalInstance.init() == 0 && mLocalInstance.setImage(uri, PanoramaInterface.IMAGE_TYPE_SPHERICAL) == 0) {
- // 获取view,并将其添加到layout
- RelativeLayout layout = findViewById(R.id.relativeLayout);
- View view = mLocalInstance.getView();
- layout.addView(view);
- // 将触屏事件更新到SDK
- view.setOnTouchListener(this);
- // 改变控制方式
- mImageButton = findViewById(R.id.changeButton);
- mImageButton.bringToFront();
- mImageButton.setOnClickListener(this);
- } else {
- Log.e(LOG_TAG, "local api error");
- Toast.makeText(this, "Local init error!", Toast.LENGTH_LONG).show();
- }
- }
- @Override
- public void onClick(View v) {
- if (v.getId() == R.id.changeButton) {
- if (mChangeButtonCompass) {
- mImageButton.setImageDrawable(getResources().getDrawable(R.drawable.ic_touch));
- mChangeButtonCompass = false;
- mLocalInstance.setControlMode(PanoramaInterface.CONTROL_TYPE_TOUCH);
- } else {
- mImageButton.setImageDrawable(getResources().getDrawable(R.drawable.ic_compass));
- mChangeButtonCompass = true;
- mLocalInstance.setControlMode(PanoramaInterface.CONTROL_TYPE_POSE);
- }
- }
- }
- @Override
- public boolean onTouch(View v, MotionEvent event) {
- if (mLocalInstance!= null) {
- mLocalInstance.updateTouchEvent(event);
- }
- return true;
- }
- @Override
- protected void onDestroy() {
- if (mLocalInstance != null) {
- mLocalInstance.deInit();
- }
- super.onDestroy();
- }
- }
- public class LocalDisplayActivity extends AppCompatActivity implements View.OnClickListener, View.OnTouchListener {
- private static final String LOG_TAG = "PanoramaKitDemo";
- private PanoramaInterface.PanoramaLocalInterface mLocalInstance;
- private ImageButton mImageButton;
- private boolean mChangeButtonCompass = false;
- private MediaPlayer mPlayer;
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.display_layout);
- final Uri uri = Uri.parse("android.resource://" + getPackageName() + "/" + R.raw.video);
- // 获取PanoramaLocalInterface实例对象
- mLocalInstance = Panorama.getInstance().getLocalInstance(this);
- // 判断初始化以及设置图片是否成功
- if (mLocalInstance.init() == 0) {
- Surface videoSurface = mLocalInstance.getSurface(PanoramaInterface.IMAGE_TYPE_SPHERICAL);
- if (videoSurface == null) {
- Log.e(LOG_TAG, "videoSurface is null");
- return;
- }
- mPlayer = new MediaPlayer();
- try {
- mPlayer.setDataSource(getApplicationContext(), uri);
- } catch (IOException e) {
- e.printStackTrace();
- return;
- }
- mPlayer.setLooping(true);
- mPlayer.setSurface(videoSurface);
- try {
- mPlayer.prepare();
- } catch(IOException e) {
- Log.e(LOG_TAG,"Media Player prepare exception");
- }
- mPlayer.start();
- // 获取view,并将其添加到layout
- RelativeLayout layout = findViewById(R.id.relativeLayout);
- View view = mLocalInstance.getView();
- layout.addView(view);
- // 将触屏事件更新到SDK
- view.setOnTouchListener(this);
- // 改变控制方式
- mImageButton = findViewById(R.id.changeButton);
- mImageButton.bringToFront();
- mImageButton.setOnClickListener(this);
- } else {
- Log.e(LOG_TAG, "local api error");
- Toast.makeText(this, "Local init error!", Toast.LENGTH_LONG).show();
- }
- }
- @Override
- public void onClick(View v) {
- if (v.getId() == R.id.changeButton) {
- if (mChangeButtonCompass) {
- mImageButton.setImageDrawable(getResources().getDrawable(R.drawable.ic_touch));
- mChangeButtonCompass = false;
- mLocalInstance.setControlMode(PanoramaInterface.CONTROL_TYPE_TOUCH);
- } else {
- mImageButton.setImageDrawable(getResources().getDrawable(R.drawable.ic_compass));
- mChangeButtonCompass = true;
- mLocalInstance.setControlMode(PanoramaInterface.CONTROL_TYPE_POSE);
- }
- }
- }
- @Override
- public boolean onTouch(View v, MotionEvent event) {
- if (mLocalInstance!= null) {
- mLocalInstance.updateTouchEvent(event);
- }
- return true;
- }
- @Override
- protected void onDestroy() {
- Log.d(LOG_TAG, "onDestroy");
- if (mLocalInstance != null) {
- mLocalInstance.deInit();
- }
- super.onDestroy();
- }
- }