bluebonnet/Demos/Android_FS/MainActivity.fs

93 lines
3.0 KiB
Forth
Raw Permalink Normal View History

2020-08-26 11:23:24 +03:00
namespace com.spaceflint.bluebonnet.fsharp
open SpaceFlint.Demos
type MainActivity() =
inherit android.app.Activity()
let initTimer (view : android.view.View) =
let mutable runnable : java.lang.Runnable = null
runnable <- (new java.lang.Runnable.Delegate (fun () ->
view.invalidate()
view.postDelayed(runnable, 16L) |> ignore
)).AsInterface()
view.postDelayed(runnable, 16L) |> ignore
()
override this.onCreate(savedInstanceState: android.os.Bundle) =
base.onCreate(savedInstanceState)
base.getWindow().setFlags(android.view.WindowManager.LayoutParams.FLAG_FULLSCREEN,
android.view.WindowManager.LayoutParams.FLAG_FULLSCREEN)
base.requestWindowFeature(android.view.Window.FEATURE_NO_TITLE) |> ignore
let canvasView = new CanvasView(this)
this.setContentView canvasView
canvasView.requestFocus() |> ignore
SpaceFlint.Demos.Points.myInitialize canvasView
initTimer canvasView
and CanvasView(context) =
inherit android.view.View(context)
let paint = new android.graphics.Paint()
let mutable frameCallback : System.Action = null
let mutable frameCanvas : android.graphics.Canvas = null
let mutable frameSize : (int * int) = (0, 0)
do
paint.setColor(android.graphics.Color.RED)
paint.setAntiAlias(true)
paint.setStrokeWidth(4.0f)
paint.setTextSize(30.0f)
let drawCenter text yMultiply =
let r = new android.graphics.Rect()
frameCanvas.getClipBounds(r) |> ignore
paint.setTextAlign(android.graphics.Paint.Align.LEFT)
paint.getTextBounds(string text, 0, (string text).Length, r)
let (frameWidth, frameHeight) = frameSize
let x = single frameWidth / 2.0f
- single (r.width()) / 2.0f
- single (r.left)
let y = single frameHeight / 2.0f
+ single (r.height()) * single yMultiply / 2.0f
- single r.bottom
frameCanvas.drawText(text, x, y, paint)
override this.onDraw(canvas) =
frameCanvas <- canvas
frameSize <- (canvas.getWidth(), canvas.getHeight())
paint.setColor(0x7FFF0000)
drawCenter "Bluebonnet Demo" -4.0f
drawCenter "Android - F#" 4.0f
frameCallback.Invoke()
interface HAL with
member this.Frame frameCallbackArg =
frameCallback <- frameCallbackArg
()
member this.Pixel (x, y, r, g, b) =
let clamp (a:single) b = System.Math.Min(System.Math.Max(int (a * single b), 0), b - 1)
let (frameWidth, frameHeight) = frameSize
let x1 = clamp x frameWidth
let y1 = clamp y frameHeight
let r1 = clamp r 256
let g1 = clamp g 256
let b1 = clamp b 256
paint.setColor((0xFF <<< 24) ||| (r1 <<< 16) ||| (g1 <<< 8) ||| b1)
frameCanvas.drawPoint(single x1, single y1, paint)
member this.Random () = single (java.lang.Math.random())