Click part of the image to store a number in a 2d array representing the rectangles of the image.
Click a rectangle multiple times and it will toggle between 1 and 2.
A colour-coded rectangle appears on the image to show what value was in the array before it was updated.
This is intended as a demo of one way to treat an image as a grid.
var cellData=[],img; //Called when application is started. function OnStart() { //Create a layout with objects vertically centered. var lay = app.CreateLayout( "linear", "VCenter,FillXY" ); //Create image control and add it to layout. img = app.CreateImage( null, 0.9, 0.5 ); img.cellWidth=0.1; img.cellHeight=0.1; img.SetColor("#ff999999"); img.SetOnTouch(imgOnTouch); lay.AddChild( img ); // horizontal layout for buttons var hlay=app.CreateLayout("Linear","Horizontal"); lay.AddChild(hlay); //buttons var btnSave=app.CreateButton("Save"); btnSave.SetOnTouch(btnSaveOnTouch); hlay.AddChild(btnSave); var btnLoad=app.CreateButton("Load"); btnLoad.SetOnTouch(btnLoadOnTouch); hlay.AddChild(btnLoad); var btnClear=app.CreateButton("Clear"); btnClear.SetOnTouch(btnClearOnTouch); hlay.AddChild(btnClear); var btnFresh=app.CreateButton("Refresh"); btnFresh.SetOnTouch(populate); hlay.AddChild(btnFresh); //Add layout to app. app.AddLayout( lay ); //force initial load fro file btnLoadOnTouch(); } //user touched image - update cell function imgOnTouch(ev) { var row,col,val ; if(ev.action==="Down") { row = Math.floor(ev.Y/this.cellHeight); col = Math.floor(ev.X/this.cellWidth); val = getData(row,col); val = (val+1)%2; setData(row,col,val); drawCell(row,col); } } //draw a single value to img function drawCell(row,col) { var val=getData(row,col) var x1 = col*img.cellWidth; var y1 = row*img.cellHeight; var x2 = x1 + img.cellWidth; var y2 = y1 + img.cellHeight; img.SetLineWidth(1); img.SetPaintStyle("Fill") if(val < 0) { img.SetPaintColor("#ffff0000"); img.SetPaintStyle("Line") img.DrawRectangle(x1,y1,x2,y2); } else if(val === 0) { img.SetPaintColor("#ff00ff00"); img.DrawRectangle(x1,y1,x2,y2); } else if(val === 1) { img.SetPaintColor("#ff0000ff"); img.DrawRectangle(x1,y1,x2,y2); } } // draw all data to img function populate() { var row, cell, dataLen, rowLen, i, j; dataLen = cellData.length; img.SetAutoUpdate(false); img.Clear(); img.SetColor("#ff999999"); for(i=0; i<dataLen ;i++) { row = cellData[i]; rowLen = row.length; if(rowLen===0) rowLen=1 ; for(j=0;j<rowLen;j++) { drawCell(i,j); } } img.Update(); img.SetAutoUpdate(true); } // get a value from 2d array function getData(row,col) { var ret; if (cellData.length < row +1) return -1; // represents unset ret = cellData[row][col]; if(ret===undefined||ret===null) return -1; return ret; } //write a value to 2d array function setData(row,col,value) { // create any intervening rows while (cellData.length < row +1) { cellData.push([]); } cellData[row][col]=value; } //save data to file function btnSaveOnTouch() { var data = JSON.stringify(cellData); app.WriteFile("/sdcard/picData",data); } // get data from file and redraw function btnLoadOnTouch() { var data = app.ReadFile("/sdcard/picData"); cellData = JSON.parse(data); populate(); } // clear data and redraw function btnClearOnTouch() { cellData = []; populate(); }