UI https://omedia.dev/ en Basics of Interaction Design and Animation https://omedia.dev/blog/basics-interaction-design-and-animation <span>Basics of Interaction Design and Animation</span> <span><span lang="" about="/user/6" typeof="schema:Person" property="schema:name" datatype="">Baso Kamladze</span></span> <span>Wed, 07/20/2022 - 15:08</span> <div class="f-body om-text-content"> <p>It’s really hard to surprise someone In today’s world of UI, especially with user interface animations. Animation is one of the key tools in interaction design, it helps us understand how to interact with interface elements, it shows connections between elements/screens, and it focuses us on changes. Long story short, today I want to talk a bit about 4 basic principles of animation — speed, blur, easing, and choreography — and how we adapt them in the interface design.</p> <img alt="Principles" data-entity-type="file" data-entity-uuid="5859c438-33d2-49a8-a07a-db91f8a3c3d8" src="/sites/default/files/inline-images/02%20Principles.png" class="align-center" width="1330" height="1050" loading="lazy" /> <h2>Speed &amp; Duration</h2> <p>Speed and duration are the key components of animation. When there is a change, it’s important to get the user's focus on that. So we use animation for this purpose, we are making the change slower and smoother to make changes clear (but we still need to be cautious not to make it too slow, which will distract the user and cause frustration).</p> <p>The researchers have found that the optimal and acceptable speed for interface/interaction animation is from 100ms to 500ms (that's milliseconds, one-thousandth of a second) — it’s enough to focus on what’s changed and also not to make it boring). While animation faster than 100ms gives an illusion that things are changing immediately, animations that last more than a second are considered annoying and a cause of the user's frustration.</p> <img alt="Animation speeds" data-entity-type="file" data-entity-uuid="4b2e7851-89b0-4eba-b7d6-605e96e7e8d4" src="/sites/default/files/inline-images/03%20Speeds.gif" class="align-center" width="1330" height="700" loading="lazy" /> <p>So let’s take Google's <a href="https://material.io/design">Material Design</a> as an example. They use animation speeds between 100-500ms and this range is even smaller on mobile — 100-300ms. Sure, they’ve made several changes in the new Material 3 (You), animations are now much longer, but they are also more complex. Because of this complexity, there are several transformations involved in each interaction, so this is the reason why the total animation time goes from 200ms to up to 500ms in some cases. Yeah, those are some basics, but actually, each interaction has different speeds and durations on different devices. For example, the block entering the screen takes 250ms in mobile apps; the same interaction on tablets is 30% slower (300-350ms), and on a smartwatch, it’s 30-50% faster (100-150ms). Note that this applies to scale- and position-related animations, but for the icon and some other micro-interactions, speed is a constant 100ms on every device. The reason for that is simple — the bigger the screen size, the larger the distance an object has to travel.</p> <img alt="Open/Close time difference" data-entity-type="file" data-entity-uuid="7853ec12-4d34-4d0c-90b2-5b2cad1f6cbc" src="/sites/default/files/inline-images/04%20iMac.gif" class="align-center" width="660" height="660" loading="lazy" /> <h2>Acceleration</h2> <p>Let’s get back to the main topic:</p> <img alt="Acceleration" data-entity-type="file" data-entity-uuid="5ab7a729-a90b-4def-bffb-9d0c92535f53" src="/sites/default/files/inline-images/05%20Acceleration.gif" class="align-center" width="1745" height="1080" loading="lazy" /> <p>The first rule of interface animation is that animation speed increases proportionally to the distance. So for example, a 100px block has to travel for 200px and its timing is 200ms (traveling with 1px/ms speed), but if the travel distance is 400px, the timing won't be 400ms, and the speed will be accelerated and the animation will take about 300ms (so the speed will be 1.5px/ms in this case).</p> <p>Animation speed and duration don’t depend on only the distance, but also on object size. Smaller elements are faster because they move more in an empty space than the bigger ones. For better visualization see the image below:</p> <img alt="Small objects move faster" data-entity-type="file" data-entity-uuid="dffcd03e-6dcb-475e-b908-73f28c682cc7" src="/sites/default/files/inline-images/06%20Smaller%20is%20Faster.png" class="align-center" width="1330" height="700" loading="lazy" /> <h2>Blur</h2> <p>In general, the motion blur is used for a better and smoother animation, which adds life to the animation. But this is not the case in the interface animation. The animation is driven by the user’s action, aimed at increasing engagement and attention, motion blur will cause the loss of focus from what’s changed. Plus it’s hard to implement.</p> <img alt="motion blur" data-entity-type="file" data-entity-uuid="f38ab91d-2ef5-45d2-b705-51ff7fbae48f" src="/sites/default/files/inline-images/07%20Motion%20Blur.gif" class="align-center" width="1745" height="1080" loading="lazy" /> <h2>Easing</h2> <p>Everything in digital is inspired by the natural, physical world. To make the animation feel non-mechanical, but smooth and pleasant, it needs to have some kind of speed changes (i.e. easing). Easing gives movement (animation) a natural feel and connects it with the physical world. This is one of the main principles of animation.</p> <p>There are several types of easing and I’m gonna discuss some of them below:</p> <h3>Linear Motion</h3> <img alt="Linear easing" data-entity-type="file" data-entity-uuid="039ea711-a38e-4cd4-ac2f-1971eda5f81c" src="/sites/default/files/inline-images/09%20Linear%20Motion.png" class="align-center" width="1330" height="700" loading="lazy" /> <p>The motion is linear when the object moves without physical impact (without acceleration). This type of motion is not natural and we don’t see it in real life, so it doesn't look pleasant to the human eye. We can use this type of animation only in cases when we need some static motions, like loaders, in other cases we don’t use it in the interface.</p> <h3>Ease-in</h3> <img alt="ease-in motion" data-entity-type="file" data-entity-uuid="9a7c223b-fe52-4cd7-a3eb-5be5eb7e06a4" src="/sites/default/files/inline-images/10%20Ease-in.png" class="align-center" width="1330" height="700" loading="lazy" /> <p>In this case, the object starts moving faster, but decelerates and becomes slower to the end.</p> <p>We use this type of animation when an object/card is moving out of the screen and it won’t get back on the screen, so it’s for outgoing animations to get the user’s attention and show that this object is going and won’t return back. We don't want to bore the user, because they won’t have more connections with this card.</p> <p>The main point of animation is to make a mood in the interface, even too small changes on the curves can make slightly different animations and interactions.</p> <h3>Ease-out</h3> <img alt="Ease-out" data-entity-type="file" data-entity-uuid="915f5bc7-aa41-494c-9ff7-e993ad7e92b5" src="/sites/default/files/inline-images/11%20Ease-out_0.png" class="align-center" width="1330" height="700" loading="lazy" /> <p>This is the reverse variant of ease-in, in this case, the animation starts faster, and then it becomes slower in the end. It’s mostly used for incoming objects to get the user's attention.</p> <h3>Ease-in-out</h3> <img alt="Ease-in-out" data-entity-type="file" data-entity-uuid="91480bd3-8531-4577-92a5-30b28a3f4160" src="/sites/default/files/inline-images/12%20Ease-in-out_0.png" class="align-center" width="1330" height="700" loading="lazy" /> <p>It’s a standard curve, which starts slowly, accelerates, and then continues slowly in the end as well. In most cases, it’s used to get the user's attention on every movement and change. Sometimes we use a slightly modified variant of this motion, which is called an asymmetric curve (it’s a bit faster in the beginning, then in the end, or vice versa).</p> <h2>Choreography</h2> <p>The choreography is the sequence, formation and continuity of animating elements to give the user the correct focus and to make transitions from one element to another.</p> <h3>Sequence</h3> <img alt="Sequence" data-entity-type="file" data-entity-uuid="e76505db-4b90-48c1-9378-195dab9705c3" src="/sites/default/files/inline-images/13%20Sequence.png" class="align-center" width="1330" height="700" loading="lazy" /> <p>The sequence is an interaction, which shows the user what’s changing during the animation, from the starting point till the end, shows the whole process of animation, how the transition has started, what was changed, how it was changed, and what is the last result of the animation.</p> <h3>Element types</h3> <p>1. Outgoing elements - Things that disappear from the screen.</p> <img alt="outgoing elements" data-entity-type="file" data-entity-uuid="15f8ccfc-2eb9-487f-ad1e-7c113bac2e83" src="/sites/default/files/inline-images/14%20Outgoing%20Elements.gif" class="align-center" width="1194" height="768" loading="lazy" /> <p>2. Incoming elements - Things that are appearing or incoming on the screen.</p> <img alt="incoming elements" data-entity-type="file" data-entity-uuid="3b278c8f-d631-4df0-81fd-d8f8dc3e9b30" src="/sites/default/files/inline-images/15%20Incoming%20Elements.gif" class="align-center" width="1194" height="768" loading="lazy" /> <p>3. Persistent elements - These are elements, which are always on the screen, but sometimes they change shape, size, and position, but they never leave the screen.</p> <img alt="persistant elements" data-entity-type="file" data-entity-uuid="5ada49bd-cb74-406c-b8bf-52519ac9fd60" src="/sites/default/files/inline-images/16%20Persistent%20Elements.gif" class="align-center" width="1194" height="768" loading="lazy" /> <h3>Continuity</h3> <img alt="Good continuity" data-entity-type="file" data-entity-uuid="46812719-b9e5-40a7-ad01-b7392bd196d0" src="/sites/default/files/inline-images/17%20Continuity%20-%20Good.gif" class="align-center" width="1745" height="1080" loading="lazy" /><img alt="Bad continuity" data-entity-type="file" data-entity-uuid="644c5257-f269-4e11-bb87-6acb62f3e3b8" src="/sites/default/files/inline-images/18%20Continuity%20-%20Bad.gif" class="align-center" width="1745" height="1080" loading="lazy" /> <p>Animation needs to be continuous, especially when it’s used on multiple elements (like lists, cards, etc). Animation continuity means that an element starts moving about 50% earlier than the previous one ends, or else the elements will jump around and will irritate the user (unless it’s a case where elements have very fast transitions, 20-25ms).</p> <hr /> <p>I’ve tried to write a bit about the animation basics in digital products and if you’ll like it I’m gonna try to write another post about animation, with more detail, about its use in different design systems or devices, about patterns and the best practices, and about its psychological side.</p> <p>Thanks! 😊</p> <blockquote> <p>P.S. If you're interested in animation beyond interaction design, go ahead and read an amazing book <em><a href="https://en.wikipedia.org/wiki/Disney_Animation:_The_Illusion_of_Life">The Illusion of Life</a></em> by Frank Thomas and Ollie Johnston, key animators at Disney during the Golden Age of American animation. There is also <a href="https://vimeo.com/93206523">a short video</a> based on the 12 basic principles of animation described in the book.</p> </blockquote> </div> <div> <div><a href="/topic/animation" class="e-tag-logo-tag"> Animation </a> </div> <div><a href="/topic/ui" class="e-tag-logo-tag"> UI </a> </div> <div><a href="/topic/ux" class="e-tag-logo-tag"> UX </a> </div> </div> <div> <img src="/sites/default/files/styles/blog_full/public/2022-07/01%20blog-bg.png?itok=GkCLcM4J" width="1330" height="700" alt="" loading="lazy" typeof="foaf:Image" /> </div> <div id="field-language-display"><div class="js-form-item form-item js-form-type-item form-item- js-form-item-"> <label>Language</label> English </div> </div> Wed, 20 Jul 2022 11:08:05 +0000 Baso Kamladze 79 at https://omedia.dev Classic Tables vs Lists on Touch Devices https://omedia.dev/blog/classic-tables-vs-lists-touch-devices <span>Classic Tables vs Lists on Touch Devices</span> <span><span lang="" about="/user/6" typeof="schema:Person" property="schema:name" datatype="">Baso Kamladze</span></span> <span>Fri, 07/24/2020 - 18:28</span> <div class="f-body om-text-content"> <p>Data is useless without proper arrangement, visualization, and tools. When designing data-driven user interfaces, it’s critical for the final product to be easy to act and interact with, to scan and understand the connection with its parts. Every type of data can be hard to visualize, but large datasets in enterprise applications are especially complex to break down.</p> <p>There are multiple proven ways of presenting large datasets, like tables, lists, graphs, or charts. But right now, let’s focus on the data that needs to be displayed in a highly detailed manner, with granular filtering and sorting capabilities. With these requirements, classic Data Tables and Data Lists come to mind.</p> <p>Data Tables have been around for ages and we’ve come a long way since the first tables of data displayed on the plain text-only terminal interfaces. There are lots of design patterns and time-tested solutions for the data table layout and mechanics, but in this post, I want to highlight my experience and what I’ve learned by working with classic Data Tables vs Lists on touch native, small-screen devices.</p> <h2>Classic Data Tables</h2> <p>When there is a need of displaying lots of attributes for a large number of data points (for example, the list of machines with their technical properties, deployment status, ownership details, etc), the go-to solution is to display it with a Data Table. With this approach you can benefit from the maximum available screen space, it’s easy for grouping and organizing information, making it scannable, comparable, and digestible. Also, Data Tables are relatively easy to develop and tables, in general, are native for most of the users from real-life — tables are everywhere, from school grade sheets to medical test results and simplest Excel documents.</p> <img alt="Table" data-entity-type="file" data-entity-uuid="c1d83562-f128-443d-b131-56cd679b5b7e" src="/sites/default/files/inline-images/01.jpeg" class="align-center" width="2400" height="1606" loading="lazy" /> <p>Tables make it easy to filter, sort, manipulate, and take actions on the data. Bulk actions are natural for data tables as well — like selecting multiple rows and performing actions on the selection with a single click.</p> <p>At first glance, everything seems awesome, right? That’s mostly true, for devices with larger screens (desktops or laptops) this works really well, because:</p> <ol> <li>The widescreen size allows you to show a large amount of information in a single row and also, to show a lot of rows in a single screen. So users can scan and compare information efficiently.</li> <li>For interaction, we use a mouse. With this, we benefit from the precise mouse pointer, giving users the ability to interact with small objects, which makes it perfectly usable to have smaller, more tightly packed controls in the UI. Also, with the mouse, we have the “hover state”, that we can leverage for displaying contextual information or actions only when we need them.</li> </ol> <figure role="group" class="align-center"> <img alt="Data table on a large screen, where everything fits just fine." data-entity-type="file" data-entity-uuid="e6241e87-bf8a-4a67-8d81-86450518c343" src="/sites/default/files/inline-images/02.jpeg" width="1330" height="1050" loading="lazy" /> <figcaption>Data table on a large screen, where everything fits just fine.</figcaption> </figure> <p>Now enter the Touch Devices — tablets, phablets, smartphones, and other gadgets with a finger as a pointing device and no abundant screen real estate.</p> <p>In this realm, small arrows which we were using for sorting become useless — tapping on tiny objects with our fat fingers is difficult and error-prone. This particular problem can be solved by making the sorting arrows a single control. Tapping the ‘merged’ button can cycle its state through sorting directions.</p> <p>As for the table itself, the available screen width on smaller devices becomes the main villain. Keeping the table layout and making its container horizontally scrollable might be a viable option in some cases. But most of the time, the ‘scannability’ of each row is an important feature, which gets lost if you have to scroll horizontally just to see all columns of a single row.</p> <figure role="group" class="align-center"> <img alt="Data table on a mobile device with horizontal scrolling. Meh." data-entity-type="file" data-entity-uuid="887c22f3-9126-48e9-a086-1d4f8a76c2d4" src="/sites/default/files/inline-images/03.jpeg" width="1330" height="1050" loading="lazy" /> <figcaption>Data table on a mobile device with horizontal scrolling. Meh.</figcaption> </figure> <p>Also, we have to figure out what to do with actions — usual suspects of the data table. We don’t want those buttons taking up precious horizontal space. Since in our use case mobile users will mostly visit the app for <em>viewing </em>the data, we can afford an extra tap for revealing the actions. So the action buttons can be collapsed into a single dotted control:</p> <img alt="Collapsed controls" data-entity-type="file" data-entity-uuid="139d50e4-9c61-4562-b0f3-fbd9224e8c8b" src="/sites/default/files/inline-images/04.jpeg" class="align-center" width="1330" height="1050" loading="lazy" /> <p>This also solves the issue of not having the hover state (and tooltips) on touch devices: we can put labels next to the action icons in this popout menu and keep things less ambiguous.</p> <p>To sum up — pros of the data table:</p> <ul> <li>General simplicity of the concept;</li> <li>The native format for most of the users, familiar look and feel;</li> <li>Ease of presenting the structured data;</li> <li>Good for scanning the presented information;</li> <li>Simple for development, with lots of available tooling.</li> </ul> <p>It’s clear that the pros above apply mostly to large screens. On the smaller devices, we have to compromise in one way or the other.</p> <h2>Lists</h2> <p>Mobile devices are everywhere and the mobile-first directions for the UI designs are becoming more common. If your users spend a significant amount of time using your product on the go, it makes sense not to compromise for smaller screens but to rethink how to transform the data table.</p> <p>Lists are multiline, vertically aligned data containers. Since each container has no fixed height, data can flow naturally and take up as much space as needed, without clipping or hiding behind the horizontal scroll. Data in the list item container is scanned in a natural <a href="https://www.nngroup.com/articles/f-shaped-pattern-reading-web-content/"><strong>F-</strong>shaped pattern</a>.</p> <p>So each row of our data table becomes a single container on the narrow screen. If we properly arrange the data points in each container and represent the information structure with visual hierarchy, we’ll be able to avoid most of the shortcomings that the data table has with limited available width.</p> <p>With lists, we’re sacrificing the beautiful feature of the table — having the columns. Finding a row by a single data point is super easy when scanning a single column for it. But if the list container has a consistent layout, almost the same ease-of-use can be achieved with lists as well. When the layout (and data) is not overly complex, users will quickly get a grasp on the data arrangement pattern and mentally apply it to all containers, all without even thinking about it.</p> <figure role="group" class="align-center"> <img alt="Our sample data table transformed into a list" data-entity-type="file" data-entity-uuid="32f1f942-fcfc-4f98-987b-f90997c5e1df" src="/sites/default/files/inline-images/05.jpeg" width="1330" height="1050" loading="lazy" /> <figcaption>Our sample data table transformed into a list</figcaption> </figure> <p>We’re missing one thing here: we removed columns and sorting controls got lost as well. But since only a single column (data property) can be used for sorting at a time, we can turn this into the simple select box like this:</p> <img alt="select box" data-entity-type="file" data-entity-uuid="15f27dcb-a4a7-4df8-825f-c26023558d53" src="/sites/default/files/inline-images/06.jpeg" class="align-center" width="1330" height="1050" loading="lazy" /> <h2>Conclusion</h2> <p>At the end of the day, every direction in UI comes down to the specific use case and to the expectations from the system.</p> <p>You might have a dataset that has too few properties to cause problems in narrow-width data tables. Or your dataset might have lots of columns, making the list approach not feasible. So before jumping to a solution, think about the users and get as much information as possible on their usage situations — how will they use this interface, what are the most common goals and decide accordingly, trying to make life easier for most of your audience.</p> </div> <div> <div><a href="/topic/ui" class="e-tag-logo-tag"> UI </a> </div> <div><a href="/topic/ux" class="e-tag-logo-tag"> UX </a> </div> <div><a href="/topic/data-design" class="e-tag-logo-tag"> Data Design </a> </div> <div><a href="/topic/data-tables" class="e-tag-logo-tag"> Data Tables </a> </div> </div> <div> <img src="/sites/default/files/styles/blog_full/public/2021-03/tables-vs-lists.jpg?itok=i3pyzkrN" width="1360" height="714" alt="" loading="lazy" typeof="foaf:Image" /> </div> <div id="field-language-display"><div class="js-form-item form-item js-form-type-item form-item- js-form-item-"> <label>Language</label> English </div> </div> Fri, 24 Jul 2020 14:28:08 +0000 Baso Kamladze 21 at https://omedia.dev