Android Interface/Native Android GUI

From Lazarus wiki
Revision as of 19:08, 15 February 2011 by Sekelsenmat (talk | contribs)
Jump to navigationJump to search

Go back to Android Interface

Android API Hello World in Pascal

Here is an example Pascal application written for Android. It shows how to create controls, receive callback events and how to use the timer.

The full directory structure can be download with this svn command:

 svn co https://p-tools.svn.sourceforge.net/svnroot/p-tools/turbochessclock4android turbochessclock4android

Here is the Pascal code from this example:

<delphi> {

 A simple Chess Clock application
 Author: Felipe Monteiro de Carvalho - 2011
 License: Public Domain

} program turbochessclock4android;

{$mode objfpc}{$H+}

uses

 Classes, SysUtils, androidpipescomm, androidview, javalang,
 androidapp, androidtimer, androidutil;

type

 TEventHandler = class
 public
   procedure HandleOnTimer(ASender: TObject);
   procedure buttonStartClickCallback(v: TView);
   procedure buttonMoveClickCallback(v: TView);
 end;

var

 layout: TLinearLayout;
 params: TLayoutParams;
 tv, black_label, white_label: TTextView;
 scroller: TScrollView;
 btn_move, btn_start: TButton;
 tp: TTimePicker;
 WhiteTimeCount: Integer = 0;
 BlackTimeCount: Integer = 0;
 MyTimer: TAndroidTimer;
 MyEventHandler: TEventHandler;
 IsWhitePlayerMove: Boolean = True;

procedure TEventHandler.buttonStartClickCallback(v: TView); begin

 black_label.setVisibility(VISIBLE);
 white_label.setVisibility(VISIBLE);
 btn_move.setVisibility(VISIBLE);
 //
 WhiteTimeCount := tp.getCurrentHour() * 60 * 60 + tp.getCurrentMinute() * 60;
 BlackTimeCount := WhiteTimeCount;
 //
 MyTimer.removeCallbacks();
 MyTimer.postDelayed(100);

end;

procedure TEventHandler.buttonMoveClickCallback(v: TView); begin

 IsWhitePlayerMove := not IsWhitePlayerMove;

end;

procedure TEventHandler.HandleOnTimer(ASender: TObject); var

 lSeconds, lMinutes, lHours: Integer;

begin // Inc(TimerCount);

 if IsWhitePlayerMove then
 begin
   lSeconds := WhiteTimeCount mod 60;
   lMinutes := (WhiteTimeCount mod (60 * 60)) div 60;
   lHours := WhiteTimeCount div (60 * 60);
   white_label.setText(Format('White %d:%d:%d', [lHours, lMinutes, lSeconds]));
   Dec(WhiteTimeCount);
 end
 else
 begin
   lSeconds := BlackTimeCount mod 60;
   lMinutes := (BlackTimeCount mod (60 * 60)) div 60;
   lHours := BlackTimeCount div (60 * 60);
   black_label.setText(Format('White %d:%d:%d', [lHours, lMinutes, lSeconds]));
   Dec(BlackTimeCount);
 end;
 //
 MyTimer.removeCallbacks();
 MyTimer.postDelayed(1000);

end;

begin

 // Here add any initialization.
 // Any initialization code will be run inside Activity.onCreate,
 // so keep it as short as possible!
 // It should mostly contain GUI initialization
 // User interface
 MyEventHandler := TEventHandler.Create;
 // Prepares the UI of the program
 layout := TLinearLayout.Create;
 params := TLayoutParams.Create(androidview.FILL_PARENT, androidview.FILL_PARENT);
 layout.setLayoutParams(params);
 params.Free;
 layout.setOrientation(androidview.VERTICAL);
 // Game UI
 black_label := TTextView.Create;
 black_label.setText('Black time:');
 black_label.setVisibility(GONE);
 black_label.setTextSize(COMPLEX_UNIT_PX, 40);
 layout.addView(black_label);
 white_label := TTextView.Create;
 white_label.setText('White time:');
 white_label.setVisibility(GONE);
 white_label.setTextSize(COMPLEX_UNIT_PX, 40);
 layout.addView(white_label);
 btn_move := TButton.Create;
 btn_move.setText('Move finished!');
 btn_move.setOnClickListener(@MyEventHandler.buttonMoveClickCallback);
 btn_move.setVisibility(GONE);
 layout.addView(btn_move);
 // Config UI
 tv := TTextView.Create;
 tv.setText('Please select how much to give to the players and press "Start Game":');
 layout.addView(tv);
 tp := TTimePicker.Create;
 tp.setIs24HourView(True);
 tp.setCurrentHour(0);
 tp.setCurrentMinute(30);
 layout.addView(tp);
 btn_start := TButton.Create;
 btn_start.setText('Start game!');
 btn_start.setOnClickListener(@MyEventHandler.buttonStartClickCallback);
 layout.addView(btn_start);
 // And also allow the user to scroll the UI if it is larger then the screen width
 // Scrolling takes place only horizontally
 scroller := TScrollView.Create;
 scroller.addView(layout);
 Activity.setContentView(scroller);
 MyTimer := TAndroidTimer.Create;
 MyTimer.OnTimer := @MyEventHandler.HandleOnTimer;
 // Now tell Java that the initialization has finished
 vAndroidPipesComm.onCreateFinished();
 // Here you can add any other initialization,
 // specially non-GUI code
 // Now we block our execution waiting for callbacks from Java
 vAndroidPipesComm.MessageLoop();

end. </delphi>