How to pass a value in a line chart in flex, from a database where I'm using java to pass the value - flex4

I am using trend lines from amcharts.
I am using java and passing the values from database uins blazeds [??].
I'm taking an array collection to fetch the values from the database and put it in trendlines.
So what's the error in the code and what should the correct code be?
<?xml version="1.0" encoding="utf-8"?>
<!-- This example is made using amStock Flex component. Visit http://flex.amcharts.com to see more examples -->
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx"
xmlns:amcharts="http://www.amcharts.com/com_internal"
backgroundColor="#FFFFFF"
width="100%" height="100%"
creationComplete="init()"
viewSourceURL="srcview/index.html">
<fx:Declarations>
<!-- Place non-visual elements (e.g., services, value objects) here -->
<mx:Producer id="producer" destination="RandomDataPush1"
acknowledge="ack(event)" fault="handleFault(event)"/>
<mx:Consumer id="consumer" destination="RandomDataPush1"
message="messageHandler(event)" fault="handleFault(event)" />
</fx:Declarations>
<fx:Script>
<![CDATA[
import mx.collections.ArrayCollection;
import com.amcharts.events.SerialChartEvent;
import mx.controls.Alert;
import mx.core.FlexGlobals;
import mx.messaging.events.MessageAckEvent;
import mx.messaging.events.MessageEvent;
import mx.messaging.events.MessageFaultEvent;
import mx.messaging.messages.AsyncMessage;
import mx.rpc.events.ResultEvent;
private var dataString:String =
[Bindable]
private var chartData:ArrayCollection = new ArrayCollection();
/* private function generateChartData():void
{
var firstDate:Date = new Date();
firstDate.setMinutes(firstDate.getMinutes() - 2000);
for(var i:Number = 0; i < 2000; i++)
{
var newDate:Z = new Date(firstDate);
newDate.setMinutes(newDate.getMinutes() + i);
var a:Number = Math.round(Math.random() * (40 + i)) + 100 + i;
var b:Number = Math.round(Math.random() * (1000 + i)) + 500 + i * 2;
chartData.addItem({date:newDate, a:a, b:b});
}
} */
private var Bindable:Object;
private function parseData():void{
// parse data string
var rowArray:Array = dataString.split("\n");
for(var i:uint = 0; i < rowArray.length; i++){
var row:Array = rowArray[i].split(",");
var dateArray:Array = row[0].split("-");
var date:Date = new Date(Number(dateArray[0]), Number(dateArray[1]) - 1, Number(dateArray[2]));
var open:Number = row[1];
var high:Number = row[2];
var low:Number = row[3];
var close:Number = row[4];
//chartData.addItem({date:date, open:open, high:high, low:low, close:close});
}
}
private function onClose():void
{
var msg:AsyncMessage = new AsyncMessage();
msg.body = "Close";
//msg.headers["symbol"]="IBKR";
msg.headers["symbol"]="EUR";
producer.send(msg);
consumer.subscribe();
//PopUpManager.removePopUp(this);
}
public function init():void {
// Alert.show("Hi from init..");
var msg:AsyncMessage = new AsyncMessage();
msg.body = "New";
//msg.headers["symbol"]="IBKR";
msg.headers["symbol"]="EUR";
producer.send(msg);
consumer.subscribe();
var ar:ArrayCollection=new ArrayCollection();
ar.addItemAt("EUR",0);
//pair_chart.dataProvider=ar;
//pair_chart.selectedIndex=0;
var ar1:ArrayCollection=new ArrayCollection();
ar1.addItemAt("Candle",0);
ar1.addItemAt("Bar",1);
}
private function ack(event:MessageAckEvent):void
{
//Alert.show(""+event.message.body);
chart.dataProvider = event.message.body as ArrayCollection;
//mybarChart.dataProvider = event.message.body as ArrayCollection;
}
private function handleFault(event:MessageFaultEvent):void
{
Alert.show("fault"+event.faultString);
}
private function messageHandler(event:MessageEvent):void
{
var dateTime:Date = new Date();
var obj:Object = new Object();
//Alert.show("hi "+event.message.body);
//obj.time = format.format(new Date()).toString();
//chart.dataProvider = event.message.body as ArrayCollection;
//FlexGlobals.topLevelApplication.crntpos.ui.chartArrCollection.addAll(event.message.body as ArrayCollection);
chartData.addAll(event.message.body as ArrayCollection);
//Alert.show("chartData.length "+chartData.length);
chart.dataProvider = chartData;
//Alert.show("hi "+chartData.list);
//mybarChart.dataProvider=FlexGlobals.topLevelApplication.crntpos.ui.chartArrCollection;
}
]]>
</fx:Script>
<s:VGroup width="100%" height="100%" paddingBottom="10" paddingTop="10" paddingLeft="10" paddingRight="10">
<amcharts:AmStockChart width="100%" height="100%">
<amcharts:dataSets>
<amcharts:DataSet id="chart" color="#00CC00" dataProvider="{chartData}" categoryField="date" title="First data set">
<amcharts:fieldMappings>
<amcharts:FieldMapping fromField="a" toField="value"/>
<amcharts:FieldMapping fromField="b" toField="volume"/>
</amcharts:fieldMappings>
</amcharts:DataSet>
</amcharts:dataSets>
<amcharts:panels>
<!-- to enabled drawing icons, you only need to set drawingIconsEnabled="true" on StockPanel -->
<amcharts:StockPanel drawingIconsEnabled="true" title="Value" height="50%" showCategoryAxis="true">
<amcharts:stockGraphs>
<amcharts:StockGraph bulletBorderColor="#FFFFFF" bullet="round" id="g1" valueField="value" compareField="value" comparable="true"/>
</amcharts:stockGraphs>
<amcharts:stockLegend>
<amcharts:StockLegend/>
</amcharts:stockLegend>
</amcharts:StockPanel>
</amcharts:panels>
<amcharts:periodSelector>
<amcharts:PeriodSelector position="bottom" width="157">
<amcharts:periods>
<amcharts:PeriodButton selected="true" label="1 Hour" period="hh" count="1"/>
<amcharts:PeriodButton label="2 Hours" period="hh" count="2"/>
<amcharts:PeriodButton label="6 Hours" period="hh" count="6"/>
<amcharts:PeriodButton label="1 Day" period="DD" count="1"/>
<amcharts:PeriodButton label="MAX" period="MAX"/>
</amcharts:periods>
</amcharts:PeriodSelector>
</amcharts:periodSelector>
<amcharts:chartScrollbarSettings>
<amcharts:ChartScrollbarSettings height="30" graph="{g1}"/>
</amcharts:chartScrollbarSettings>
<amcharts:categoryAxesSettings>
<amcharts:CategoryAxesSettings minPeriod="mm"/>
</amcharts:categoryAxesSettings>
<amcharts:chartCursorSettings>
<amcharts:ChartCursorSettings showValueAxisValue="true" crosshair="true"/>
</amcharts:chartCursorSettings>
</amcharts:AmStockChart>
</s:VGroup>
</s:Application>

Related

Center a grid without spreading it out in Xamarin forms

I'm making a simple memory game, but for some reason I can't get the cards to not spread out like in the image. I put the cards in a grid that I put in the middle of a 3-column grid like this:
xaml:
<Grid x:Name="mainGrid">
<Image x:Name="bgImage" Aspect="AspectFill"/>
<Grid x:Name="innerGrid" >
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
</Grid>
</Grid>
cs:
Grid gr = new Grid
{
ColumnSpacing = 0,
RowSpacing = 0,
};
for (var i = 0; i < numRows; i++)
{
gr.RowDefinitions.Add(new RowDefinition { Height = new GridLength(1, GridUnitType.Star) });
}
for (var i = 0; i < numCols; i++)
{
gr.ColumnDefinitions.Add(new ColumnDefinition { Width = new GridLength(1, GridUnitType.Star) });
}
innerGrid.Children.Add(gr, 1,0);
var rowCount = 0;
var colCount = 0;
for (var i = 0; i < bricks.Count; i++)
{
Image img = new Image
{
Source = Globals.mediaUrl + bricks[i].img,
ClassId = bricks[i].img,
Margin = new Thickness(0, 0, 0, 0)
};
gr.Children.Add(img,colCount,rowCount);
colCount++;
if (colCount > numCols - 1)
{
colCount = 0;
rowCount++;
}
}
But for some reason I don't understand the cards spread out anyway like in this picture:
Can someone please help me with this
It's just a case of setting the "Aspect" property of your image to "Aspect.AspectFill".
I've taken your .xaml.cs code and added an example using a BowView
Grid gr = new Grid
{
ColumnSpacing = 0,
RowSpacing = 0,
};
var numRows = 3;
var numCols = 4;
for (var i = 0; i < numRows; i++)
{
gr.RowDefinitions.Add(new RowDefinition { Height = new GridLength(1, GridUnitType.Star) });
}
for (var i = 0; i < numCols; i++)
{
gr.ColumnDefinitions.Add(new ColumnDefinition { Width = new GridLength(1, GridUnitType.Star) });
}
innerGrid.Children.Add(gr, 1,0);
var rowCount = 0;
var colCount = 0;
var randomColors = new Color[]
{
Color.Aqua,
Color.Aquamarine,
Color.Azure,
Color.Beige,
Color.Bisque,
Color.Black,
Color.Blue,
Color.Brown,
Color.Chartreuse,
Color.Chocolate,
Color.Coral,
Color.Crimson,
};
for (var i = 0; i < 12; i++)
{
BoxView img = new BoxView()
{
BackgroundColor = randomColors[new Random().Next(0, randomColors.Length - 1)]
};
// Image img = new Image
// {
// Source = ImageSource.FromFile("xamarin.png"),
// Aspect = Aspect.AspectFill
// };
gr.Children.Add(img,colCount,rowCount);
colCount++;
if (colCount > numCols - 1)
{
colCount = 0;
rowCount++;
}
}
The end result, a bunch of colourful squares with no spacing between them:
Swapping out to an image (https://www.google.com/search?q=xamarin&tbm=isch&ved=2ahUKEwiIs5_o1pX2AhWKuSoKHYh9Ay8Q2-cCegQIABAA&oq=xamarin&gs_lcp=CgNpbWcQAzIECAAQQzIFCAAQgAQyBQgAEIAEMgUIABCABDIFCAAQgAQyBQgAEIAEMgUIABCABDIFCAAQgAQyBQgAEIAEMgUIABCABDoLCAAQgAQQsQMQgwE6CAgAEIAEELEDOgcIABCxAxBDUJgFWNoJYIYMaABwAHgAgAE-iAHJA5IBATiYAQCgAQGqAQtnd3Mtd2l6LWltZ8ABAQ&sclient=img&ei=rRQWYsioLIrzqgGI-434Ag&bih=764&biw=1477#imgrc=1Hifvt0AhVMSlM), and setting the aspect should yield the result you want.
Your layout code is fine, the issue is the aspect of the image itself.
This is so strange if I do it like that with a square image I get the result as in picture, so I don't get squares like you.
Grid gr = new Grid
{
ColumnSpacing = 2,
RowSpacing = 2,
};
for (var i = 0; i < numRows; i++)
{
gr.RowDefinitions.Add(new RowDefinition { Height = new GridLength(1, GridUnitType.Star) });
}
for (var i = 0; i < numCols; i++)
{
gr.ColumnDefinitions.Add(new ColumnDefinition { Width = new GridLength(1, GridUnitType.Star) });
}
var rowCount = 0;
var colCount = 0;
for (var i = 0; i < 12; i++)
{
Image img = new Image
{
Source = "https://pbs.twimg.com/profile_images/471641515756769282/RDXWoY7W_400x400.png",//Globals.mediaUrl + bricks[i].img,
ClassId = bricks[i].img,
Margin = new Thickness(0, 0, 0, 0),
Aspect = Aspect.AspectFill
};
gr.Children.Add(img,colCount,rowCount);
colCount++;
if (colCount > numCols - 1)
{
colCount = 0;
rowCount++;
}
}
innerGrid.Children.Add(gr, 1, 0);
I use FlexLayout with a binding to an ObservableCollection. This allows me some control over the size and shape of the images and display area, while also letting me take advantage of the flow properties of the FlexLayout.
I realize this is a different approach from what you were doing, but I hope you can take some value from this approach too.
xaml page:
<?xml version="1.0" encoding="utf-8" ?> <ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="XFGrid_Test.BindablePage">
<ContentPage.Content>
<StackLayout VerticalOptions="Start">
<FlexLayout BindableLayout.ItemsSource="{Binding Images}"
Wrap="Wrap"
Direction="Row"
JustifyContent="Center"
AlignItems="Center"
AlignContent="Center"
x:Name="flexLayout">
<BindableLayout.ItemTemplate>
<DataTemplate>
<Image ClassId="{Binding ImageCode}" Source="{Binding ImageSrc}" WidthRequest="{Binding ImageWidth}" HeightRequest="{Binding ImageHeight}" Margin="2" >
<Image.GestureRecognizers>
<TapGestureRecognizer Tapped="TapGestureRecognizer_Tapped" NumberOfTapsRequired="1"></TapGestureRecognizer>
</Image.GestureRecognizers>
</Image>
</DataTemplate>
</BindableLayout.ItemTemplate>
<BindableLayout.EmptyView>
<Label Text="Nothing here."></Label>
</BindableLayout.EmptyView>
</FlexLayout>
</StackLayout>
</ContentPage.Content>
xaml.cs:
public ObservableCollection<ImageModel> Images { get; set; }
int HorizontalMargin { get; set; }
int VerticalMargin { get; set; }
int VerticalAdjustment { get; set; } //adjusts for navigation and info bar
int numberOfImages = 25;
int numColumns = 6;
int MaxImageWidth;
int MaxImageHeight;
int ImageGap = 1;
public BindablePage()
{
InitializeComponent();
Images = new ObservableCollection<ImageModel>();
//Adjust the vertical display area to account for on-screen controls, etc.
//This needs refinement - or rethinking.
VerticalAdjustment = 100;
//Get the device display size (uses Xamarin.Essentials)
var mainDisplayInfo = DeviceDisplay.MainDisplayInfo;
//Available horizantal screen space - x dimension
var xWidth = mainDisplayInfo.Width / mainDisplayInfo.Density;
//Available vertical screen space - y dimension
var yHeight = (mainDisplayInfo.Height / mainDisplayInfo.Density) - VerticalAdjustment;
//Determine the MaxImageWidth of the image to fit horizontally
//based on the number of rows desired and the available horizontal screen space
var numHorizontalGaps = numColumns * 2 - 1;
MaxImageWidth = (int)Math.Round(xWidth / numColumns, MidpointRounding.AwayFromZero) - numHorizontalGaps * ImageGap;
//Determine Number of image rows to fit vertically based on fixed number of columns and number of images
var nRows = numberOfImages / numColumns;
if (numberOfImages % numColumns > 0)
nRows++;
var numVerticalGaps = nRows * 2 - 1;
MaxImageHeight = (int)Math.Round(yHeight / nRows, MidpointRounding.AwayFromZero) - numVerticalGaps * ImageGap;
//Choose the dimension that is smaller (because it must fit).
var Dimension = Math.Min(MaxImageHeight, MaxImageWidth);
//Determine the left and right margins
HorizontalMargin = (int)Math.Round((xWidth - (((numColumns + 1) * Dimension) + (numColumns - 1) * ImageGap)), MidpointRounding.AwayFromZero) / 2;
//Determine the top and bottom margins - this will center top to bottom (set to zero for top alignment)
VerticalMargin = (int)Math.Round((yHeight - ((nRows) * Dimension) + (nRows - 1) * ImageGap), MidpointRounding.AwayFromZero) / 2;
//VerticalMargin = 0;
//Set the margins of the FlexLayout named "flexLayout"
flexLayout.Margin = new Thickness(HorizontalMargin, VerticalMargin);
//Load up the ObservableCollection
for (var i = 0; i < numberOfImages; i++)
{
ImageModel img = new ImageModel
{
ImageID = i,
ImageSrc = "https://pbs.twimg.com/profile_images/471641515756769282/RDXWoY7W_400x400.png",//Globals.mediaUrl + bricks[i].img,
ImageCode = i.ToString(),
ImageHeight = Dimension, //Height and Width shouild be equal
ImageWidth = Dimension,
ImageName = i.ToString(),
};
Images.Add(img);
}
BindingContext = this;
}
private void TapGestureRecognizer_Tapped(object sender, EventArgs e)
{
//Handle the tap
}
ImageModel class:
public class ImageModel
{
public int ImageID { get; set; }
public string ImageName { get; set; }
public string ImageSrc { get; set; }
public int ImageWidth { get; set; }
public int ImageHeight { get; set; }
public string ImageCode { get; set; }
}
The result with 12 images:
Result with 16 images:

Reset mx:hslider value

I am new to flex and my question is how to reset mx hslider value with "reset" button.
here is a sample script:
<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="955" minHeight="600">
<fx:Declarations>
<!-- Place non-visual elements (e.g., services, value objects) here -->
</fx:Declarations>
<fx:Script>
<![CDATA[
import mx.events.SliderEvent;
private var txtvalue:int = 0;
protected function Focal_changeHandler(event:SliderEvent):void
{
txtvalue = Focal.value;
if(txtvalue == 0)
Slider_txt.text = "Low";
if(txtvalue == 1)
Slider_txt.text = "Middle";
if(txtvalue == 2)
Slider_txt.text = "High";
}
]]>
</fx:Script>
<mx:HSlider id="Focal" x="476" y="345" maximum="2" minimum="0" value="0" buttonMode="true" enabled="true" snapInterval="1" tickInterval="1" allowTrackClick="true" liveDragging="true" change="Focal_changeHandler(event)"/>
<s:Label id="Slider_txt" x="472" y="319" text= "Low"/>
<s:Button x="476" y="459" label="Reset" id="Res_btn"/>
</s:Application>
Normally you could do
<s:Button x="476" y="459" label="Reset" id="Res_btn" click="{Focal.value = 0}"/>
But since you'd need to update the text as well, it's better to do an own method for that:
<s:Button x="476" y="459" label="Reset" id="Res_btn" click="onResetClick()"/>
and in your code part:
protected function Focal_changeHandler(event:SliderEvent):void
{
updateSliderText();
}
private function onResetClick():void
{
Focal.value = 0;
updateSliderText();
}
private function updateSliderText():void
{
txtvalue = Focal.value;
if (txtvalue == 0)
Slider_txt.text = "Low";
if (txtvalue == 1)
Slider_txt.text = "Middle";
if (txtvalue == 2)
Slider_txt.text = "High";
}

how to change IViewport verticalScrollPosition dynamicly

I'm trying to scroll VGroup with scroller:
<s:Scroller id="scroller" width="100" height="100">
<s:VGroup id="vp" width="100%" height="100%">
<my:TripView id="one"/>
<my:TripView id="two"/>
// if any more TripView.....
</s:VGroup>
</s:Scroller>
The TripView is dynamiclly generated, so the VGroup contentHeight may much greater than viewPortHeight. Since I could drag stuff in the TripView, I want to change the vp.verticalScrollPosition when the drag stuff almost move to the bottom of the view so the other TripView could be in the screen.
The most important thing is the scrollRect. Change the verticalScrollPosition based on the scrollRect. To use the ScrollManager, you should register viewport by registerViewport function. Then listen for mouseMove event, in the event listener invoke startScroll. Following is implementation:
package utils {
import flash.display.Stage;
import flash.events.MouseEvent;
import flash.geom.Point;
import flash.geom.Rectangle;
import mx.core.IInvalidating;
import spark.components.Group;
public class ScrollManager {
private var viewport:Group;
private var stage:Stage;
private var oldMovingMouseY:Number;
private static var _instance:ScrollManager;
//threshold for scrolling
private const FUDGE:Number = 35;
//scroll up speed
private const UP_SCROLL_DELTA:int = 50;
//scroll down speed
private const DOWN_SCROLL_DELTA:int = 80;
public function registerViewport(viewport:Group):void {
this.viewport = viewport;
this.stage = viewport.stage;
}
public static function getInstance():ScrollManager {
if(_instance == null) {
_instance = new ScrollManager();
}
return _instance;
}
public function startScroll(mouseEvent:MouseEvent):void {
oldMovingMouseY = mouseEvent.stageY;
stage.addEventListener(MouseEvent.MOUSE_MOVE, onMouseMove, false, 0, true);
stage.addEventListener(MouseEvent.MOUSE_UP, onMouseUp, false, 0, true);
}
private function onMouseUp(event:MouseEvent):void {
stage.removeEventListener(MouseEvent.MOUSE_MOVE, onMouseMove);
stage.removeEventListener(MouseEvent.MOUSE_UP, onMouseUp);
if (viewport is IInvalidating) {
//viewport.callLater(IInvalidating(viewport).validateNow);
//change VSP on scrollRect.y
var rect:Rectangle = viewport.scrollRect;
viewport.verticalScrollPosition = rect.y;
trace("========final vsp ========", rect.y);
}
}
private function onMouseMove(event:MouseEvent):void {
var currentMouseX:Number = event.stageX;
var currentMouseY:Number = event.stageY;
trace("mouseY ", currentMouseY);
//scroll direction
var delta:Number = currentMouseY - oldMovingMouseY;
var direction:int = (delta > 0) ? 1 : (delta < 0) ? -1: 0;
var scrollDelta:Number = direction > 0 ? DOWN_SCROLL_DELTA : UP_SCROLL_DELTA;
//current mousePoint in viewport coordination
var localPoint:Point = viewport.globalToLocal(new Point(currentMouseX, currentMouseY));
trace("localPoint: ", localPoint);
var scrollRect:Rectangle = viewport.scrollRect;
trace("viewport rect", scrollRect);
//determine if need scroll
if(needScroll(localPoint, scrollRect, direction)) {
trace("direction ", direction > 0 ? " UP": " DOWN");
scrollRect.y += scrollDelta*direction;
viewport.scrollRect = scrollRect;
if (viewport is IInvalidating) {
IInvalidating(viewport).validateNow();
}
}
oldMovingMouseY = currentMouseY;
}
private function needScroll(localPoint:Point, scrollRect:Rectangle, direction:int):Boolean {
var localY:Number = localPoint.y;
var bottom:Number = scrollRect.bottom;
var top:Number = scrollRect.top;
if(direction > 0 && (localY + FUDGE) > bottom) {
return true;
}
if(direction< 0 && (localY - FUDGE) < top) {
return true;
}
return false;
}
}
}

How to run a function once in $ (window).scroll()?

I'm trying to make a page that launches different animation depending on the scroll.
The principle is simple, when I'm in a block with a data-attribute concerning the type of animation. I run this animation.
To do this, my script is based on the event $(window).scroll().
When my $(window).scrollTop() is equal to the position of my block, I run the animation. When I leave this block I stop the animation. I would like once the animation is complete, start once my reset function. Currently, she embarked loop as I am not in a block with a data-attribute.
A demo
I'm really stuck. Thank you in advance. Manu
my js file :
$(document).ready(init);
// Ma class Screen
function Screen(name){
this._name = $("#"+name);
this._hauteur;
this._position;
this._screenEnd;
this._screenEnd;
this.screenHeight = function() {
this._hauteur = this._name.data('height');
return this._hauteur;
}
this.topPosition = function() {
this._position = this._name.position().top;
return this._position;
}
this.screenEnd = function() {
this._screenEnd = (this._name.position().top)+(this._name.data('height'));
return this._screenEnd;
}
}
var mesScreens = new Array();
$(".screen").each(function(i){
mesScreens[i] = new Screen($(this).attr('id'));
mesScreens[i]._name.css("height", mesScreens[i].screenHeight());
//console.log(mesScreens[i]);
});
var fini = false;
function init(){
console.log($(".screen").length);
var scrollTimer = null;
$(window).scroll(function () {
var monScrollTop = $(window).scrollTop();
for (var i=0; i<mesScreens.length ; i++) {
if(monScrollTop>(mesScreens[i].topPosition()+5) && monScrollTop<=(mesScreens[i].screenEnd()+5)){
//started = true;
if(mesScreens[i]._name.data("func") == "panorama"){
horizontalPanel(mesScreens[i]._name, mesScreens[i]._hauteur, mesScreens[i]._position);
}else if(mesScreens[i]._name.data("func") == "anim"){
anim(mesScreens[i]._name, mesScreens[i]._hauteur, mesScreens[i]._position, 4);
}
//console.log(mesScreens[3]._hauteur);
}else {
//console.log("je sors");
reset(mesScreens[i]._name, mesScreens[i]._hauteur);
}
};
});
}
/*
* Function horizontalPanel
* #screen : le screen concerné
* #hauteur : hauteur du div
*/
function horizontalPanel(myScreen, hauteur, position){
//console.log("Fonction horizontalPanel debut || fini = "+fini);
var $img = myScreen.children("img");
var deltaScroll = ($(window).scrollTop() - position);
var scrollPercentage = ((deltaScroll / (hauteur)) * 100) ;
//console.log(scrollPercentage);
$img.css('position', "fixed");
$img.css("bottom", "");
$img.css('top', "0px");
$img.css('left', "0px");
$img.css("left", -scrollPercentage+"%");
}
function anim(myScreen, hauteur, position, nbImg){
//console.log("ok");
var $img = myScreen.children("div.image");
var deltaScroll = ($(window).scrollTop() - position);
var scrollPercentage = ((deltaScroll / (hauteur)) * 100) ;
var percentNb = ((nbImg/hauteur) * 100).toFixed(2);
for(var i=0; i<nbImg; i++){
//console.log("if(bla)");
}
//console.log("__");
if(scrollPercentage)
//console.log(hauteur);
$img.css('position', "fixed");
$img.css("top", "0px");
$img.css("bottom", "");
$img.css('background-position', "0 "+ scrollPercentage + '%');
$img.css('left', "0px");
}
function reset(myScreen){
//console.log("Fonction Reset || fini = "+fini);
myScreen.children().css('position', "relative");
myScreen.children().css("bottom", "0px");
myScreen.children().css("top", "");
myScreen.children().css("left", "");
}
An extract from html :
<div id="screen3" data-height='2300' data-func='panorama' class="screen">
<img src="img/screen3.jpg" alt="screen-3">
</div>
<div id="screen4">
<img src="img/screen4-2.jpg" alt="screen-4">
</div>

AIR multiple HTTPService call Mac OSX

I am instantiating and sending multiple instances of HTTPService
On a Mac, however, many of the calls fail with a 2032 error.
<?xml version="1.0" encoding="utf-8"?>
<s:WindowedApplication xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx"
click="windowedapplication1_clickHandler(event)"
creationComplete="windowedapplication1_creationCompleteHandler(event)">
<fx:Script>
<![CDATA[
import mx.controls.Alert;
import mx.events.FlexEvent;
import mx.rpc.events.FaultEvent;
import mx.rpc.events.ResultEvent;
import mx.rpc.http.HTTPService;
[Bindable]
private var r:int=0;
[Bindable]
private var f:int=0;
private var a:Array= ['url1', 'url2', 'url3', 'url4', 'url5'];
private var sa:Array=[];
protected function windowedapplication1_clickHandler(event:MouseEvent):void
{
for(var i:int=0; i<sa.length; i++) {
sa[i].send();
}
}
protected function windowedapplication1_creationCompleteHandler(event:FlexEvent):void
{
for(var i:int=0; i<100; i++) {
var random:int=Math.floor(Math.random() * a.length);
var s:HTTPService=new HTTPService();
s.addEventListener(ResultEvent.RESULT, sr);
s.addEventListener(FaultEvent.FAULT, sf);
s.resultFormat="text";
s.url=a[random];
sa.push(s);
}
//s.useProxy=true;
}
private function sf(e:FaultEvent):void {
f++;
t.text="MESSAGE: " + e.message + "HEADERS:" + e.headers + "FAULTCONTENT: " + e.fault.content
+ "ERROR: " + e.fault.errorID + "|" + e.fault.faultCode + "|" + e.fault.faultDetail + "|" + e.fault.faultString
+ "FAULTMESSAGE:" + e.fault.message + "FAULRNAME:" + e.fault.name + "ROOTCAUSE:" + e.fault.rootCause
+ "AT " + e.fault.getStackTrace();
}
private function sr(e:ResultEvent):void {
r++;
}
]]>
</fx:Script>
<fx:Declarations>
</fx:Declarations>
<s:Label x="10" y="19" text="Result {r}"/>
<s:Label x="10" y="120" text="Fault {f}"/>
<s:TextArea x="10" y="198" width="610" height="294" id="t"/>
</s:WindowedApplication>
It works as expected on PC (I get all 100 results as successful) but on a Mac, I get wuite a few that fail.
Why is this happening and how do I get around it?
It seems Win7 and Mac OS X block very quick requests to different addressed.
Adding a 1 second timeout works fine

Resources