目录

1. 调用方式说明

    全景服务有应用外全景展示调用和应用内全景展示调用两种用法:

    如果开发者想在自己的应用内以视图控件的形式展示全景图,且能够快速切换全景图与控制方式,此时就需要用应用内全景展示调用的方式来实现。具体实现步骤如下:

步骤一:创建本地对象

PanoramaLocalInterface getLocalInstance(Context context);

ParameterDescription
context应用上下文,如果需要主动触发升级,需要传入Activity。

调用示例:

  1. PanoramaInterface.PanoramaLocalInterface mLocalInstance = Panorama.getInstance().getLocalInstance(this);

步骤二:初始化

int init();

调用示例:

  1. if (mLocalInstance.init() != 0) {
  2.    //do something
  3.    return;
  4. }

此接口会初始化全景SDK所需的资源,所以成功初始化是后续接口能正确调用的前提。

步骤三:设置全景图并指定类型

图片全景展示:

int setImage(Uri uri, int type);

ParameterDescription
uri将要加载的全景图URI,支持以file、content及android.resource开头的三类Uri。
type图片类型,当前支持球形全景图(IMAGE_TYPE_SPHERICAL)、环形(柱状)全景图(IMAGE_TYPE_RING)。

调用示例:

  1. if (mLocalInstance.setImage(uri, PanoramaInterface.IMAGE_TYPE_SPHERICAL) != 0) {
  2.    //do something
  3.    return;
  4. }

视频全景展示:

Surface getSurface(int type);

Parameter

Description

type

视频解码后的图片类型

调用示例:

  1. Surface videoSurface = mLocalInstance.getSurface(PanoramaInterface.IMAGE_TYPE_RING);

获取Surface后,需在MediaPlayer中进行设置。

部分示例:

  1. Uri uri = Uri.parse("android.resource://" + getPackageName() + "/" + R.raw.pano);
  2. mPlayer = new MediaPlayer();
  3. try {
  4.    mPlayer.setDataSource(getApplicationContext(), uri);
  5. } catch (IOException e) {
  6.    e.printStackTrace();
  7.    return;
  8. }
  9. mPlayer.setLooping(true);
  10. mPlayer.setSurface(videoSurface);
说明:

可选步骤:设置视频宽高比

int setValue(String name, String value);

Parameter

Description

name

需要设置的属性名称。

value

需要设置的属性值。

调用示例:

  1. mLocalInstance.setValue(PanoramaInterface.KEY_VIDEO_RATIO, String.valueOf(mPlayer.getVideoWidth() / mPlayer.getVideoHeight()));
说明:

设置视频的宽高比需开发者保证其正确性,建议在MediaPlayer资源加载prepare后,通过getVideoWidth()、getVideoHeight()获取宽高后进行设置。

步骤四(可选):设置属性,以极坐标形式展示全景图

int setValue(String name, String value);

ParameterDescription
name需要设置的属性名称。
value需要设置的属性值。

调用示例:

  1. int ret = mLocalInstance .setValue(PanoramaInterface.KEY_RENDER_MODE, PanoramaInterface.VALUE_RENDER_MODE_POLAR);
  2. if (ret != ResultCode.SUCCEED) {
  3.    //error process
  4. }
说明:
请务必在设置全景图片Uri之后再设置以极坐标形式展示,否则设置将无法生效。

步骤五:设置浏览控制模式

void setControlMode(int mode);
ParameterDescription
mode

设置全景图浏览的控制方式。

当前支持的类型有:手机姿态控制、触摸控制或二者同时控制。

使用触摸控制需要开发者调用updateTouchEvent。

调用示例:

  1. mLocalInstance.setControlMode(PanoramaInterface.CONTROL_TYPE_POSE); // CONTROL_TYPE_TOUCH or CONTROL_TYPE_MIX

该接口支持手机姿态控制、触摸控制以及二者同时控制,共三种浏览控制模式,支持运行过程中实时切换。

步骤六:获取视图对象

View getView();

调用示例:

  1. View view = mLocalInstance.getView();
  2. //直接展示全景图
  3. setContentView(view);

开发者可以根据自己的实际需求将获取到的View添加到自己的布局中。

步骤七:实时更新触摸事件

void updateTouchEvent(MotionEvent event);

ParameterDescription
eventAndroid标准触摸事件。

调用示例:

  1. View view = mLocalInstance.getView();
  2. view.setOnTouchListener(new View.OnTouchListener() {
  3.    @Override
  4.    public boolean onTouch(View v, MotionEvent event) {
  5.        if (mLocalInstance != null) {
  6.            mLocalInstance.updateTouchEvent(event);
  7.        }
  8.        return true;
  9.    }
  10. });
说明:

步骤八:去初始化

void deInit();

调用示例:

  1. mLocalInstance.deInit();

当不再需要使用应用内全景展示服务能力时,须调用该接口来销毁资源,否则会出现资源泄露。

2. 完整调用示例

图片全景完整调用示例:

  1. public class LocalDisplayActivity extends AppCompatActivity implements View.OnClickListener, View.OnTouchListener {
  2.    private static final String LOG_TAG = "PanoramaKitDemo";
  3.    private PanoramaInterface.PanoramaLocalInterface mLocalInstance;
  4.    private ImageButton mImageButton;
  5.    private boolean mChangeButtonCompass = false;
  6.    @Override
  7.    protected void onCreate(Bundle savedInstanceState) {
  8.        super.onCreate(savedInstanceState);
  9.        setContentView(R.layout.display_err);
  10.        final Uri uri = Uri.parse("android.resource://" + getPackageName() + "/" + R.raw.panoramaPic);
  11.        // 获取PanoramaLocalInterface实例对象
  12.        mLocalInstance = Panorama.getInstance().getLocalInstance(this);
  13.        // 判断初始化以及设置图片是否成功
  14.        if (mLocalInstance.init() == 0 && mLocalInstance.setImage(uri, PanoramaInterface.IMAGE_TYPE_SPHERICAL) == 0) {
  15.            // 获取view,并将其添加到layout
  16.            RelativeLayout layout = findViewById(R.id.relativeLayout);
  17.            View view = mLocalInstance.getView();
  18.            layout.addView(view);
  19.            // 将触屏事件更新到SDK
  20.            view.setOnTouchListener(this);
  21.            // 改变控制方式
  22.            mImageButton = findViewById(R.id.changeButton);
  23.            mImageButton.bringToFront();
  24.            mImageButton.setOnClickListener(this);
  25.        } else {
  26.            Log.e(LOG_TAG, "local api error");
  27.            Toast.makeText(this, "Local init error!", Toast.LENGTH_LONG).show();
  28.        }
  29.    }
  30.    @Override
  31.    public void onClick(View v) {
  32.        if (v.getId() == R.id.changeButton) {
  33.            if (mChangeButtonCompass) {
  34.                mImageButton.setImageDrawable(getResources().getDrawable(R.drawable.ic_touch));
  35.                mChangeButtonCompass = false;
  36.                mLocalInstance.setControlMode(PanoramaInterface.CONTROL_TYPE_TOUCH);
  37.            } else {
  38.                mImageButton.setImageDrawable(getResources().getDrawable(R.drawable.ic_compass));
  39.                mChangeButtonCompass = true;
  40.                mLocalInstance.setControlMode(PanoramaInterface.CONTROL_TYPE_POSE);
  41.            }
  42.        }
  43.    }
  44.    @Override
  45.    public boolean onTouch(View v, MotionEvent event) {
  46.        if (mLocalInstance!= null) {
  47.            mLocalInstance.updateTouchEvent(event);
  48.        }
  49.        return true;
  50.    }
  51.    @Override
  52.    protected void onDestroy() {
  53.        if (mLocalInstance != null) {
  54.            mLocalInstance.deInit();
  55.        }
  56.        super.onDestroy();
  57.    }
  58. }

视频全景完整调用示例:

  1. public class LocalDisplayActivity extends AppCompatActivity implements View.OnClickListener, View.OnTouchListener {
  2.    private static final String LOG_TAG = "PanoramaKitDemo";
  3.    private PanoramaInterface.PanoramaLocalInterface mLocalInstance;
  4.    private ImageButton mImageButton;
  5.    private boolean mChangeButtonCompass = false;
  6.    private MediaPlayer mPlayer;
  7.    @Override
  8.    protected void onCreate(Bundle savedInstanceState) {
  9.        super.onCreate(savedInstanceState);
  10.        setContentView(R.layout.display_layout);
  11.        final Uri uri =  Uri.parse("android.resource://" + getPackageName() + "/" + R.raw.video);
  12.        // 获取PanoramaLocalInterface实例对象
  13.        mLocalInstance = Panorama.getInstance().getLocalInstance(this);
  14.        // 判断初始化以及设置图片是否成功
  15.        if (mLocalInstance.init() == 0) {
  16.            Surface videoSurface = mLocalInstance.getSurface(PanoramaInterface.IMAGE_TYPE_SPHERICAL);
  17.            if (videoSurface == null) {
  18.                Log.e(LOG_TAG, "videoSurface is null");
  19.                return;
  20.            }
  21.            mPlayer = new MediaPlayer();
  22.            try {
  23.                mPlayer.setDataSource(getApplicationContext(),  uri);
  24.            } catch (IOException e) {
  25.                e.printStackTrace();
  26.                return;
  27.            }
  28.            mPlayer.setLooping(true);
  29.            mPlayer.setSurface(videoSurface);
  30.            try {
  31.                mPlayer.prepare();
  32.            } catch(IOException e) {
  33.                Log.e(LOG_TAG,"Media Player prepare exception");
  34.            }
  35.            mPlayer.start();
  36.            // 获取view,并将其添加到layout
  37.            RelativeLayout layout = findViewById(R.id.relativeLayout);
  38.            View view = mLocalInstance.getView();
  39.            layout.addView(view);
  40.            // 将触屏事件更新到SDK
  41.            view.setOnTouchListener(this);
  42.            // 改变控制方式
  43.            mImageButton = findViewById(R.id.changeButton);
  44.            mImageButton.bringToFront();
  45.            mImageButton.setOnClickListener(this);
  46.        } else {
  47.            Log.e(LOG_TAG, "local api error");
  48.            Toast.makeText(this, "Local init error!", Toast.LENGTH_LONG).show();
  49.        }
  50.    }
  51.    @Override
  52.    public void onClick(View v) {
  53.        if (v.getId() == R.id.changeButton) {
  54.            if (mChangeButtonCompass) {
  55.                mImageButton.setImageDrawable(getResources().getDrawable(R.drawable.ic_touch));
  56.                mChangeButtonCompass = false;
  57.                mLocalInstance.setControlMode(PanoramaInterface.CONTROL_TYPE_TOUCH);
  58.            } else {
  59.                mImageButton.setImageDrawable(getResources().getDrawable(R.drawable.ic_compass));
  60.                mChangeButtonCompass = true;
  61.                mLocalInstance.setControlMode(PanoramaInterface.CONTROL_TYPE_POSE);
  62.            }
  63.        }
  64.    }
  65.    @Override
  66.    public boolean onTouch(View v, MotionEvent event) {
  67.        if (mLocalInstance!= null) {
  68.            mLocalInstance.updateTouchEvent(event);
  69.        }
  70.        return true;
  71.    }
  72.    @Override
  73.    protected void onDestroy() {
  74.        Log.d(LOG_TAG, "onDestroy");
  75.        if (mLocalInstance != null) {
  76.            mLocalInstance.deInit();
  77.        }
  78.        super.onDestroy();
  79.    }
  80. }