Dragging related issue famo.us - famo.us

I am very new to Famo.us I am trying to code the following. There are 4 famous image surface surface,surface2,surface3,surface4. Surface1 has image content other 3 are blank. I want to setContent of the other 3 surface by dragging image at them or by dragging surface1.
There are three problems with it:
1) After first drag I am setting the content and trying to move the imagesurface(surface) back to original location, but it is not moving.
2) When I am setting the imagesurface(surface) at any other location than (0,0,0) then the behavior is changed.
3) When I am changing the imagesurface with inputsurface there is huge time lag.
Here is my code:
define(function(require, exports, module) {
var Engine = require("famous/core/Engine");
var Surface = require("famous/core/Surface");
var Modifier = require("famous/core/Modifier");
var StateModifier = require("famous/modifiers/StateModifier");
var Draggable = require("famous/modifiers/Draggable");
var Transform = require("famous/core/Transform");
var Transitionable = require("famous/transitions/Transitionable");
var ImageSurface = require('famous/surfaces/ImageSurface');
var Timer = require('famous/utilities/Timer');
var EventHandler = require('famous/core/EventHandler');
var InputSurface = require("famous/surfaces/InputSurface");
var SnapTransition = require("famous/transitions/SnapTransition");
Transitionable.registerMethod('snap', SnapTransition);
var mainContext = Engine.createContext();
var eventHandler = new EventHandler();
var surface = new ImageSurface({
size: [200, 200],
content: 'img/1.jpg',
properties: {
cursor: 'pointer'
}
});
var background_surface = new ImageSurface({
size: [200, 200],
content: 'img/1.jpg',
properties: {
cursor: 'pointer'
}
});
var surface2 = new ImageSurface({
size: [200, 200],
// type: 'image'
content: ''
});
var surface3 = new ImageSurface({
size: [200, 200],
content: ''
});
var surface4 = new ImageSurface({
size: [410, 200],
content: ''
});
var mod2 = new Modifier({
transform: Transform.translate(500, 0, 0)
});
mainContext.add(mod2).add(surface2);
var mod3 = new Modifier({
transform: Transform.translate(710, 0, 0)
});
mainContext.add(mod3).add(surface3);
var mod4 = new Modifier({
transform: Transform.translate(500, 210, 0)
});
mainContext.add(mod4).add(surface4);
var draggable = new Draggable({
xRange: [-1000, 1000],
yRange: [-1000, 1000]
});
surface.pipe(draggable);
var mod = new Modifier({
});
var back_mod = new Modifier({
origin: [0,0]
});
var trans = {
method: 'snap',
period: 100,
dampingRatio: 0.3,
velocity: 0
};
var check=0;
draggable.on('start', function()
{ draggable.setPosition([0,0,0], trans);
check=0;
surface._matrix[12] = 0;
console.log(surface._matrix[12]);
});
surface.on('mouseup', function() {
draggable.setPosition([0,0,0], trans);
});
draggable.on('end', function(data){
surface2.on('mouseover', function(){
if(check==0)
{ draggable.setPosition([surface2._matrix[12],surface2._matrix[13],surface2._matrix[14]], trans);
check=1;
mainContext.add(back_mod).add(background_surface);
}
});
surface3.on('mouseover', function(){
if(check==0)
{console.log("Surface3");
draggable.setPosition([surface3._matrix[12],surface3._matrix[13],surface3._matrix[14]], trans);
mainContext.add(back_mod).add(background_surface);
check=1;}
});
surface4.on('mouseover', function(){
if(check==0){
console.log("Surface4");
draggable.setPosition([surface4._matrix[12]-256,surface4._matrix[13],surface4._matrix[14]], undefined);
var scale_factor= 410/200;
mod.setTransform(
Transform.scale(scale_factor,1, 0),
{ duration :0,curve: 'linear' }
);
check=1;
mainContext.add(back_mod).add(background_surface);
}
});
});
mainContext.add(mod).add(draggable).add(surface);
});

I'm a little unsure of what you're going for but... here's a different version where the draggable always returns to 0,0 and can be used again to set content of another image surface. Can you help with more detail on what you're trying to achieve?
define(function(require, exports, module) {
var Engine = require("famous/core/Engine");
var Surface = require("famous/core/Surface");
var Modifier = require("famous/core/Modifier");
var StateModifier = require("famous/modifiers/StateModifier");
var Draggable = require("famous/modifiers/Draggable");
var Transform = require("famous/core/Transform");
var Transitionable = require("famous/transitions/Transitionable");
var ImageSurface = require('famous/surfaces/ImageSurface');
var Timer = require('famous/utilities/Timer');
var EventHandler = require('famous/core/EventHandler');
var InputSurface = require("famous/surfaces/InputSurface");
var SnapTransition = require("famous/transitions/SnapTransition");
Transitionable.registerMethod('snap', SnapTransition);
var mainContext = Engine.createContext();
var surface = new ImageSurface({
size: [200, 200],
content: 'images/1.jpg',
properties: {
cursor: 'pointer'
}
});
var background_surface = new ImageSurface({
size: [200, 200],
content: 'images/1.jpg',
properties: {
cursor: 'pointer'
}
});
var surface2 = new ImageSurface({
size: [200, 200],
content: ''
});
var surface3 = new ImageSurface({
size: [200, 200],
content: ''
});
var surface4 = new ImageSurface({
size: [410, 200],
content: ''
});
var mod2 = new Modifier({
transform: Transform.translate(500, 0, 0)
});
mainContext.add(mod2).add(surface2);
var mod3 = new Modifier({
transform: Transform.translate(710, 0, 0)
});
mainContext.add(mod3).add(surface3);
var mod4 = new Modifier({
transform: Transform.translate(500, 210, 0)
});
mainContext.add(mod4).add(surface4);
var draggable = new Draggable({
xRange: [-1000, 1000],
yRange: [-1000, 1000]
});
draggable.imageSurface = surface;
surface.pipe(draggable);
var mod = new Modifier({
});
var back_mod = new Modifier({
origin: [0,0]
});
var trans = {
method: 'snap',
period: 100,
dampingRatio: 0.3,
velocity: 0
};
var check=0;
draggable.on('start', function()
{
check=0;
surface._matrix[12] = 0;
console.log(surface._matrix[12]);
});
draggable.on('end', function(data){
var theDraggable = this;
surface2.on('mouseover', function(){
if(check==0)
{
console.log("Surface2");
check=1;
this.setContent(theDraggable.imageSurface._imageUrl);
}
});
surface3.on('mouseover', function(){
if(check==0)
{console.log("Surface3");
this.setContent(theDraggable.imageSurface._imageUrl);
check=1;}
});
surface4.on('mouseover', function(){
if(check==0){
console.log("Surface4");
this.setContent(theDraggable.imageSurface._imageUrl);
check=1;
}
});
this.setPosition([0,0,0], trans);
});
mainContext.add(mod).add(draggable).add(surface);
});

Related

z-translate is ignored by GridLayout view

I want to use GridLayout in ScrollView context and be able to translate surfaces of GridLayout in Z-direction. The problem is that for some reason Z-translate is ignored in GridLayout. Seems like GridLayout has zero perspective because translate in x and y directions just work. How to fix that?
Here is example where z-translate just does nothing :(
define(function(require, exports, module) {
var Engine = require("famous/core/Engine");
var Surface = require("famous/core/Surface");
var Scrollview = require("famous/views/Scrollview");
var View = require("famous/core/View");
var ContainerSurface = require("famous/surfaces/ContainerSurface");
var MouseSync = require("famous/inputs/MouseSync");
var TouchSync = require("famous/inputs/TouchSync");
var GenericSync = require("famous/inputs/GenericSync");
GenericSync.register({ 'mouse': MouseSync, 'touch': TouchSync });
var syncX = new GenericSync(['mouse', 'touch'], { direction: 0 });
var GridLayout = require("famous/views/GridLayout");
var StateModifier = require('famous/modifiers/StateModifier');
var Transform = require("famous/core/Transform");
var mainContext = Engine.createContext();
mainContext.setPerspective(1000);
var grid = new GridLayout({
dimensions: [6, 2]
});
var scrollview = new Scrollview({direction: 0});
syncX.pipe(scrollview);
var surfaces = [];
var mods = [];
var views = [];
for (var i = 0, temp; i < 12; i++) {
view = new View();
mod = new StateModifier();
temp = new Surface({
content: "Surface: " + (i + 1),
size: [200, 200],
properties: {
backgroundColor: "hsl(" + (i * 360 / 40) + ", 100%, 50%)",
lineHeight: "200px",
textAlign: "center"
}
});
temp.pipe(syncX);
surfaces.push(temp);
mods.push(mod);
view.add(mod).add(temp);
views.push(view);
}
grid.sequenceFrom(views);
var container = new ContainerSurface({size:[1200,400]});
container.context.setPerspective(1000); ///<----------
container.add(grid);
scrollview.sequenceFrom([container]);
Engine.on('click', function(){
mods[0].setTransform(Transform.translate(2,2,999), {duration:1000});
});
mainContext.add(scrollview);
});
BTW I did test it in Chrome
The GridLayout should not ignore the z-translate as you can see if you run the code below. There are some things missing and extra pieces you do not need in the code you supplied above.
Note: Putting a modifier on the view in the GridLayout the way you are using it may not end up giving you the desired result you want, but the example does show how it works.
Example jsBin
var Engine = require("famous/core/Engine");
var Surface = require("famous/core/Surface");
var Scrollview = require("famous/views/Scrollview");
var View = require("famous/core/View");
var ContainerSurface = require("famous/surfaces/ContainerSurface");
var GridLayout = require("famous/views/GridLayout");
var StateModifier = require('famous/modifiers/StateModifier');
var Transform = require("famous/core/Transform");
var mainContext = Engine.createContext();
mainContext.setPerspective(1000);
var grid = new GridLayout({
dimensions: [6, 2]
});
var scrollview = new Scrollview({direction: 0});
var surfaces = [];
var mods = [];
var views = [];
for (var i = 0; i < 12; i++) {
var view = new View();
var mod = new StateModifier({
size: [200, 200],
transform: Transform.translate(0,0,0.001)
});
var temp = new Surface({
content: "Surface: " + (i + 1),
properties: {
backgroundColor: "hsl(" + (i * 360 / 40) + ", 100%, 50%)",
lineHeight: "200px",
textAlign: "center"
}
});
surfaces.push(temp);
mods.push(mod);
temp.pipe(view);
view.add(mod).add(temp);
views.push(view);
temp.on('click', translateOut.bind(temp, i));
}
grid.sequenceFrom(views);
var container = new ContainerSurface({size:[1200,400]});
container.add(grid);
grid.pipe(container);
scrollview.sequenceFrom([container]);
container.pipe(scrollview);
function translateOut(index){
if (!this.moved) {
mods[index].setTransform(Transform.translate(0,0,400), {duration:1000});
} else {
mods[index].setTransform(Transform.translate(0, 0,0.001), {duration:1000});
}
this.moved =!this.moved;
}
mainContext.add(scrollview);
This is due to a newly introduced chrome bug. It looks like Chrome tries to fast path some of its rendering when everything is initially at a z translation of 0. If you add a Surface to the scene at a no zero z with an opacity of 0 you can trick Chrome into drawing correctly.
mainContext
.add(new StateModifier({
transform: Transform.translate(0, 0, 100000000),
size: [1, 1],
opacity: 0
})).add(new Surface({
properties: {backgroundColor: 'chromeHack'}
}));
I will edit this post when I make a simpler example and file as a chrome bug.

add a view to scrollview and pipe to mouse

I would like to add a view to a (horizontal) scrollview and pipe to MouseSync. The Scrolling works on the Surfaces but not on the View.
The Scrolling with the Mouse works fine for the Surfaces, but is completely ignored for the TestView that is added to the scrollview.
My main.js looks like this:
define(function(require, exports, module) {
var Engine = require('famous/core/Engine');
var Surface = require('famous/core/Surface');
var Scrollview = require('famous/views/Scrollview');
var SequentialLayout = require('famous/views/SequentialLayout');
var MouseSync = require('famous/inputs/MouseSync');
var TestView = require('TestView');
var context = Engine.createContext();
var scrollview = new Scrollview( {
direction:0,
friction:0.001,
drag:0.001
});
var cells = [];
scrollview.sequenceFrom(cells);
var mouse = new MouseSync({direction:0});
var sequence = new SequentialLayout( { direction:0 } );
var surfaces = [];
sequence.sequenceFrom(surfaces);
var surface1 = new Surface({
size: [200,undefined],
content: '<div>I am surface 1</div>',
properties: {
backgroundColor: 'red'
}
});
var surface2 = new Surface({
size: [200,undefined],
content: '<div>I am surface 2</div>',
properties: {
backgroundColor: 'green'
}
});
var testview = new TestView({size: [200, undefined]});
surface1.pipe(mouse);
surface2.pipe(mouse);
testview.pipe(mouse);
surface1.pipe(scrollview);
surface2.pipe(scrollview);
testview.pipe(scrollview);
surfaces.push(surface1);
surfaces.push(testview);
surfaces.push(surface2);
mouse.pipe(scrollview);
cells.push(sequence);
context.add(scrollview);
});
And TestView like this:
define(function(require, exports, module) {
var View = require('famous/core/View');
var Surface = require('famous/core/Surface');
function TestView(size){
View.apply(this,arguments);
this.mainNode = this.add(this.rootModifier);
_createBackground.call(this, size);
}
TestView.prototype = Object.create(View.prototype);
TestView.prototype.constructor = TestView;
function _createBackground(size){
var background = new Surface({
size: size.size,
content: 'testview',
properties: {
backgroundColor: '#444'
}
});
this.mainNode.add(background);
}
module.exports = TestView;
});
Do I somehow have to pipe from the view to the parent scrollView?
Any help is much appreciated.
I believe it is as simple as piping the background surface of TestView to the views _eventOutput handler..
Try this for your _createBackground function..
function _createBackground(size){
var background = new Surface({
size: size.size,
content: 'testview',
properties: {
backgroundColor: '#444'
}
});
// Add this line
background.pipe(this._eventOutput);
this.mainNode.add(background);
}
Hope this helps!

Famo.us: Scrollview with draggable items: having problems with background surfaces and setPosition transitions

I'm very new to famo.us. I'm trying to extend this previous question about swiping items in a scrollview.
I want my version to have background surfaces behind the draggable which are revealed as the user swipes. I also want the draggable to snap back if the user does not complete a full swipe.
The two problems with it right now are:
1) The surfaces which I want to be behind the draggable are not behind the draggable. They should be hidden by it until the user swipes (I've made them transparent so the draggable can be seen).
2) the setPosition w/ transition causes an error: Uncaught TypeError: Cannot read property 'SUPPORTS_MULTIPLE' of undefined. If I don't provide the transition it works, but a transition would be preferred.
I should note also that I don't know if using a ContainerSurface is a good way of doing this so that could be part of the problem.
Code:
using: http://code.famo.us/famous/0.2/famous.js
var Engine = require("famous/core/Engine");
var Surface = require("famous/core/Surface");
var Scrollview = require("famous/views/Scrollview");
var RenderNode = require('famous/core/RenderNode');
var Transform = require('famous/core/Transform');
var Draggable = require('famous/modifiers/Draggable');
var ContainerSurface = require("famous/surfaces/ContainerSurface");
var StateModifier = require('famous/modifiers/StateModifier');
var mainContext = Engine.createContext();
var scrollview = new Scrollview();
var surfaces = [];
scrollview.sequenceFrom(surfaces);
var inFrontModifier = new StateModifier({
transform: Transform.translate(0, 0, 1)
});
for (var i = 0; i < 15; i++) {
var container = new ContainerSurface({
size: [undefined, 50],
properties: {
overflow: 'hidden'
}
});
var draggable = new Draggable( {
xRange: [-160, 160],
yRange: [0, 0]
});
draggable.dragId = i;
draggable.on('end', function(e) {
if (e.position[0] == 160) {
console.log('yes surface', this.dragId);
}
else if (e.position[0] == -160) {
console.log('no surface', this.dragId);
}
else {
this.setPosition([0,0,0], {
method: 'snap',
period: 300
});
}
});
var item = new Surface({
content: "Item: " + (i + 1),
size: [undefined, 50],
properties: {
backgroundColor: "lightgrey",
borderBottom: "1px solid grey",
lineHeight: "50px",
textAlign: "center"
}
});
var backgroundYesModifier = new StateModifier({
//on the left
origin: [0,0]
});
var backgroundYes = new Surface({
content: "Yes",
size: [160, 50],
properties: {
backgroundColor: "rgba(0,255,0,0.2)",
lineHeight: "50px",
textAlign: "center"
}
});
var backgroundNoModifier = new StateModifier({
//on the right
origin: [1,0]
});
var backgroundNo = new Surface({
content: "No",
size: [160, 50],
properties: {
backgroundColor: "rgba(255,0,0,0.2)",
lineHeight: "50px",
textAlign: "center"
}
});
var node = new RenderNode(draggable);
node.add(item);
//try to put the draggable in front of the background
container.add(inFrontModifier).add(node);
//add the background
container.add(backgroundNoModifier).add(backgroundNo);
container.add(backgroundYesModifier).add(backgroundYes);
item.pipe(draggable);
item.pipe(scrollview);
surfaces.push(container);
}
mainContext.add(scrollview);
The "on top of" can be solved simply by adding a zIndex=4 (4 is an arbitrary choice above your other zIndexes.)
I added the transition by using a slightly different form of the transition.
And while it is known that you don't want to create very many ContainerSurfaces in famo.us, I don't know what "too many" is and I don't know how to get the "hidden" to work otherwise.
Here is my version which I think does what you want:
var Engine = require("famous/core/Engine");
var Surface = require("famous/core/Surface");
var Scrollview = require("famous/views/Scrollview");
var RenderNode = require('famous/core/RenderNode');
var Transform = require('famous/core/Transform');
var Draggable = require('famous/modifiers/Draggable');
var ContainerSurface = require("famous/surfaces/ContainerSurface");
var StateModifier = require('famous/modifiers/StateModifier');
var Easing = require('famous/transitions/Easing');
var mainContext = Engine.createContext();
var scrollview = new Scrollview();
var surfaces = [];
scrollview.sequenceFrom(surfaces);
var inFrontModifier = new StateModifier({
transform: Transform.translate(0, 0, 1)
});
for (var i = 0; i < 15; i++) {
var container = new ContainerSurface({
size: [undefined, 50],
properties: {
overflow: 'hidden'
}
});
var draggable = new Draggable( {
xRange: [-160, 160],
yRange: [0, 0]
});
draggable.dragId = i;
draggable.on('end', function(e) {
if (e.position[0] == 160) {
console.log('yes surface', this.dragId);
}
else if (e.position[0] == -160) {
console.log('no surface', this.dragId);
}
else {
this.setPosition([0,0,0], {
curve: Easing.outBounce,
duration: 300
});
}
});
var item = new Surface({
content: "Item: " + (i + 1),
size: [undefined, 50],
properties: {
backgroundColor: "lightgrey",
borderBottom: "1px solid grey",
lineHeight: "50px",
textAlign: "center",
zIndex:4
}
});
var backgroundYesModifier = new StateModifier({
//on the left
origin: [0,0]
});
var backgroundYes = new Surface({
content: "Yes",
size: [160, 50],
properties: {
backgroundColor: "rgba(0,255,0,0.2)",
lineHeight: "50px",
textAlign: "center"
}
});
var backgroundNoModifier = new StateModifier({
//on the right
origin: [1,0]
});
var backgroundNo = new Surface({
content: "No",
size: [160, 50],
properties: {
backgroundColor: "rgba(255,0,0,0.2)",
lineHeight: "50px",
textAlign: "center"
}
});
var node = new RenderNode(draggable);
node.add(item);
//try to put the draggable in front of the background
container.add(inFrontModifier).add(node);
//add the background
container.add(backgroundNoModifier).add(backgroundNo);
container.add(backgroundYesModifier).add(backgroundYes);
item.pipe(draggable);
item.pipe(scrollview);
surfaces.push(container);
}
mainContext.add(scrollview);

Can halt() stop the animation at the end state?

I want halt() my translate animation and have it instantly end up at its final location. halt() currently stops the animation where it currently is.
var Engine = require('famous/core/Engine');
var Surface = require('famous/core/Surface');
var Transform = require('famous/core/Transform');
var StateModifier = require('famous/modifiers/StateModifier');
var Easing = require('famous/transitions/Easing');
var mainContext = Engine.createContext();
var surface = new Surface({
size: [100, 100],
content: 'click me to halt',
properties: {
color: 'white',
textAlign: 'center',
backgroundColor: '#FA5C4F'
}
});
var stateModifier = new StateModifier({
origin: [0.5, 0]
});
mainContext.add(stateModifier).add(surface);
stateModifier.setTransform(
Transform.translate(0, 300, 0),
{ duration : 8000, curve: 'linear' }
);
surface.on('click', function() {
stateModifier.halt();
surface.setContent('halted');
});
Your solution does seem very hacky.. why don't you just apply the same transform without a transition..
surface.on('click', function() {
stateModifier.halt();
stateModifier.setTransform(Transform.translate(0, 300, 0));
surface.setContent('halted');
});
EDIT:
Even better you can just get the final transform directly..
surface.on('click', function() {
stateModifier.setTransform(stateModifier.getFinalTransform());
surface.setContent('halted');
});
I discovered a hack for this, at least for pre-0.2.0.
You can set the final state using Translate.set() using a very large number to force the last state of the animation.
It would be nice to see support for this somehow with halt() in future versions of Famo.us
var Engine = require('famous/core/Engine');
var Surface = require('famous/core/Surface');
var Transform = require('famous/core/Transform');
var StateModifier = require('famous/modifiers/StateModifier');
var Easing = require('famous/transitions/Easing');
var mainContext = Engine.createContext();
var surface = new Surface({
size: [100, 100],
content: 'click me to halt',
properties: {
color: 'white',
textAlign: 'center',
backgroundColor: '#FA5C4F'
}
});
var stateModifier = new StateModifier({
origin: [0.5, 0]
});
mainContext.add(stateModifier).add(surface);
stateModifier.setTransform(
Transform.translate(0, 300, 0),
{ duration : 8000, curve: 'linear' }
);
surface.on('click', function() {
// This forces the translate animation to its end state
var translate = stateModifier._transformState.translate;
translate.set(translate.get(Number.MAX_VALUE));
surface.setContent('halted');
});

Famous: Swipe items within a Scrollview

I'm looking to implement similar functionality to Mailbox (http://www.mailboxapp.com/) where you can swipe an individual item within a list in order to action it, using Famous (http://famo.us).
I tried to add the 'Draggable' modifier to each list item, however it seems that you can't add modifiers to surfaces that are part of a Scrollview.
Anyone (from Famous or otherwise) know how I might do this?
Figured it out. In order to modifiers to surfaces inside a scrollview, they need to be wrapped in a RenderNode.
var Engine = require("famous/core/Engine");
var Surface = require("famous/core/Surface");
var Scrollview = require("famous/views/Scrollview");
var RenderNode = require('famous/core/RenderNode');
var Transform = require('famous/core/Transform');
var Draggable = require('famous/modifiers/Draggable');
var mainContext = Engine.createContext();
var scrollview = new Scrollview();
var surfaces = [];
scrollview.sequenceFrom(surfaces);
for (var i = 0, temp; i < 40; i++) {
draggable = new Draggable( {
xRange: [-220, 220],
yRange: [0, 0],
});
item = new Surface({
content: "Surface: " + (i + 1),
size: [undefined, 200],
properties: {
backgroundColor: "hsl(" + (i * 360 / 40) + ", 100%, 50%)",
lineHeight: "200px",
textAlign: "center"
}
});
node = new RenderNode(draggable)
node.add(item);
item.pipe(draggable);
item.pipe(scrollview);
surfaces.push(node);
}
mainContext.add(scrollview);
via # (markmarijnissen) Famo.us Scrollview height)
Explanation: In a Scrollview, the sequenceFrom method creates a ViewSequence from the array. As long as the items being added can return a getSize(), the rendering will work correctly. The RenderNode meets this criteria. You can also create a custom View because it extends RenderNode also.
Below is a code snippet that uses a custom View that allows the surface to drag and shows a response to the drag direction based on the final position criteria.
define('main', function(require, exports, module) {
var Engine = require("famous/core/Engine");
var Scrollview = require("famous/views/Scrollview");
var DragView = require('DragView');
var mainContext = Engine.createContext();
var scrollview = new Scrollview();
var views = [];
scrollview.sequenceFrom(views);
for (var i = 0; i < 40; i++) {
var view = new DragView({
size: [undefined, 200],
content: "Surface: " + (i + 1),
backgroundColor: "hsl(" + (i * 360 / 20) + ", 100%, 70%)"
});
view._eventOutput.pipe(scrollview);
views.push(view);
}
mainContext.add(scrollview);
});
// Custom Drag View Item
define('DragView', function(require, exports, module) {
var Surface = require("famous/core/Surface");
var Scrollview = require("famous/views/Scrollview");
var RenderNode = require('famous/core/RenderNode');
var Modifier = require('famous/core/Modifier');
var View = require('famous/core/View');
var Transform = require('famous/core/Transform');
var Draggable = require('famous/modifiers/Draggable');
var TransitionableTransform = require('famous/transitions/TransitionableTransform');
var RenderController = require('famous/views/RenderController');
function _updatingDrag(e) {
var pos = e.position;
this.surface.setContent('Draggable Position is ' + pos);
}
function _endDrag(e) {
var pos = e.position;
this.surface.setContent('Draggable End Position is ' + pos);
this.draggable.setPosition([0, 0], {
duration: 300
}, function() {
this.renderer.hide();
}.bind(this));
if (pos[0] > 200) {
console.log('showing OK');
this.renderer.show(this.ok);
}
if (pos[0] < -200) {
console.log('showing Not OK');
this.renderer.show(this.not);
}
}
function DragView() {
View.apply(this, arguments);
var draggable = new Draggable({
xRange: [-220, 220],
yRange: [0, 0],
});
var item = new Surface({
content: this.options.content,
size: [undefined, 200],
properties: {
backgroundColor: this.options.backgroundColor,
lineHeight: "200px",
textAlign: "center"
}
});
var okItem = new Surface({
content: String.fromCharCode(10004),
size: [220, 200],
properties: {
color: "white",
backgroundColor: "green",
lineHeight: "200px",
fontSize: "100px",
textAlign: "center"
}
});
var notOkItem = new Surface({
content: String.fromCharCode(10006),
size: [220, 200],
properties: {
color: "white",
backgroundColor: "red",
lineHeight: "200px",
fontSize: "100px",
textAlign: "center"
}
});
var renderer = new RenderController();
draggable.subscribe(item);
draggable.on('update', _updatingDrag.bind({
surface: item
}));
draggable.on('end', _endDrag.bind({
surface: item,
draggable: draggable,
renderer: renderer,
ok: okItem,
not: notOkItem
}));
item.pipe(this._eventOutput);
this.add(draggable).add(item)
this.add(renderer);
}
DragView.prototype = Object.create(View.prototype);
DragView.prototype.constructor = DragView;
module.exports = DragView;
});
// Start Main App
require(['main']);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="http://requirejs.org/docs/release/2.1.16/minified/require.js"></script>
<script src="http://code.famo.us/lib/requestAnimationFrame.js"></script>
<script src="http://code.famo.us/lib/classList.js"></script>
<script src="http://code.famo.us/lib/functionPrototypeBind.js"></script>
<link rel="stylesheet" type="text/css" href="http://code.famo.us/famous/0.3.5/famous.css" />
<script src="http://code.famo.us/famous/0.3.5/famous.min.js"></script>