Feature Request: TrackballDestroyed or OnUp event SfChart

I've been trying to figure out when the releases their finger on a SfChart so i can set the IsVisible of other UI elements in the page. It would be great if there was an event to show when the user lifted their finger from the chart or if there was an event for when the Trackball was destroyed (opposite of the TrackballCreated event). The OnUp would be the easier one to use, both both could help accomplish this use case.

Thanks!

5 Replies

SJ Suyamburaja Jayakumar Syncfusion Team April 27, 2020 06:30 AM UTC

Hi Keston Crandall, 
 
Greetings from Syncfusion.  
 
We would like to let you know that, you can achieve your requirement by using the OnLongPress and OnTouchUp override methods of ChartTrackballBehavior as in below code snippet.  
 
C#: 
public class TrackballBehaviorExt : ChartTrackballBehavior  
{  
   private bool isLongPressActivated = false;  
   
   protected override void OnLongPress(float pointX, float pointY)  
   {  
       base.OnLongPress(pointX, pointY);  
       isLongPressActivated = true;  
   }  
   
   protected override void OnTouchUp(float pointX, float pointY)  
   {  
       base.OnTouchUp(pointX, pointY);  
       if (isLongPressActivated)  
       {  
          isLongPressActivated = false;  
          //Write your logic here  
       }  
   }  
}  
 
 
Note: The above code snippet will support only for android. for iOS please refer below 
 
For iOS support use CustomRenderer class and TouchUp method to achieve your requirement as per the below code snippet. 
 
C#: 
public class ChartTrackballBehaviorExt : ChartTrackballBehavior  
{  
     public ChartExt chart { getset; }  
     public ChartTrackballBehaviorExt()  
     {  
  
     }  
  
     protected override void OnLongPress(float pointX, float pointY)  
     {  
          chart.TrackballVisible = true;  
          base.OnLongPress(pointX, pointY);  
     }  
     //For Android this override OnTouchUp will work fine after LongPress  
     protected override void OnTouchUp(float pointX, float pointY)  
     {   
          base.OnTouchUp(pointX, pointY);  
     }  
        
     //For iOS after long press TouchUp method called here  
     public void TouchUp(float pointX, float pointY)  
     {  
         if (chart != null)  
         {  
              chart.TrackballVisible = false;  
              //check your logic here for iOS  
         }  
     }  
}  
 
 
C#: 
class CustomChartRenderer : SfChartRenderer  
{  
   protected override void OnElementChanged(ElementChangedEventArgs<SfChart> e)  
   {  
       base.OnElementChanged(e);  
  
       var formsChart = Element as Syncfusion.SfChart.XForms.SfChart;  
  
       for (int i = 0; i < formsChart.ChartBehaviors.Count; i++)  
       {  
             if (formsChart.ChartBehaviors[i] is  Syncfusion.SfChart.XForms.ChartTrackballBehavior)  
             {  
                  var formsTrackball = formsChart.ChartBehaviors[i] as      
                                        Syncfusion.SfChart.XForms.ChartTrackballBehavior; 
                   Control.Behaviors.Remove((SFChartBehavior)SfChartRenderer.GetNativeObject(typeof  
                                    (Syncfusion.SfChart.XForms.ChartTrackballBehavior), formsTrackball));  
                  CustomTrackballBehavior customTrackball = new CustomTrackballBehavior();  
                  customTrackball.FormsBehavior = formsTrackball;  
  
                  var properties =   
SfChartRenderer.GetPropertiesChanged(typeof(Syncfusion.SfChart.XForms.ChartTrackballBehavior),    
                                     formsTrackball);  
                  foreach (var name in properties)  
                  {                                                                  
                        ChartTrackballBehaviorMapping.OnChartTrackballBehaviorPropertiesChanged(name,     
                                 formsTrackball, customTrackball);  
                  }  
                                                              
               SfChartRenderer.SetNativeObject(typeof(Syncfusion.SfChart.XForms.ChartTrackballBehavior),   
                                 formsTrackball, customTrackball);  
                 Control.Behaviors.Insert(i, customTrackball);  
             }  
         }  
     }  
}  
  
public class CustomTrackballBehavior : ChartTrackballBehaviorHelper  
{  
      public override void LongPressWithGestureRecognizer(UILongPressGestureRecognizer    
                                            longPressGestureRecognizer)  
      {  
               base.LongPressWithGestureRecognizer(longPressGestureRecognizer);  
              var locationInChart = longPressGestureRecognizer.LocationInView(Chart);  
              if (UIGestureRecognizerState.Ended == longPressGestureRecognizer.State)  
              {  
                     (FormsBehavior as ChartTrackballBehaviorExt).TouchUp((float)locationInChart.X,   
                                     (float)locationInChart.Y);  
               }  
     }  
}  
 
 
XAML: 
<local:ChartExt x:Name="chart" HorizontalOptions="FillAndExpand"    
          VerticalOptions="FillAndExpand">  
      ….  
      <chart:SfChart.ChartBehaviors>  
        <local:ChartTrackballBehaviorExt chart="{x:Reference chart}"   
                 ActivationMode="LongPress">  
        </local:ChartTrackballBehaviorExt>  
   </chart:SfChart.ChartBehaviors>  
</local:ChartExt>  
 
 
 
More information Please refer the below forum, 
 
Please let us know if you need any further assistance.      
  
Regards,  
Suyamburaja J.  



KC Keston Crandall April 27, 2020 05:25 PM UTC

Thank you this was exactly what i was looking for! Probably would be useful to put this in the Trackball docs


KC Keston Crandall April 27, 2020 05:28 PM UTC

For people who come across this in the future if you want TouchMove and not LongPress you don't need to do the iOS workaround. This worked fine

using System;

using Syncfusion.SfChart.XForms;

using App.Controls;
namespace App.Behaviors
{
    public class ChartTrackballBehaviorExt : ChartTrackballBehavior
    {
        public event EventHandler Up;
        public event EventHandler Down;

        private bool isLongPressActivated = false;

        public SfChartExt chart { get; set; }

        public ChartTrackballBehaviorExt()
        { }

        protected override void OnTouchDown(float pointX, float pointY)
        {
            base.OnTouchDown(pointX, pointY);
            EventHandler eventHandler = Down;
            eventHandler?.Invoke(this, null);
        }

        protected override void OnLongPress(float pointX, float pointY)
        {
            base.OnLongPress(pointX, pointY);
            isLongPressActivated = true;
        }
        protected override void OnTouchUp(float pointX, float pointY)
        {
            base.OnTouchUp(pointX, pointY);
            EventHandler eventHandler = Up;
            eventHandler?.Invoke(this, null);
            //if (isLongPressActivated)
            //{
            //    isLongPressActivated = false;
            //    //Write your logic here for android
            //    EventHandler eventHandler = Up;
            //    eventHandler?.Invoke(this, null);
            //}
        }

    
    }
}



KC Keston Crandall April 27, 2020 05:43 PM UTC

You can have the best of both worlds with this. added this  if(this.ActivationMode == ChartTrackballActivationMode.TouchMove)

using System;

using Syncfusion.SfChart.XForms;

using App.Controls;
namespace App.Behaviors
{
    public class ChartTrackballBehaviorExt : ChartTrackballBehavior
    {
        public event EventHandler Up;
        public event EventHandler Down;

        private bool isLongPressActivated = false;

        public SfChartExt chart { get; set; }

        public ChartTrackballBehaviorExt()
        { }

        protected override void OnTouchDown(float pointX, float pointY)
        {
            base.OnTouchDown(pointX, pointY);
            EventHandler eventHandler = Down;
            eventHandler?.Invoke(this, null);
        }

        protected override void OnLongPress(float pointX, float pointY)
        {
            base.OnLongPress(pointX, pointY);
            isLongPressActivated = true;
        }
        //For Android this override OnTouchUp will work fine after LongPress
        protected override void OnTouchUp(float pointX, float pointY)
        {
            base.OnTouchUp(pointX, pointY);
            if(this.ActivationMode == ChartTrackballActivationMode.TouchMove)
            {
                EventHandler eventHandler = Up;
                eventHandler?.Invoke(this, null);
            }
            else if (isLongPressActivated)
            {
                isLongPressActivated = false;
                //Write your logic here for android
                EventHandler eventHandler = Up;
                eventHandler?.Invoke(this, null);
            }
        }

        //For iOS after long press TouchUp method called here  
        public void TouchUp(float pointX, float pointY)
        {
            if (chart != null)
            {
                chart.TrackballVisible = false;
                //write your logic here for iOS
                EventHandler eventHandler = Up;
                eventHandler?.Invoke(this, null);
            }
        }
    }
}



SJ Suyamburaja Jayakumar Syncfusion Team April 28, 2020 06:16 AM UTC

Hi Keston Crandall,  
  
Thanks for your suggestion. 
  
Please let us know if you need any further assistance on this.  
  
Regards,  
Suyamburaja J.  


Loader.
Up arrow icon