Search code examples
xamarin.formsgrideffectripplestacklayout

Ripple effect in StackLayout or Grid after click


How to achieve an effect of smooth change of background color in StackLayout or Grid after the click? If we create a button it has this effect out of the box - I showed that in an attached gif. The same is for ViewCell in ListView. It also has this ripple effect of changing background color after a click. But how to achieve that for StackLayout or Grid?enter image description here

How to achive this


Solution

  • Solution 1:

    Thought you said that ViewCell has the ripple effect of changing background color after a click .You can put the Stacklayout or Grid in the listview which has only one ViewCell.

    in xaml

    <StackLayout>
    
    
        <ListView x:Name="listView">
    
            <ListView.ItemTemplate>
    
                <DataTemplate>
    
                    <ViewCell>
    
                        <StackLayout>
    
                          <Label TextColor="Black" Text="{Binding Content}"/>
    
                        </StackLayout>
    
                    </ViewCell>
    
                </DataTemplate>
    
            </ListView.ItemTemplate>
    
        </ListView>
    
    </StackLayout>
    

    in code behind

    public class Data
    {
        public string Content { get; set; }
    }
    
    
    public partial class MainPage : ContentPage
    {
    
        public ObservableCollection<Data> MySource { get; set; }
    
        public MainPage()
        {
            InitializeComponent();
    
            BindingContext = this;
    
    
    
            MySource = new ObservableCollection<Data>()
            {
              new Data() {Content="Click Me" },
            };
    
            listView.ItemsSource = MySource;
    
        }
    
    }
    

    Solution 2:

    You can use the package TouchView from nuget

    Add nuget package to your Xamarin.Forms .netStandard/PCL project and to your platform-specific projects (iOS and Android)

    iOS: add TouchViewRenderer.Initialize() line to your AppDelegate (preserve from linker)

    using TouchEffect.iOS;
    namespace YourApp.iOS
    {
        public partial class AppDelegate : global::Xamarin.Forms.Platform.iOS.FormsApplicationDelegate
        {
            public override bool FinishedLaunching(UIApplication app, NSDictionary options)
            {
                global::Xamarin.Forms.Forms.Init();
                TouchViewRenderer.Initialize();
                LoadApplication(new App());
                return base.FinishedLaunching(app, options);
            }
        }
    }
    

    in xaml

    <?xml version="1.0" encoding="utf-8" ?>
    <ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
                 xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
                 xmlns:local="clr-namespace:YourApp"
                 xmlns:touch="clr-namespace:TouchEffect;assembly=TouchEffect"
                 x:Class="App11.MainPage">
    
        <StackLayout>
            <touch:TouchView
                RegularBackgroundColor="LightGray"
                PressedBackgroundColor="Gray"
                PressedOpacity="1"       
    
                PressedAnimationDuration="100"
                RegularAnimationDuration="100"
                Padding="10, 5"
                VerticalOptions="CenterAndExpand"
                HorizontalOptions="CenterAndExpand"
                Completed="Handle_TouchCompleted"
               >
    
                <Label Text="Click Me" 
                       TextColor="Black" 
                       FontSize="30"/>
    
            </touch:TouchView>
        </StackLayout>
    
    </ContentPage>
    

    in code behind

    private void Handle_TouchCompleted(TouchEffect.TouchView sender, TouchEffect.EventArgs.TouchCompletedEventArgs args)
     {
        // do something you want        
     }