nativescriptusing native widget

Using surfaceView in ng2-TNS-Android : step by step

For example you want to use surfaceView in ng2-nativescript. As we don't have surfaceView in nativescript we should use placeholder.

first we should import the requirements:

import {Component} from "@angular/core";
import placeholder = require("ui/placeholder");
let application= require("application");

then add the placeholder to your html file:

<Placeholder (creatingView)="creatingView($event)"></Placeholder>

Add this method to your class:

public creatingView(args: any) {
  var nativeView = new android.view.SurfaceView(application.android.currentContext);
  args.view = nativeView;
}

typescript doesn't know what is android and we should add platform declaration files follow this Answer to add them.

because of a problem in current version of ng2-nativescript we should do some extra work:

change the placeholder to :

<Placeholder  *ngIf="init" (creatingView)="creatingView($event)"></Placeholder>

Import OnInit:

import {Component,OnInit} from "@angular/core";

your class should implement OnInit

export class AppComponent implements OnInit

and add these lines to your class:

public init: boolean = false;
ngOnInit() {
    this.init = true;
}

now you have a surfaceView in your nativescript app :)

Call methods of SurfaceView

For example you want to call getHolder():

add a variable and loaded event to your placeholder like this:

  <Placeholder  #surface *ngIf="init" (creatingView)="creatingView($event)" (loaded)="onLoaded(surface)"></Placeholder>

and add the onLoaded method to your class:

 onLoaded(element){
  let mSurface = element.android;
  let holder =  mSurface.getHolder();
}

ATTENTION:

It's not guaranteed that android property (element.android) will be available in ngAfterViewInit so we used loaded event instead of that.

Using surfaceView in ng2-TNS-Android : whole ready example

app.component.ts:

import {Component,OnInit} from "@angular/core";
import placeholder = require("ui/placeholder");
let application= require("application");

@Component({
    selector: "my-app",
    templateUrl: "app.component.html",
})
export class AppComponent implements OnInit{

  public creatingView(args: any) {
    var nativeView = new android.view.SurfaceView(application.android.currentContext);
    args.view = nativeView;
  }

  onLoaded(element){
    let mSurface = element.android;
    let holder =  mSurface.getHolder();
  }

  public init: boolean = false;
    ngOnInit() {
        this.init = true;
    }
}

app.component.html :

<StackLayout>
   <Placeholder  #surface *ngIf="init" (creatingView)="creatingView($event)" (loaded)="onLoaded(surface)"></Placeholder>
</StackLayout>