質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.54%

  • Xamarin

    496questions

    Xamarin(ザマリン)は、iPhoneなどのiOSやAndroidで動作し、C# 言語を用いてアプリを開発できるクロスプラットフォーム開発環境です。Xamarin Studioと C# 言語を用いて、 iOS と Android の両方の開発を行うことができます。

Xamarin.FormsのTriggerAction<VisualElement>で実装したアニメーションが動かない

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 103

panda531

score 3

 前提・実現したいこと

Xamarin.Formsを使ったモバイルアプリを作成中です。
UIをアニメーションさせたいと思い実装を行っているのですがうまく動きません。

XAML内でEnterActionとExitActionでのアニメーションを実行しようとしています。
以下の公式サンプルを参考に実装しました。
EnterActions and ExitActions

上記サンプルはBackgroundColorの変更ですが、実際に行いたいことはLabelのFontSizeとTextColorのアニメーションによる変更です。
また、上記サンプルはTriggerですが、実際にはDataTriggerを使ってアニメーションを開始させたいと考えています。

 発生している問題・エラーメッセージ

Unhandled Exception:
System.ArgumentException: Argument is null or empty
Parameter name: handle
  at Xamarin.Forms.AnimatableKey..ctor (Xamarin.Forms.IAnimatable animatable, System.String handle) [0x0001c] in D:\a\1\s\Xamarin.Forms.Core\AnimatableKey.cs:16 
  at Xamarin.Forms.AnimationExtensions.AnimateInternal[T] (Xamarin.Forms.IAnimatable self, System.String name, System.Func`2[T,TResult] transform, System.Action`1[T] callback, System.UInt32 rate, System.UInt32 length, Xamarin.Forms.Easing easing, System.Action`2[T1,T2] finished, System.Func`1[TResult] repeat) [0x0001c] in D:\a\1\s\Xamarin.Forms.Core\AnimationExtensions.cs:180 
(中略)
=================================================================
Got a SIGABRT while executing native code. This usually indicates
a fatal error in the mono runtime or one of the native libraries 
used by your application.
=================================================================```  

 該当のソースコード

以下にサンプルコードを置いています。

XamarinFormsAnimationSample

MainPageは以下の通りです。

<StackLayout>  
<Entry Placeholder="test">  
<Entry.Triggers>  
<Trigger TargetType="Entry" Property="Entry.IsFocused" Value="True">  
<Trigger.EnterActions>  
<trigger:ChangeBackgroundColorTriggerAction StartsFrom="0"/>  
</Trigger.EnterActions>  
<Trigger.ExitActions>  
<trigger:ChangeBackgroundColorTriggerAction StartsFrom="1"/>  
</Trigger.ExitActions>  
</Trigger>  
</Entry.Triggers>  
</Entry>  
<Label Text="Welcome to Xamarin.Forms!" HorizontalOptions="Center" VerticalOptions="CenterAndExpand" >  
<Label.Triggers>  
<DataTrigger TargetType="Label" Binding="{Binding Path=m_IsChangeBackgroundColorAminationStart}" Value="true">  
<DataTrigger.EnterActions>  
<trigger:ChangeBackgroundColorTriggerAction StartsFrom="0"/>  
</DataTrigger.EnterActions>  
<DataTrigger.ExitActions>  
<trigger:ChangeBackgroundColorTriggerAction StartsFrom="1"/>  
</DataTrigger.ExitActions>  
</DataTrigger>    
<DataTrigger TargetType="Label" Binding="{Binding Path=m_IsChangeFontSizeAnimationStart}" Value="true">  
<DataTrigger.EnterActions>  
<trigger:LabelFontSizeTriggerAction FontSize="10"/>  
</DataTrigger.EnterActions>  
<DataTrigger.ExitActions>  
<trigger:LabelFontSizeTriggerAction FontSize="40"/>  
</DataTrigger.ExitActions>  
</DataTrigger>  
</Label.Triggers>  
</Label>  
<Button Command="{Binding StartChangeBackgroundColorAnimationCommand}" Text="Change BackgroundColor"/>  
<Button Command="{Binding StartChangeFontSizeAnimationCommand}" Text="Change FontSize"/>  
</StackLayout>  

 試したこと

TriggerとDataTriggerの両方で試しましたがどちらも同じエラーでした。

 補足情報(FW/ツールのバージョンなど)

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

アニメーションの名前を指定してください。

ChangeBackgroundColorTriggerAction

protected override void Invoke(VisualElement sender)
{
    sender.Animate("ChangeBackgroundColor", new Animation((d) =>
    {
        var val = StartsFrom == 1 ? d : 1 - d;
        sender.BackgroundColor = Color.FromRgb(1, val, 1);
    }),
    length: 1000, // milliseconds
    easing: Easing.Linear);
}

LabelFontSizeTriggerAction

protected override void Invoke(VisualElement sender)
{
    var animation = new Animation((d) =>
    {
        var label = sender as Label;
        label.FontSize = FontSize;
    });
    sender.Animate("LabelFontSize", animation, length: 1000, easing: Easing.Linear);
}

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/09/21 18:24

    ありがとうございます!無事アニメーション動作しました!
    (フォントサイズの変更は意図した動作では無かったですがそれはまた別の問題ですね)

    名前入れろってのはちゃんと公式にも書いてありました。。。
    (https://docs.microsoft.com/en-us/dotnet/api/xamarin.forms.animationextensions.animate?view=xamarin-forms)
    An animation key that should be unique among its sibling and parent animations for the duration of the animation.

    ただ、参考にしたサンプルも公式だと思うんですがこっちは名前入ってないですね(; ・`ω・´)
    https://docs.microsoft.com/ja-jp/xamarin/xamarin-forms/app-fundamentals/triggers#enterexit
    このサンプル見て動かない人は他にもいそうな気がします。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.54%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Xamarin

    496questions

    Xamarin(ザマリン)は、iPhoneなどのiOSやAndroidで動作し、C# 言語を用いてアプリを開発できるクロスプラットフォーム開発環境です。Xamarin Studioと C# 言語を用いて、 iOS と Android の両方の開発を行うことができます。