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        
     }