Difference between revisions of "Android Interface/Native Android GUI"
From Free Pascal wiki
Jump to navigationJump to searchSekelsenmat (talk | contribs) |
Sekelsenmat (talk | contribs) |
||
Line 4: | Line 4: | ||
==Android API Hello World in Pascal== | ==Android API Hello World in Pascal== | ||
− | Here is an example Pascal application written for Android. | + | 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: | The full directory structure can be download with this svn command: | ||
− | svn co https://p-tools.svn.sourceforge.net/svnroot/p-tools/ | + | svn co https://p-tools.svn.sourceforge.net/svnroot/p-tools/turbochessclock4android turbochessclock4android |
Here is the Pascal code from this example: | Here is the Pascal code from this example: | ||
<delphi> | <delphi> | ||
− | program | + | { |
+ | A simple Chess Clock application | ||
+ | |||
+ | Author: Felipe Monteiro de Carvalho - 2011 | ||
+ | License: Public Domain | ||
+ | } | ||
+ | program turbochessclock4android; | ||
{$mode objfpc}{$H+} | {$mode objfpc}{$H+} | ||
uses | uses | ||
− | Classes, androidpipescomm, | + | 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 | var | ||
− | layout: | + | layout: TLinearLayout; |
− | params: | + | params: TLayoutParams; |
− | tv: TTextView; | + | 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 | begin | ||
// Here add any initialization. | // Here add any initialization. | ||
Line 34: | Line 98: | ||
// It should mostly contain GUI initialization | // It should mostly contain GUI initialization | ||
// User interface | // User interface | ||
+ | MyEventHandler := TEventHandler.Create; | ||
// Prepares the UI of the program | // Prepares the UI of the program | ||
− | layout := | + | layout := TLinearLayout.Create; |
− | + | params := TLayoutParams.Create(androidview.FILL_PARENT, androidview.FILL_PARENT); | |
− | + | layout.setLayoutParams(params); | |
− | |||
− | |||
− | layout. | ||
params.Free; | 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. | end. | ||
</delphi> | </delphi> |
Revision as of 19:08, 15 February 2011
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>