209 lines
		
	
	
		
			6.3 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			209 lines
		
	
	
		
			6.3 KiB
		
	
	
	
		
			C++
		
	
	
	
/*
 | 
						|
 Example to show how text padding and setting the datum works.
 | 
						|
 | 
						|
 Drawing a numbers at a location can leave the remains of previous numbers.
 | 
						|
 for example drawing 999 then 17 may display as:
 | 
						|
    179 for left datum
 | 
						|
    or
 | 
						|
    917 for right datum.
 | 
						|
 | 
						|
 By setting the correct text padding width and setting a background colour then
 | 
						|
 the plotted numbers will overprint old values.  The padding width must be set
 | 
						|
 to be large enough to cover the old text.
 | 
						|
 | 
						|
 This sketch shows drawing numbers and text both with and without padding.
 | 
						|
 Unpadded text and numbers plot in red.
 | 
						|
 Padded text and numbers plot in green.
 | 
						|
 | 
						|
 Padding works with all plotting datums set by setTextDatum()
 | 
						|
 | 
						|
 The height of the padded area is set automatically by the font used.
 | 
						|
 
 | 
						|
  #########################################################################
 | 
						|
  ###### DON'T FORGET TO UPDATE THE User_Setup.h FILE IN THE LIBRARY ######
 | 
						|
  #########################################################################
 | 
						|
 */
 | 
						|
 | 
						|
#include <SPI.h>
 | 
						|
 | 
						|
#include <TFT_eSPI.h> // Hardware-specific library
 | 
						|
 | 
						|
TFT_eSPI tft = TFT_eSPI();       // Invoke custom library
 | 
						|
 | 
						|
unsigned long drawTime = 0;
 | 
						|
 | 
						|
void setup(void) {
 | 
						|
  tft.begin();
 | 
						|
  tft.setRotation(1);
 | 
						|
}
 | 
						|
 | 
						|
void loop() {
 | 
						|
  int x = 240;
 | 
						|
  int y = 60;
 | 
						|
  byte decimal_places = 1;
 | 
						|
  byte font = 8;
 | 
						|
  
 | 
						|
  tft.fillScreen(TFT_BLACK);
 | 
						|
 | 
						|
  header("Right datum padding demo");
 | 
						|
 | 
						|
  tft.setTextColor(TFT_RED, TFT_BLUE);
 | 
						|
 | 
						|
  tft.setTextDatum(TR_DATUM); // Top Right is datum, so decimal point stays in same place
 | 
						|
                              // any datum could be used
 | 
						|
 | 
						|
  //>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
 | 
						|
  // The value on screen will be wrong as not all digits are over-printed
 | 
						|
  
 | 
						|
  tft.setTextPadding(0); // Setting to zero switches off padding
 | 
						|
 | 
						|
  // Print all numbers from 49.9 to 0.0 in font 8 to show the problem
 | 
						|
  
 | 
						|
  for (int i = 199; i >= 0; i--) {
 | 
						|
    yield(); tft.drawFloat(i/10.0, decimal_places, x, y, font);
 | 
						|
  }
 | 
						|
 | 
						|
  //>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
 | 
						|
  // Now set padding width to be 3 digits plus decimal point wide in font 8
 | 
						|
  // Padding height is set automatically, all numeric digits are the same width
 | 
						|
  // in fonts 1 to 8. The value on screen will now be correct as all digits are over-printed
 | 
						|
 | 
						|
  int padding = tft.textWidth("99.9", font); // get the width of the text in pixels
 | 
						|
  tft.setTextColor(TFT_GREEN, TFT_BLUE);
 | 
						|
  tft.setTextPadding(padding);
 | 
						|
 | 
						|
  for (int i = 199; i >= 0; i--) {
 | 
						|
    yield(); tft.drawFloat(i/10.0, decimal_places, x, y + 140, font); // Use 1 decimal place
 | 
						|
  }
 | 
						|
 | 
						|
  delay(5000);
 | 
						|
 | 
						|
  //>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
 | 
						|
  // Now use integers
 | 
						|
  // The value on screen will be wrong as not all digits are over-printed
 | 
						|
  
 | 
						|
  tft.fillScreen(TFT_BLACK);
 | 
						|
 | 
						|
  header("Left datum padding demo");
 | 
						|
 | 
						|
  tft.setTextColor(TFT_RED, TFT_BLUE);
 | 
						|
 | 
						|
  tft.setTextDatum(TL_DATUM); // Top Left is datum
 | 
						|
                              // any datum could be used
 | 
						|
 | 
						|
  tft.setTextPadding(0); // Setting to zero switches off padding
 | 
						|
 | 
						|
  // Print all numbers from 49.9 to 0.0 in font 8 to show the problem
 | 
						|
  
 | 
						|
  for (int i = 199; i >= 0; i--) {
 | 
						|
    yield(); tft.drawNumber(i, x, y, font);
 | 
						|
  }
 | 
						|
 | 
						|
  //>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
 | 
						|
  // Now set padding width to be 3 digits wide in font 8
 | 
						|
  // Padding height is set automatically, all numeric digits are the same width
 | 
						|
  // in fonts 1 to 8
 | 
						|
  // The value on screen will now be correct as all digits are over-printed
 | 
						|
 | 
						|
  padding = tft.textWidth("999", font); // get the width of the text in pixels
 | 
						|
  tft.setTextColor(TFT_GREEN, TFT_BLUE);
 | 
						|
  tft.setTextPadding(padding);
 | 
						|
 | 
						|
  for (int i = 199; i >= 0; i--) {
 | 
						|
    yield(); tft.drawNumber(i, x, y + 140, font); // Use 1 decimal place
 | 
						|
  }
 | 
						|
 | 
						|
  delay(5000);
 | 
						|
 | 
						|
  //>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
 | 
						|
  // Now use integers with a centred datum
 | 
						|
  // The value on screen will be wrong as not all digits are over-printed
 | 
						|
  
 | 
						|
  tft.fillScreen(TFT_BLACK);
 | 
						|
 | 
						|
  header("Centre datum padding demo");
 | 
						|
  
 | 
						|
  tft.setTextColor(TFT_RED, TFT_BLUE);
 | 
						|
 | 
						|
  tft.setTextDatum(TC_DATUM); // Top Centre is datum
 | 
						|
                              // any datum could be used
 | 
						|
 | 
						|
  tft.setTextPadding(0); // Setting to zero switches off padding
 | 
						|
 | 
						|
  // Print all numbers from 49.9 to 0.0 in font 8 to show the problem
 | 
						|
  
 | 
						|
  for (int i = 199; i >= 0; i--) {
 | 
						|
    yield(); tft.drawNumber(i, x, y, font);
 | 
						|
  }
 | 
						|
 | 
						|
  //>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
 | 
						|
  // Now set padding width to be 3 digits wide in font 8
 | 
						|
  // Padding height is set automatically, all numeric digits are the same width
 | 
						|
  // in fonts 1 to 8
 | 
						|
  // The value on screen will now be correct as all digits are over-printed
 | 
						|
 | 
						|
  padding = tft.textWidth("999", font); // get the width of the text in pixels
 | 
						|
  tft.setTextColor(TFT_GREEN, TFT_BLUE);
 | 
						|
  tft.setTextPadding(padding);
 | 
						|
 | 
						|
  for (int i = 199; i >= 0; i--) {
 | 
						|
    yield(); tft.drawNumber(i, x, y + 140, font); // Use 1 decimal place
 | 
						|
  }
 | 
						|
 | 
						|
  delay(5000);
 | 
						|
 | 
						|
  //>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
 | 
						|
  // Now use text over-printing by setting the padding value
 | 
						|
  // Previous text is not wiped by a shorter string
 | 
						|
 | 
						|
  tft.fillScreen(TFT_LIGHTGREY);
 | 
						|
 | 
						|
  header("Centred datum text padding demo");
 | 
						|
  
 | 
						|
  tft.setTextSize(2); // Any text size muliplier will work
 | 
						|
  
 | 
						|
  tft.setTextColor(TFT_RED, TFT_BLUE);
 | 
						|
 | 
						|
  tft.setTextDatum(TC_DATUM); // Top Centre is datum
 | 
						|
                              // any datum could be used
 | 
						|
 | 
						|
  tft.setTextPadding(0); // Setting to zero switches off padding
 | 
						|
 | 
						|
  tft.drawString("Quick brown", x, y, 4);
 | 
						|
  delay(2000);
 | 
						|
  tft.drawString("fox", x, y, 4);
 | 
						|
 | 
						|
  delay(2000);
 | 
						|
  
 | 
						|
  // Now set padding width to longest string
 | 
						|
  // Previous text will automatically be wiped by a shorter string!
 | 
						|
  font = 4;
 | 
						|
 | 
						|
  padding = tft.textWidth("Quick brown", font); // get the width of the widest text in pixels
 | 
						|
                                                // could set this to any number up to screen width
 | 
						|
  tft.setTextPadding(padding);
 | 
						|
 | 
						|
  tft.setTextColor(TFT_GREEN, TFT_BLUE);
 | 
						|
  
 | 
						|
  tft.drawString("Quick brown", x, y+80, font);
 | 
						|
  delay(2000);
 | 
						|
  tft.drawString("fox", x, y+80, font);
 | 
						|
 | 
						|
  delay(5000);
 | 
						|
}
 | 
						|
 | 
						|
// Print the header for a display screen
 | 
						|
void header(const char *string)
 | 
						|
{
 | 
						|
  tft.setTextSize(1);
 | 
						|
  tft.setTextColor(TFT_MAGENTA, TFT_BLACK);
 | 
						|
  tft.setTextDatum(TC_DATUM);
 | 
						|
  tft.drawString(string, 240, 10, 4);
 | 
						|
 
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
 | 
						|
 | 
						|
 |