26 KiB
MarketAlly.TouchEffect.Maui API Reference
Complete API documentation for MarketAlly.TouchEffect.Maui v2.0.0.
Table of Contents
- TouchEffect Class
- TouchBehavior Class
- TouchEffectBuilder Class
- TouchEffectPresets Class
- Enumerations
- Interfaces
- Constants
TouchEffect Class
The core class that provides touch and hover visual feedback for any VisualElement.
Namespace: MarketAlly.TouchEffect.Maui
Inheritance: RoutingEffect
Attached Properties
State Properties
| Property | Type | Default | Description |
|---|---|---|---|
IsAvailable |
bool |
true |
Enables or disables the touch effect. When false, no touch feedback occurs. |
ShouldMakeChildrenInputTransparent |
bool |
true |
When true, child elements become input-transparent to allow touch to pass through. |
Status |
TouchStatus |
Completed |
Read-only. Current touch status (Started, Completed, Canceled). |
State |
TouchState |
Normal |
Read-only. Current touch state (Normal, Pressed). |
InteractionStatus |
TouchInteractionStatus |
Completed |
Read-only. Current interaction status. |
HoverStatus |
HoverStatus |
Exited |
Read-only. Current hover status (Entered, Exited). |
HoverState |
HoverState |
Normal |
Read-only. Current hover state (Normal, Hovered). |
Usage:
<Frame touch:TouchEffect.IsAvailable="{Binding CanInteract}"
touch:TouchEffect.ShouldMakeChildrenInputTransparent="True">
<Label Text="Interactive Content" />
</Frame>
Command Properties
| Property | Type | Default | Description |
|---|---|---|---|
Command |
ICommand |
null |
Command executed when touch completes successfully. |
CommandParameter |
object |
null |
Parameter passed to the Command. |
LongPressCommand |
ICommand |
null |
Command executed after long press duration elapses. |
LongPressCommandParameter |
object |
null |
Parameter for the LongPressCommand. Falls back to CommandParameter if null. |
LongPressDuration |
int |
500 |
Duration in milliseconds before LongPressCommand executes. |
Usage:
<Frame touch:TouchEffect.Command="{Binding TapCommand}"
touch:TouchEffect.CommandParameter="{Binding Item}"
touch:TouchEffect.LongPressCommand="{Binding ContextMenuCommand}"
touch:TouchEffect.LongPressDuration="800">
<Label Text="Tap or Long Press" />
</Frame>
Background Color Properties
| Property | Type | Default | Description |
|---|---|---|---|
NormalBackgroundColor |
Color |
Default |
Background color in normal state. |
HoveredBackgroundColor |
Color |
Default |
Background color when hovered (desktop platforms). |
PressedBackgroundColor |
Color |
Default |
Background color when pressed. |
Usage:
<Frame touch:TouchEffect.NormalBackgroundColor="White"
touch:TouchEffect.HoveredBackgroundColor="LightGray"
touch:TouchEffect.PressedBackgroundColor="Gray">
<Label Text="Color Feedback" />
</Frame>
Opacity Properties
| Property | Type | Default | Description |
|---|---|---|---|
NormalOpacity |
double |
1.0 |
Opacity in normal state. |
HoveredOpacity |
double |
1.0 |
Opacity when hovered. |
PressedOpacity |
double |
1.0 |
Opacity when pressed. |
Usage:
<Frame touch:TouchEffect.NormalOpacity="1.0"
touch:TouchEffect.HoveredOpacity="0.9"
touch:TouchEffect.PressedOpacity="0.7">
<Label Text="Opacity Feedback" />
</Frame>
Scale Properties
| Property | Type | Default | Description |
|---|---|---|---|
NormalScale |
double |
1.0 |
Scale in normal state. |
HoveredScale |
double |
1.0 |
Scale when hovered. |
PressedScale |
double |
1.0 |
Scale when pressed. |
Usage:
<Frame touch:TouchEffect.NormalScale="1.0"
touch:TouchEffect.HoveredScale="1.02"
touch:TouchEffect.PressedScale="0.95">
<Label Text="Scale Feedback" />
</Frame>
Translation Properties
| Property | Type | Default | Description |
|---|---|---|---|
NormalTranslationX |
double |
0.0 |
X translation in normal state. |
HoveredTranslationX |
double |
0.0 |
X translation when hovered. |
PressedTranslationX |
double |
0.0 |
X translation when pressed. |
NormalTranslationY |
double |
0.0 |
Y translation in normal state. |
HoveredTranslationY |
double |
0.0 |
Y translation when hovered. |
PressedTranslationY |
double |
0.0 |
Y translation when pressed. |
Usage:
<Frame touch:TouchEffect.PressedTranslationY="2">
<Label Text="Moves down when pressed" />
</Frame>
Rotation Properties
| Property | Type | Default | Description |
|---|---|---|---|
NormalRotation |
double |
0.0 |
Z-axis rotation in normal state (degrees). |
HoveredRotation |
double |
0.0 |
Z-axis rotation when hovered. |
PressedRotation |
double |
0.0 |
Z-axis rotation when pressed. |
NormalRotationX |
double |
0.0 |
X-axis rotation in normal state. |
HoveredRotationX |
double |
0.0 |
X-axis rotation when hovered. |
PressedRotationX |
double |
0.0 |
X-axis rotation when pressed. |
NormalRotationY |
double |
0.0 |
Y-axis rotation in normal state. |
HoveredRotationY |
double |
0.0 |
Y-axis rotation when hovered. |
PressedRotationY |
double |
0.0 |
Y-axis rotation when pressed. |
Usage:
<Frame touch:TouchEffect.PressedRotation="5">
<Label Text="Tilts when pressed" />
</Frame>
Animation Properties
| Property | Type | Default | Description |
|---|---|---|---|
AnimationDuration |
int |
0 |
Default animation duration in milliseconds. |
AnimationEasing |
Easing |
null |
Default easing function for animations. |
PressedAnimationDuration |
int |
0 |
Animation duration for pressed state transitions. |
PressedAnimationEasing |
Easing |
null |
Easing for pressed state transitions. |
NormalAnimationDuration |
int |
0 |
Animation duration for returning to normal state. |
NormalAnimationEasing |
Easing |
null |
Easing for normal state transitions. |
HoveredAnimationDuration |
int |
0 |
Animation duration for hover state transitions. |
HoveredAnimationEasing |
Easing |
null |
Easing for hover state transitions. |
PulseCount |
int |
0 |
Number of pulse repetitions. Use -1 for infinite. |
Usage:
<Frame touch:TouchEffect.AnimationDuration="150"
touch:TouchEffect.AnimationEasing="{x:Static Easing.CubicOut}"
touch:TouchEffect.PressedScale="0.95">
<Label Text="Animated Feedback" />
</Frame>
Toggle Properties
| Property | Type | Default | Description |
|---|---|---|---|
IsToggled |
bool? |
null |
Toggle state. null disables toggle behavior. Supports two-way binding. |
DisallowTouchThreshold |
int |
0 |
Movement threshold in pixels before touch is canceled. |
Usage:
<Frame touch:TouchEffect.IsToggled="{Binding IsSelected, Mode=TwoWay}"
touch:TouchEffect.PressedBackgroundColor="Blue"
touch:TouchEffect.NormalBackgroundColor="Gray">
<Label Text="Toggle Button" />
</Frame>
Native Animation Properties
| Property | Type | Default | Description |
|---|---|---|---|
NativeAnimation |
bool |
false |
Enables platform-specific animations (Android ripple, iOS highlight). |
NativeAnimationColor |
Color |
Default |
Color for native animation effects. |
NativeAnimationRadius |
int |
-1 |
Radius for native ripple effect. -1 uses default. |
NativeAnimationShadowRadius |
int |
-1 |
Shadow radius for native effects. |
NativeAnimationBorderless |
bool |
false |
When true, ripple extends beyond view bounds. |
Usage:
<Frame touch:TouchEffect.NativeAnimation="True"
touch:TouchEffect.NativeAnimationColor="Blue"
touch:TouchEffect.NativeAnimationRadius="100">
<Label Text="Native Ripple Effect" />
</Frame>
Background Image Properties
| Property | Type | Default | Description |
|---|---|---|---|
NormalBackgroundImageSource |
ImageSource |
null |
Background image in normal state. |
HoveredBackgroundImageSource |
ImageSource |
null |
Background image when hovered. |
PressedBackgroundImageSource |
ImageSource |
null |
Background image when pressed. |
BackgroundImageAspect |
Aspect |
AspectFill |
Default aspect ratio for background images. |
NormalBackgroundImageAspect |
Aspect |
AspectFill |
Aspect ratio for normal state image. |
HoveredBackgroundImageAspect |
Aspect |
AspectFill |
Aspect ratio for hovered state image. |
PressedBackgroundImageAspect |
Aspect |
AspectFill |
Aspect ratio for pressed state image. |
ShouldSetImageOnAnimationEnd |
bool |
false |
When true, image changes occur after animation completes. |
Events
| Event | EventArgs | Description |
|---|---|---|
StatusChanged |
TouchStatusChangedEventArgs |
Fired when touch status changes. |
StateChanged |
TouchStateChangedEventArgs |
Fired when touch state changes. |
InteractionStatusChanged |
TouchInteractionStatusChangedEventArgs |
Fired when interaction status changes. |
HoverStatusChanged |
HoverStatusChangedEventArgs |
Fired when hover status changes. |
HoverStateChanged |
HoverStateChangedEventArgs |
Fired when hover state changes. |
Completed |
TouchCompletedEventArgs |
Fired when touch completes successfully. |
LongPressCompleted |
LongPressCompletedEventArgs |
Fired when long press completes. |
Usage in Code-Behind:
public partial class MyPage : ContentPage
{
protected override void OnAppearing()
{
base.OnAppearing();
// Get the effect instance
var effect = MyView.Effects.OfType<TouchEffect>().FirstOrDefault();
if (effect != null)
{
effect.Completed += OnTouchCompleted;
effect.StateChanged += OnStateChanged;
}
}
private void OnTouchCompleted(object sender, TouchCompletedEventArgs e)
{
Debug.WriteLine($"Touch completed with parameter: {e.Parameter}");
}
private void OnStateChanged(object sender, TouchStateChangedEventArgs e)
{
Debug.WriteLine($"State changed to: {e.State}");
}
}
Static Methods
SetLogger
public static void SetLogger(ITouchEffectLogger? logger)
Sets the logger instance for all TouchEffect operations.
Parameters:
logger: The logger implementation. Passnullto disable logging.
Usage:
// Enable default console logging
TouchEffect.SetLogger(new DefaultTouchEffectLogger());
// Disable logging
TouchEffect.SetLogger(null);
// Custom logging
TouchEffect.SetLogger(new MyCustomLogger());
TouchBehavior Class
NEW in v2.0.0
A Behavior-based alternative to TouchEffect for attaching touch feedback to elements. MAUI is moving toward Behaviors over Effects, making this the preferred modern API.
Namespace: MarketAlly.TouchEffect.Maui
Inheritance: Behavior<VisualElement>
Properties
| Property | Type | Default | Description |
|---|---|---|---|
Command |
ICommand |
null |
Command executed on tap. |
CommandParameter |
object |
null |
Parameter for the command. |
LongPressCommand |
ICommand |
null |
Command for long press. |
LongPressCommandParameter |
object |
null |
Parameter for long press command. |
LongPressDuration |
int |
500 |
Long press duration in ms. |
PressedScale |
double |
1.0 |
Scale when pressed. |
PressedOpacity |
double |
1.0 |
Opacity when pressed. |
PressedBackgroundColor |
Color |
null |
Background color when pressed. |
HoveredScale |
double |
1.0 |
Scale when hovered. |
HoveredOpacity |
double |
1.0 |
Opacity when hovered. |
HoveredBackgroundColor |
Color |
null |
Background color when hovered. |
NormalScale |
double |
1.0 |
Scale in normal state. |
NormalOpacity |
double |
1.0 |
Opacity in normal state. |
NormalBackgroundColor |
Color |
null |
Background color in normal state. |
AnimationDuration |
int |
100 |
Animation duration in ms. |
AnimationEasing |
Easing |
null |
Animation easing function. |
NativeAnimation |
bool |
false |
Enable native platform animations. |
NativeAnimationColor |
Color |
null |
Color for native animations. |
IsToggled |
bool? |
null |
Toggle state (two-way bindable). |
IsAvailable |
bool |
true |
Enable/disable the behavior. |
Usage
XAML:
<Button Text="Click Me">
<Button.Behaviors>
<touch:TouchBehavior
PressedScale="0.95"
PressedOpacity="0.8"
AnimationDuration="100"
AnimationEasing="{x:Static Easing.CubicOut}"
Command="{Binding TapCommand}" />
</Button.Behaviors>
</Button>
C#:
var button = new Button { Text = "Click Me" };
button.Behaviors.Add(new TouchBehavior
{
PressedScale = 0.95,
PressedOpacity = 0.8,
AnimationDuration = 100,
Command = viewModel.TapCommand
});
TouchEffectBuilder Class
Fluent builder for configuring TouchEffect with a clean, chainable API.
Namespace: MarketAlly.TouchEffect.Maui
Static Methods
For
public static TouchEffectBuilder For(VisualElement element)
Creates a builder for the specified element.
Instance Methods
Command Configuration
| Method | Description |
|---|---|
WithCommand(ICommand command, object? parameter = null) |
Sets the tap command. |
WithLongPressCommand(ICommand command, object? parameter = null) |
Sets the long press command. |
WithLongPressDuration(int milliseconds) |
Sets long press duration. |
Visual Configuration
| Method | Description |
|---|---|
WithPressedState(double? opacity, double? scale, Color? backgroundColor) |
Configures pressed state. |
WithHoveredState(double? opacity, double? scale, Color? backgroundColor) |
Configures hovered state. |
WithNormalState(double? opacity, double? scale, Color? backgroundColor) |
Configures normal state. |
WithPressedOpacity(double opacity) |
Sets pressed opacity. |
WithPressedScale(double scale) |
Sets pressed scale. |
WithPressedBackgroundColor(Color color) |
Sets pressed background color. |
WithHoveredScale(double scale) |
Sets hovered scale. |
Animation Configuration
| Method | Description |
|---|---|
WithAnimation(int duration, Easing? easing = null) |
Sets animation duration and easing. |
WithPressedAnimation(int duration, Easing? easing = null) |
Sets pressed state animation. |
WithHoveredAnimation(int duration, Easing? easing = null) |
Sets hovered state animation. |
WithPulse(int count) |
Sets pulse count. |
WithInfinitePulse() |
Enables infinite pulsing. |
Native Animation Configuration
| Method | Description |
|---|---|
WithNativeAnimation(Color? color = null, int radius = -1) |
Enables native platform animations. |
Toggle Configuration
| Method | Description |
|---|---|
AsToggle(bool initialState = false) |
Enables toggle behavior. |
Other Configuration
| Method | Description |
|---|---|
WithDisallowThreshold(int pixels) |
Sets movement cancellation threshold. |
Disable() |
Disables the effect. |
Preset Methods
| Method | Description |
|---|---|
AsButton() |
Applies standard button preset. |
AsCard() |
Applies card preset with scale effect. |
AsListItem() |
Applies list item preset with background color. |
AsFloatingActionButton() |
Applies FAB preset with native animation. |
Build Methods
| Method | Returns | Description |
|---|---|---|
Build() |
VisualElement |
Applies configuration and returns the element. |
Apply() |
TouchEffectBuilder |
Applies configuration and returns builder for chaining. |
Usage
// Basic usage
var button = TouchEffectBuilder.For(myFrame)
.WithPressedScale(0.95)
.WithPressedOpacity(0.8)
.WithAnimation(100, Easing.CubicOut)
.WithCommand(tapCommand)
.Build();
// Using presets
var card = TouchEffectBuilder.For(myCard)
.AsCard()
.WithCommand(selectCommand)
.Build();
// Complex configuration
var interactive = TouchEffectBuilder.For(element)
.WithPressedState(opacity: 0.7, scale: 0.95, backgroundColor: Colors.LightGray)
.WithHoveredState(opacity: 1.0, scale: 1.02, backgroundColor: Colors.White)
.WithAnimation(150, Easing.CubicInOut)
.WithLongPressCommand(contextMenuCommand)
.WithLongPressDuration(800)
.AsToggle()
.Build();
Extension Methods
// Create a builder for any VisualElement
public static TouchEffectBuilder ConfigureTouchEffect(this VisualElement element)
// Quick presets
public static VisualElement WithButtonEffect(this VisualElement element, ICommand? command = null)
public static VisualElement WithCardEffect(this VisualElement element, ICommand? command = null)
TouchEffectPresets Class
Predefined TouchEffect configurations for common UI patterns.
Namespace: MarketAlly.TouchEffect.Maui
Button Presets
| Method | Description |
|---|---|
Button.Apply(element) |
Standard button with opacity feedback (0.7 pressed). |
Button.ApplyPrimary(element) |
Primary button with scale (0.95) and opacity (0.8). |
Button.ApplySecondary(element) |
Secondary button with subtle opacity (0.6). |
Button.ApplyText(element) |
Text button with minimal feedback (0.5 opacity, instant). |
Card Presets
| Method | Description |
|---|---|
Card.Apply(element) |
Standard card with subtle scale (0.97). |
Card.ApplyElevated(element) |
Elevated card with scale (0.95), opacity (0.9), hover scale (1.02). |
Card.ApplyInteractive(element) |
Interactive card with hover background highlight. |
ListItem Presets
| Method | Description |
|---|---|
ListItem.Apply(element) |
Standard list item with background highlight. |
ListItem.ApplySelectable(element) |
Selectable item with toggle behavior. |
ListItem.ApplySwipeable(element) |
Swipeable item with scale feedback. |
IconButton Presets
| Method | Description |
|---|---|
IconButton.Apply(element) |
Standard icon button with scale (0.85), spring animation. |
IconButton.ApplyFloatingAction(element) |
FAB with scale (0.9), native animation. |
IconButton.ApplyToolbar(element) |
Toolbar icon with subtle opacity (0.5). |
Toggle Presets
| Method | Description |
|---|---|
Toggle.Apply(element) |
Standard toggle with scale effect. |
Toggle.ApplyCheckbox(element) |
Checkbox-style with bounce animation. |
Image Presets
| Method | Description |
|---|---|
Image.ApplyThumbnail(element) |
Thumbnail with scale (0.95 pressed, 1.05 hover). |
Image.ApplyGallery(element) |
Gallery image with zoom effect (1.1 hover). |
Image.ApplyAvatar(element) |
Avatar with subtle feedback. |
Native Presets
| Method | Description |
|---|---|
Native.ApplyRipple(element, color?) |
Android ripple effect. |
Native.ApplyHaptic(element) |
iOS-style haptic feedback. |
Special Presets
| Method | Description |
|---|---|
Special.ApplyPulse(element, count) |
Pulse effect with repeating animation. |
Special.ApplyBounce(element) |
Bounce effect with spring animation. |
Special.ApplyShake(element) |
Shake effect with rotation. |
Special.ApplyDisabled(element) |
Disabled state with no interaction. |
Extension Methods
element.WithButtonPreset();
element.WithCardPreset();
element.WithListItemPreset();
element.WithIconButtonPreset();
element.WithNativeEffect(color?);
Enumerations
TouchStatus
Namespace: MarketAlly.TouchEffect.Maui.Enums
| Value | Description |
|---|---|
Started |
Touch has started. |
Completed |
Touch completed successfully. |
Canceled |
Touch was canceled (moved outside, interrupted). |
TouchState
Namespace: MarketAlly.TouchEffect.Maui.Enums
| Value | Description |
|---|---|
Normal |
Element is in normal state. |
Pressed |
Element is being pressed. |
TouchInteractionStatus
Namespace: MarketAlly.TouchEffect.Maui.Enums
| Value | Description |
|---|---|
Started |
User interaction started. |
Completed |
User interaction completed. |
HoverStatus
Namespace: MarketAlly.TouchEffect.Maui.Enums
| Value | Description |
|---|---|
Entered |
Pointer entered the element. |
Exited |
Pointer exited the element. |
HoverState
Namespace: MarketAlly.TouchEffect.Maui.Enums
| Value | Description |
|---|---|
Normal |
Element is not being hovered. |
Hovered |
Element is being hovered. |
Interfaces
ITouchEffectLogger
Namespace: MarketAlly.TouchEffect.Maui.Interfaces
Interface for custom logging implementations.
public interface ITouchEffectLogger
{
void LogError(Exception ex, string context, string? additionalInfo = null);
void LogWarning(string message, string context);
void LogInfo(string message, string context);
}
Built-in Implementations
DefaultTouchEffectLogger
Logs to Debug.WriteLine with formatted output.
TouchEffect.SetLogger(new DefaultTouchEffectLogger());
NullTouchEffectLogger
No-op logger that discards all messages. Used by default.
// Singleton instance
NullTouchEffectLogger.Instance
Constants
TouchEffectConstants
Namespace: MarketAlly.TouchEffect.Maui
Defaults
| Constant | Value | Description |
|---|---|---|
LongPressDuration |
500 |
Default long press duration (ms). |
Opacity |
1.0 |
Default opacity. |
Scale |
1.0 |
Default scale. |
TranslationX |
0.0 |
Default X translation. |
TranslationY |
0.0 |
Default Y translation. |
Rotation |
0.0 |
Default rotation. |
PulseCount |
0 |
Default pulse count. |
DisallowTouchThreshold |
0 |
Default movement threshold. |
NativeAnimationRadius |
-1 |
Default native animation radius. |
NativeAnimationShadowRadius |
-1 |
Default shadow radius. |
Animation
| Constant | Value | Description |
|---|---|---|
DefaultDuration |
0 |
Default animation duration. |
DefaultProgressDelay |
10 |
Delay between animation frames. |
TargetFrameRate |
60 |
Target animation frame rate. |
PresetDurations
| Constant | Value | Description |
|---|---|---|
Instant |
0 |
No animation. |
VeryFast |
50 |
Very fast animations (ms). |
Fast |
100 |
Fast animations (ms). |
Normal |
200 |
Normal animations (ms). |
Slow |
300 |
Slow animations (ms). |
VisualStates
| Constant | Value |
|---|---|
Unpressed |
"Unpressed" |
Pressed |
"Pressed" |
Hovered |
"Hovered" |
Platform.Android
| Constant | Value | Description |
|---|---|---|
DefaultRippleColor |
128 |
Default ripple RGB value. |
DefaultRippleAlpha |
80 |
Default ripple alpha. |
MinRippleRadius |
48 |
Minimum ripple radius (dp). |
Platform.iOS
| Constant | Value | Description |
|---|---|---|
HighlightAlpha |
0.5f |
Default highlight alpha. |
Event Args Classes
TouchStatusChangedEventArgs
public class TouchStatusChangedEventArgs : EventArgs
{
public TouchStatus Status { get; }
}
TouchStateChangedEventArgs
public class TouchStateChangedEventArgs : EventArgs
{
public TouchState State { get; }
}
TouchInteractionStatusChangedEventArgs
public class TouchInteractionStatusChangedEventArgs : EventArgs
{
public TouchInteractionStatus InteractionStatus { get; }
}
HoverStatusChangedEventArgs
public class HoverStatusChangedEventArgs : EventArgs
{
public HoverStatus Status { get; }
}
HoverStateChangedEventArgs
public class HoverStateChangedEventArgs : EventArgs
{
public HoverState State { get; }
}
TouchCompletedEventArgs
public class TouchCompletedEventArgs : EventArgs
{
public object? Parameter { get; }
}
LongPressCompletedEventArgs
public class LongPressCompletedEventArgs : EventArgs
{
public object? Parameter { get; }
}
Migration Guide
From v1.x to v2.0
- Update package reference to version 2.0.0
- Update target framework to .NET 10 if needed
- Optional: Use TouchBehavior instead of attached properties for new code
- Optional: Configure logging using
TouchEffect.SetLogger()
No breaking changes - all v1.x code continues to work.
From Xamarin TouchEffect
- Update namespace from
Xamarin.CommunityToolkit.EffectstoMarketAlly.TouchEffect.Maui - Replace
TouchEffwithTouchEffectin XAML - Update
UseMauiApp<App>()to include.UseMauiTouchEffect()
Last updated: January 2025 | Version 2.0.0