-

   rss_rss_hh_new

 - e-mail

 

 -

 LiveInternet.ru:
: 17.03.2011
:
:
: 51

:


Xamarin.Forms

, 26 2017 . 11:30 +

Xamarin.Forms , , , Dependency service . , .
.


, iOS Android.


. . , CircularImage Frame .


, .



Android 5+ , Ripple effect. iOS Android <5 . , .



PCL


PCL TouchEffect BindableProperty:


  • bool On
  • Color Color

, .


Android


, Ripple effect Android:


public bool EnableRipple => Build.VERSION.SdkInt >= BuildVersionCodes.Lollipop;

:


private void AddRipple()
{
    if (Element is Layout)
    {
        _rippleOverlay = new FrameLayout(Container.Context)
        {
            LayoutParameters = new ViewGroup.LayoutParams(-1, -1)
        };

        _rippleListener = new ContainerOnLayoutChangeListener(_rippleOverlay);
        _view.AddOnLayoutChangeListener(_rippleListener);

        ((ViewGroup)_view).AddView(_rippleOverlay);

        _rippleOverlay.BringToFront();
        _rippleOverlay.Foreground = CreateRipple(Color.Accent.ToAndroid());
    }
    else
    {
        _orgDrawable = _view.Background;
        _view.Background = CreateRipple(Color.Accent.ToAndroid());
    }

    _ripple.SetColor(GetPressedColorSelector(_color));
}

private void RemoveRipple()
{
    if (Element is Layout)
    {
        var viewgrp = (ViewGroup)_view;
        viewgrp?.RemoveOnLayoutChangeListener(_rippleListener);
        viewgrp?.RemoveView(_rippleOverlay);

        _rippleListener?.Dispose();
        _rippleListener = null;

        _rippleOverlay?.Dispose();
        _rippleOverlay = null;
    }
    else
    {
        _view.Background = _orgDrawable;
        _orgDrawable?.Dispose();
        _orgDrawable = null;
    }
    _ripple?.Dispose();
    _ripple = null;
}

private RippleDrawable CreateRipple(Android.Graphics.Color color)
{
    if (Element is Layout)
    {
        var mask = new ColorDrawable(Android.Graphics.Color.White);
        return _ripple = new RippleDrawable(GetPressedColorSelector(color), null, mask);
    }

    var back = _view.Background;
    if (back == null)
    {
        var mask = new ColorDrawable(Android.Graphics.Color.White);
        return _ripple = new RippleDrawable(GetPressedColorSelector(color), null, mask);
    }
    else if (back is RippleDrawable)
    {
        _ripple = (RippleDrawable) back.GetConstantState().NewDrawable();
        _ripple.SetColor(GetPressedColorSelector(color));

        return _ripple;
    }
    else
    {
        return _ripple = new RippleDrawable(GetPressedColorSelector(color), back, null);
    }
}

.


FrameLayout Alpha .
Touch :


private void OnTouch(object sender, View.TouchEventArgs args)
{
    switch (args.Event.Action)
    {
        case MotionEventActions.Down:
            Container.RemoveView(_layer);
            Container.AddView(_layer);
            _layer.Top = 0;
            _layer.Left = 0;
            _layer.Right = _view.Width;
            _layer.Bottom = _view.Height;
            _layer.BringToFront();
            TapAnimation(250, 0, 65, false);
            break;
        case MotionEventActions.Up:
        case MotionEventActions.Cancel:
            TapAnimation(250, 65, 0);
            break;
    }
}

A- 0 65, 65 0 .


, OnAttached , , Ripple effect Touch:


if (EnableRipple)
    AddRipple();
else
    _view.Touch += OnTouch;

iOS


iOS , UIView A-. UITapGestureRecognizer UILongPressGestureRecognizer :


_tapGesture = new UITapGestureRecognizer(async (obj) => {
    await TapAnimation(0.3, _alpha, 0);
});

_longTapGesture = new UILongPressGestureRecognizer(async (obj) => {
    switch (obj.State)
    {
        case UIGestureRecognizerState.Began:
            await TapAnimation(0.5, 0, _alpha, false);
            break;
        case UIGestureRecognizerState.Ended:
        case UIGestureRecognizerState.Cancelled:
        case UIGestureRecognizerState.Failed:
            await TapAnimation(0.5, _alpha);
            break;
    }
});

_view.AddGestureRecognizer(_longTapGesture);
_view.AddGestureRecognizer(_tapGesture);

, , .
.



XAML:



    
        
    

iOS Android API >=21 Android API < 21


, , Nuget GitHub.


P.S. , , /.
P.P.S Habrastorage gif'.

Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/334166/

:  

: [1] []
 

:
: 

: ( )

:

  URL