sencha touch 2 stick设备方向为纵向除了景观1视图

时间:2012-04-11 12:59:37

标签: cordova sencha-touch-2

我有一个应用程序,我试图开发与Android和iPhone上的sencha touch 2框架。 我希望应用程序方向除了一个视图外只设置为纵向。 如果设备方向为“纵向”,则此视图将加载纵向视图;如果设备方向为“横向”,则此视图将加载横向视图

目前我在android上使用phonegap,我将方向修改为肖像。

但是,当我创建视图时,我会迷失方向,根据方向加载“纵向视图”或“横向视图”。 如果我在phonegap中将方向指向纵向,也会检测方向吗?

谢谢你的帮助

2 个答案:

答案 0 :(得分:1)

如果没有我的问题的答案,我会回答自己。

例如,在Android(phonegap)上,在清单中将方向定义为:

  

机器人:screenOrientation = “传感器”

然后,在Activity中启动应用程序之前,如果您希望应用程序使用Portrait,则只将其设置为portrait: setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); super.loadUrl( “文件:///android_asset/www/index.html”);

在JS中,当您想要使用横向/纵向时,使用调用自定义setOrientation代码的操作向主应用程序发送命令:

onSetOrientationSuccess: function(result) {
    ...
},
onSetOrientationError: function(err) {
    ... 
},

setOrientation: function(orientation) {

    PhoneGap.exec(this.onSetOrientationSuccess, this.onSetOrientationError, "OrientationPlugin", orientation, []);
},

OrientationPlugin只是一个简单的phonegap插件,您可以在其中检查操作并调用正确的代码:

public class OrientationPlugin extends Plugin {

public static final String ACTION="undefined";

@Override
public PluginResult execute(String action, JSONArray data, String callbackId) {
    Log.d("OrientationPlugin", "Plugin called");
    PluginResult result = null;
    YourActivity activity = (YourActivity) this.ctx;
    Log.d("OrientationPlugin", "Plugin Got context");

    if (ACTION.equals(action)) {
        Log.d("OrientationPlugin", "Plugin set SCREEN_ORIENTATION_SENSOR");         
        activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR);
    }
    else {
        Log.d("OrientationPlugin", "Plugin set SCREEN_ORIENTATION_PORTRAIT");               
        activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);         
    }
    Log.d("OrientationPlugin", "Plugin set ALL OK");            
    result = new PluginResult(Status.OK, "ok");
    return result;
}

}

然后,只要你需要JS,就可以将它设置回PORTRAIT。

希望有所帮助!

答案 1 :(得分:0)

在您希望标准方向的一个视图上,添加自定义值,例如doLandscape: 1。我喜欢在app.config.Runtime类中设置运行时“全局”值,否则如果它对整个应用程序运行,我会将它附加到导航栏。

Ext.define(‘MyApp.config.Runtime’,{
    singleton : true,
    config : {
        doLandscape: 0   // initialize to 0
    },
    constructor : function(config){
        this.initConfig(config);
    }
});

在视口上,添加:

onOrientationChange: function(viewport, orientation, width, height) {
    // test trigger and values
    console.log('o:' + orientation + ' w:' + width + ' h:' + height);

    if (orientation == 'landscape' && MyApp.config.Runtime.doLandscape === 0) {
        // most often this is all that's needed to prevent change
        return false;

        // alternatively / additionally set it back to portrait manually.
        viewport.orientation = this.PORTRAIT;
    }
}

查看更新的源代码,这是处理和触发方向更改的视口默认代码。

onOrientationChange: function() {
    var currentOrientation = this.getOrientation(),
        newOrientation = this.determineOrientation();

    if (newOrientation !== currentOrientation) {
        this.fireOrientationChangeEvent(newOrientation, currentOrientation);
    }
},

fireOrientationChangeEvent: function(newOrientation, oldOrientation) {
    var clsPrefix = Ext.baseCSSPrefix;
    Ext.getBody().replaceCls(clsPrefix + oldOrientation, clsPrefix + newOrientation);

    this.orientation = newOrientation;

    this.updateSize();
    this.fireEvent('orientationchange', this, newOrientation, this.windowWidth, this.windowHeight);
}

当您打包原生时,此选项可作为另一种选择:

Ext.device.Orientation.on({
    scope: this,
    orientationchange: function(e) {
        console.log('Alpha: ', e.alpha);
        console.log('Beta: ', e.beta);
        console.log('Gamma: ', e.gamma);
    }
});