在 nativescript 中使用 drag 'n' drop
Use drag 'n' drop in nativescript
我想在 nativescript 应用程序中使用绝对布局定位的某些标签上使用拖放功能。甚至可以使用拖放将它们移动到新的绝对位置吗?如果是的话,你能解释一下实现这个的方法吗?
提前致谢。
经过一番研究,我发现您可以通过以下步骤实现此目的:
- 定义绝对布局
- 在里面放置一个标签
- 观察者标签上的平移手势
- 使用 deltaX 和 deltaY,您可以使用标签上绝对布局的静态方法 setLeft() 和 setTop() 更改标签的 left 和 top 值。
样本xml:
<Page xmlns="http://www.nativescript.org/tns.xsd" loaded="pageLoaded">
<AbsoluteLayout>
<Label left="10" top="10" text="drag me" id="dragLabel" />
</AbsoluteLayout>
</Page>
示例js代码:
var viewModule = require("ui/core/view");
var gestures = require("ui/gestures");
var absoluteLayout = require("ui/layouts/absolute-layout");
function pageLoaded(args) {
var page = args.object;
var dragLabel = viewModule.getViewById(page, "dragLabel");
var observer = dragLabel.observe(gestures.GestureTypes.pan, function (panGestureEventData) {
var deltaX = panGestureEventData.deltaX;
var deltaY = panGestureEventData.deltaY;
absoluteLayout.AbsoluteLayout.setTop(this, deltaY);
absoluteLayout.AbsoluteLayout.setLeft(this, deltaX);
}, dragLabel);
};
此外,当前版本(1.2.x) 中的nativescript 不支持手势中的状态。在pan手势中,状态真的是很有必要知道的。这是您可以执行的操作(在 ios 中),因此您可以获得状态。编辑文件 /tns_modules/ui/gestures/gestures.ios.js 并使用以下内容更改函数 _getPanData:
function _getPanData(args, view) {
var recognizer = args.ios;
var state = "unknown";
switch(recognizer.state) {
case UIGestureRecognizerStateBegan:
state = "began";
break;
case UIGestureRecognizerStateChanged:
state = "changed";
break;
case UIGestureRecognizerStateEnded:
state = "ended";
break;
case UIGestureRecognizerStateCancelled:
state = "cancelled";
break;
case UIGestureRecognizerStateFailed:
state = "failed";
break;
}
return {
type: args.type,
view: args.view,
ios: args.ios,
android: undefined,
deltaX: recognizer.translationInView(view).x,
deltaY: recognizer.translationInView(view).y,
state: state
};
}
然后,您可以使用状态字段访问状态:
var observer = dragLabel.observe(gestures.GestureTypes.pan, function (panGestureEventData) {
// ... panGestureEventData.state has on of the above values...
});
我想在 nativescript 应用程序中使用绝对布局定位的某些标签上使用拖放功能。甚至可以使用拖放将它们移动到新的绝对位置吗?如果是的话,你能解释一下实现这个的方法吗?
提前致谢。
经过一番研究,我发现您可以通过以下步骤实现此目的:
- 定义绝对布局
- 在里面放置一个标签
- 观察者标签上的平移手势
- 使用 deltaX 和 deltaY,您可以使用标签上绝对布局的静态方法 setLeft() 和 setTop() 更改标签的 left 和 top 值。
样本xml:
<Page xmlns="http://www.nativescript.org/tns.xsd" loaded="pageLoaded">
<AbsoluteLayout>
<Label left="10" top="10" text="drag me" id="dragLabel" />
</AbsoluteLayout>
</Page>
示例js代码:
var viewModule = require("ui/core/view");
var gestures = require("ui/gestures");
var absoluteLayout = require("ui/layouts/absolute-layout");
function pageLoaded(args) {
var page = args.object;
var dragLabel = viewModule.getViewById(page, "dragLabel");
var observer = dragLabel.observe(gestures.GestureTypes.pan, function (panGestureEventData) {
var deltaX = panGestureEventData.deltaX;
var deltaY = panGestureEventData.deltaY;
absoluteLayout.AbsoluteLayout.setTop(this, deltaY);
absoluteLayout.AbsoluteLayout.setLeft(this, deltaX);
}, dragLabel);
};
此外,当前版本(1.2.x) 中的nativescript 不支持手势中的状态。在pan手势中,状态真的是很有必要知道的。这是您可以执行的操作(在 ios 中),因此您可以获得状态。编辑文件 /tns_modules/ui/gestures/gestures.ios.js 并使用以下内容更改函数 _getPanData:
function _getPanData(args, view) {
var recognizer = args.ios;
var state = "unknown";
switch(recognizer.state) {
case UIGestureRecognizerStateBegan:
state = "began";
break;
case UIGestureRecognizerStateChanged:
state = "changed";
break;
case UIGestureRecognizerStateEnded:
state = "ended";
break;
case UIGestureRecognizerStateCancelled:
state = "cancelled";
break;
case UIGestureRecognizerStateFailed:
state = "failed";
break;
}
return {
type: args.type,
view: args.view,
ios: args.ios,
android: undefined,
deltaX: recognizer.translationInView(view).x,
deltaY: recognizer.translationInView(view).y,
state: state
};
}
然后,您可以使用状态字段访问状态:
var observer = dragLabel.observe(gestures.GestureTypes.pan, function (panGestureEventData) {
// ... panGestureEventData.state has on of the above values...
});