Skip to main content

Building a Lightweight Speedometer in React Native

Introduction

This article demonstrates the building of a simple and lightweight Speedometer implementation in React Native with minimal dependencies.
  • Basic Requirements
  • Default Props Overview
  • Utils
  • Integrating into the Component
  • Usage
  • Links
The only external dependency required is the prop-types package for Type Checking or Prop Validation.
Other than that, we need one custom speedometer needle image.

Basic Requirements

The only external dependency required is the prop-types package for Type Checking or Prop Validation.
Other than that, we need one custom speedometer needle image.

Default Props Overview

value: Current value
defaultValue: Initial value
minValue: Minimum limit
maxValue: Maximum limit
easeDuration: Ease duration of the needle animation
labels: List of labels with color
needleImage: Absolute path to the needle image

Utils

There are three types of Utility functions that are required.
  • Calculate Degree from Labels
  • Calculate Labels from Value
  • Limit Value

Calculate Degree from Labels

This Simple Utility function will return the per label degree from the list of labels.
The total degree of the circle is divided by labels length to give per level degree.

Calculate Labels from Value

This Utility function will return the current label from the list of labels based on the current value of the speedometer.
Image Credit: Carbon.
First, the value of the speedometer is normalized to a percentage based on the maxValue and the minValue.
Then the current index of the label is calculated by multiplying it to the length of the labels list. (The index is always 1 less than the actual).
At last, we can return the label from the list based on the calculated index.

Limit Value

This Utility function is used to limit the current value between maxValue and minValue .

Integrating into the Component

Adding the Styles

wrapper: Wrapper styles.
outerCircle: Outer Circle styles.
innerCircle: Inner Circle styles.
halfCircle: Used to build label blocks between outer and inner circle.
imageWrapper: Speedometer Needle Image Wrapper styles.
image: Speedometer Needle Image styles.
label: Label styles.
labelNote: Label note styles.

Constructing the static component based on the styles

By adding this your, component speedometer will look like this
The reason to add style objects in an array is that we’ll be appending more styles to it later on.

Adding the Utils

The initial degree is set to 180 for a semi-circle.
Now we get the perLevelDegree and label based on the value supplied as the props.
circleDegree is calculated for each halfCircle style based on the current label index and the perLevelDegree90 is added to it because our circle starts as a semi-circle.
The background color of our half circle is set based on the label that we get from our util.
Next we use transforms to position and rotate our block based on the circleDegree.
Adding the above changes will make the speedometer will something look like this

Adding the Animations

First we need to initialize the speedometer value in the constructor. Then, we add the animations based on the current value limited by our utility function.
The output range is set in between -90deg to 90deg for the needle to animate.
Now this component is ready to be exported and used.

Usage

After making the necessary changes and updating value based on the TextInput the component will look like this.

Links

The complete code can be found on Github or npm as react-native-speedometer package.
Thanks for reading. If you liked this article,  share with other people  and please on comment.

Comments

  1. In this manner my friend Wesley Virgin's report launches in this SHOCKING and controversial VIDEO.

    You see, Wesley was in the army-and soon after leaving-he revealed hidden, "SELF MIND CONTROL" tactics that the CIA and others used to get whatever they want.

    THESE are the EXACT same secrets many famous people (notably those who "come out of nothing") and the greatest business people used to become wealthy and successful.

    You probably know that you use only 10% of your brain.

    Really, that's because the majority of your brain's power is UNCONSCIOUS.

    Maybe that thought has even taken place INSIDE OF YOUR own head... as it did in my good friend Wesley Virgin's head around seven years ago, while driving an unlicensed, beat-up trash bucket of a vehicle without a driver's license and with $3 on his banking card.

    "I'm so fed up with going through life check to check! Why can't I turn myself successful?"

    You've been a part of those those conversations, ain't it so?

    Your success story is waiting to start. Go and take a leap of faith in YOURSELF.

    Learn How To Become A MILLIONAIRE Fast

    ReplyDelete

Post a Comment

Thank You.

Popular Posts

Reloading UITableView while Animating Scroll in iOS 11

Reloading UITableView while Animating Scroll Calling  reloadData  on  UITableView  may not be the most efficient way to update your cells, but sometimes it’s easier to ensure the data you are storing is in sync with what your  UITableView  is showing. In iOS 10  reloadData  could be called at any time and it would not affect the scrolling UI of  UITableView . However, in iOS 11 calling  reloadData  while your  UITableView  is animating scrolling causes the  UITableView  to stop its scroll animation and not complete. We noticed this is only true for scroll animations triggered via one of the  UITableView  methods (such as  scrollToRow(at:at:animated:) ) and not for scroll animations caused by user interaction. This can be an issue when server responses trigger a  reloadData  call since they can happen at any moment, possibly when scroll animation is occurring. Example of s...

What are the Alternatives of device UDID in iOS? - iOS7 / iOS 6 / iOS 5 – Get Device Unique Identifier UDID

Get Device Unique Identifier UDID Following code will help you to get the unique-device-identifier known as UDID. No matter what iOS user is using, you can get the UDID of the current iOS device by following code. - ( NSString *)UDID { NSString *uuidString = nil ; // get os version NSUInteger currentOSVersion = [[[[[UIDevice currentDevice ] systemVersion ] componentsSeparatedByString: @" . " ] objectAtIndex: 0 ] integerValue ]; if (currentOSVersion <= 5 ) { if ([[ NSUserDefaults standardUserDefaults ] valueForKey: @" udid " ]) { uuidString = [[ NSUserDefaults standardDefaults ] valueForKey: @" udid " ]; } else { CFUUIDRef uuidRef = CFUUIDCreate ( kCFAllocatorDefault ); uuidString = ( NSString *) CFBridgingRelease ( CFUUIDCreateString ( NULL ,uuidRef)); CFRelease (uuidRef); [[ NSUserDefaults standardUserDefaults ] setObject: uuidString ForKey: @" udid " ]; [[ NSUserDefaults standardUserDefaults ] synchro...

Xcode & Instruments: Measuring Launch time, CPU Usage, Memory Leaks, Energy Impact and Frame Rate

When you’re developing applications for modern mobile devices, it’s vital that you consider the performance footprint that it has on older devices and in less than ideal network conditions. Fortunately Apple provides several powerful tools that enable Engineers to measure, investigate and understand the different performance characteristics of an application running on an iOS device. Recently I spent some time with these tools working to better understand the performance characteristics of an eCommerce application and finding ways that we can optimise the experience for our users. We realised that applications that are increasingly performance intensive, consume excessive amounts of memory, drain battery life and feel uncomfortably slow are less likely to retain users. With the release of iOS 12.0 it’s easier than ever for users to find applications that are consuming the most of their device’s finite amount of resources. Users can now make informed decisions abou...