114 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			114 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			C++
		
	
	
	
| // Viewport Demo
 | |
| 
 | |
| // See viewport_commands tab for details of functions available
 | |
| 
 | |
| // This example uses the viewport commands to create a "virtual TFT" within the
 | |
| // normal TFT display area. This allows a sketch written for a smaller screen to
 | |
| // be run in a viewport window. By default, the graphics 0,0 datum is set to the
 | |
| // top left corner of the viewport, but optionally the datum can be kept at the
 | |
| // corner of the TFT.
 | |
| 
 | |
| // Viewports have a number of potential uses:
 | |
| // -  create a "virtual" TFT screen smaller than the actual TFT screen
 | |
| //  - render GUI items (menus etc) in a viewport, erase GUI item by redrawing whole screen,
 | |
| //    this will be fast because only the viewport will be refreshed (e.g. clearing menu)
 | |
| //  - limit screen refresh to a particular area, e.g. changing numbers, icons or graph plotting
 | |
| //  - showing a small portion of a larger image or sprite, this allows panning and scrolling
 | |
| 
 | |
| // A viewport can have the coordinate datum (position 0,0) either at the top left corner of
 | |
| // the viewport or at the normal top left corner of the TFT.
 | |
| // Putting the coordinate datum at the viewport corner means that functions that draw graphics
 | |
| // in a fixed position can be relocated anywhere on the screen. (see plotBox() below). This
 | |
| // makes it easier to reposition groups of graphical objects (for example GUI buttons) that have
 | |
| // fixed relative positions.
 | |
| 
 | |
| #include <SPI.h>
 | |
| #include <TFT_eSPI.h>
 | |
| 
 | |
| TFT_eSPI tft = TFT_eSPI();
 | |
| 
 | |
| void setup() {
 | |
|   Serial.begin(115200);
 | |
| 
 | |
|   tft.init();
 | |
|   tft.setRotation(1);
 | |
|   tft.fillScreen(TFT_BLACK);
 | |
| }
 | |
| 
 | |
| void loop()
 | |
| {
 | |
|   // Normal Screen
 | |
|   drawX();
 | |
| 
 | |
|   delay(2000);
 | |
| 
 | |
|   // Viewport screen
 | |
|   tft.setViewport(10, 10, 140, 100);
 | |
|   tft.frameViewport(TFT_NAVY, -2);
 | |
|   tft.fillScreen(TFT_BLACK);
 | |
|   drawX();
 | |
|   tft.resetViewport();
 | |
| 
 | |
|   delay(2000);
 | |
| 
 | |
|   //Normal screen
 | |
|   tft.fillScreen(TFT_BLACK);
 | |
|   drawX();
 | |
| 
 | |
|   delay(2000);
 | |
| 
 | |
|   tft.fillScreen(TFT_BLACK);
 | |
| 
 | |
|   // Viewport as a clipping window (false parameter means coordinate datum stays at TFT top left)
 | |
|   tft.setViewport(10, 10, tft.width()/2 - 10, tft.height() - 20, false);
 | |
|   //tft.frameViewport(TFT_NAVY,  2); // Add 2 pixel border inside viewport
 | |
|   //tft.frameViewport(TFT_NAVY, -2); // Add 2 pixel border outside viewport
 | |
|   drawX();
 | |
| 
 | |
|   delay(2000);
 | |
| 
 | |
|   while(1)
 | |
|   {
 | |
|     tft.resetViewport(); // Reset viewport so width() and height() return TFT size
 | |
| 
 | |
|     uint16_t w = 40;
 | |
|     uint16_t h = 40;
 | |
|     uint16_t x = random(tft.width()  - w);
 | |
|     uint16_t y = random(tft.height() - h);
 | |
| 
 | |
|     tft.setViewport(x, y, w, h);
 | |
| 
 | |
|     plotBox();
 | |
| 
 | |
|     delay(0);
 | |
|   }
 | |
| }
 | |
| 
 | |
| void drawX(void)
 | |
| {
 | |
|   tft.fillScreen(tft.color565(25,25,25)); // Grey
 | |
| 
 | |
|   // Draw circle
 | |
|   tft.drawCircle(tft.width()/2, tft.height()/2, tft.width()/4, TFT_RED);
 | |
| 
 | |
|   // Draw diagonal lines
 | |
|   tft.drawLine(0 ,                0, tft.width()-1, tft.height()-1, TFT_GREEN);
 | |
|   tft.drawLine(0 , tft.height()-1, tft.width()-1,                0, TFT_BLUE);
 | |
| 
 | |
|   tft.setTextDatum(MC_DATUM);
 | |
|   tft.setTextColor(TFT_WHITE, tft.color565(25,25,25));
 | |
|   tft.drawString("Hello World!", tft.width()/2, tft.height()/2, 4); // Font 4
 | |
| }
 | |
| 
 | |
| void plotBox(void)
 | |
| {
 | |
|   // These are always plotted at a fixed position but they can 
 | |
|   // be plotted into a viewport anywhere on the screen because
 | |
|   // a viewport can move the screen datum
 | |
|   tft.fillScreen(TFT_BLACK); // When a viewport is set, this just fills the viewport
 | |
|   tft.drawRect(0,0, 40,40, TFT_BLUE);
 | |
|   tft.setTextDatum(MC_DATUM);
 | |
|   tft.setTextColor(TFT_WHITE);
 | |
|   tft.drawNumber( random(100), 20, 23, 4); // Number in font 4
 | |
| }
 |