0

ich umgesetzt haben, eine anklickbare Frame in Xamarin.Forms 2.3.4 mit einem benutzerdefinierten FrameRenderer die Clickable (und LongPressable FWIW) auf true gesetzt, abonniert die jeweiligen Ereignisse und legen Sie die FrameRenderer s VordergrundWie migriere ich einen anklickbaren Frame mit Ripple Touch an Xamarin.Forms 2.5?

TypedValue typedValue = new TypedValue(); 
this.Context.Theme.ResolveAttribute(Android.Resource.Attribute.SelectableItemBackground, typedValue, true); 
this.Foreground = this.Resources.GetDrawable(typedValue.ResourceId, this.Context.Theme); 

Werkstoff zu erreichen Bewegung (Wellenberührung).

Nach der Aktualisierung auf XF 2.5 (höchstwahrscheinlich ab 2.3.5, da schnelle Renderer mit dieser Version eingeführt wurden), haben meine Berührungsereignisse aufgehört zu arbeiten. Mein benutzerdefinierter Renderer ist korrekt zugewiesen. Dies gilt auch für die Eigenschaften Clickable und LongPressable. Es passiert jedoch nichts. Teilweise konnte ich das Problem - zumindest im Moment - umgehen, indem ich FrameRenderer.Touch abonniere und von diesem Event-Handler aus anrufe. Dies macht die App nutzbar, aber leider fehlt die visuelle Rückmeldung in Form des Ripple-Touch-Effekts.

Gibt es eine Möglichkeit, das ursprüngliche Verhalten wiederherzustellen? Gibt es eine Möglichkeit, einen anklickbaren Frame mit Ripple Touch in XF 2.5 zu implementieren?

Antwort

0

Mit Hilfe von this answer habe ich eine Lösung gefunden. Ist hier ein Entwurf davon:

Zu allererst speichere ich einen lokalen Bezug auf meine RippleDrawable (siehe documentation)

private void SetMaterialMotion() 
{ 
    TypedValue typedValue = new TypedValue(); 
    this.Context.Theme.ResolveAttribute(Android.Resource.Attribute.SelectableItemBackground, typedValue, true); 
    this.Foreground = this.Resources.GetDrawable(typedValue.ResourceId, this.Context.Theme); 
    this._layerDrawable = this.Foreground as RippleDrawable; 
} 

dann muss ich auf die Touch Ereignis abonnieren

private void SubscribeClickEvent() 
{ 
    if (this.ClickableFrame.IsClickable) 
    { 
     this.Touch += ClickableFrameRenderer_Touch; 
    } 
} 

In meinem ClickableFrameRenderer_Touch Ich setze die Pressed Eigenschaft und den Hotspot der RippleDrawable

private void ClickableFrameRenderer_Touch(object sender, TouchEventArgs e) 
{ 
    if(e.Event.Action == Android.Views.MotionEventActions.Down) 
    { 
     this.Pressed = true; 
    } 

    if(e.Event.Action == Android.Views.MotionEventActions.Up) 
    { 
     this._layerDrawable.SetHotspot(e.Event.GetX(), e.Event.GetY()); 
     this.Pressed = false; 
    } 
} 

Dies zeigt die Wellenberührungsbewegung (mehr oder weniger) wie erwartet. Natürlich behandelt dies nicht lange drücken, aber, aber ich bin auf einem Weg.

Wie auch immer, das ist keine Lösung, die ich sehr mag. Ich denke immer noch, dass gibt es einen unterstützten Weg auf FastRenderers.FrameRenderer klickbar gemacht werden. Wenn jemand es weiß: Bitte teilen Sie Ihr Wissen.

Verwandte Themen