web-dev-qa-db-ja.com

Androidホーム画面ウィジェットのアニメーション

理想的にはAndroid.view.animationフレームワークを介して、アニメーションをサポートするウィジェットを作成することを検討しています。それ以外の場合は、バックグラウンドサービスからトリガーされるコードでリモートビューのプロパティを設定します。

誰かがこれらのアプローチのいずれかを経験したことがありますか、そして私が実行しようとしていることですか、それとも私は盲目の路地に向かっていますか?

32
Adrian

RemoteViewウィジェットをアニメーション化することは実際に可能です。問題は、システムプロセスでカスタムコードを実行することのセキュリティへの影響のために、設計上非常に制限されていることです。

これが意味するのは、Androidは、xmlを介してレイアウトに関連付けられたres/animxmlファイルで表現されたアニメーションでのみ機能するということです。一部のRemoteViewウィジェットはこれをサポートしています。

この例は、ストックAndroidシステムに付属するニュースと天気のアプリウィジェットです。これは、ViewFlipperを使用して各ニュース記事を10秒ごとに循環させます。

    <ViewFlipper Android:layout_width="match_parent" Android:layout_height="wrap_content" Android:measureAllChildren="true" Android:flipInterval="10000" Android:autoStart="true"
Android:inAnimation="@Android:anim/fade_in" Android:outAnimation="@Android:anim/fade_out" Android:animateFirstView="true">
      <TextView Android:id="@+id/Description1TextView" style="@style/AWCText.Centered" Android:layout_width="match_parent" Android:layout_height="wrap_content"/>
      <TextView Android:id="@+id/Description2TextView" style="@style/AWCText.Centered" Android:layout_width="match_parent" Android:layout_height="wrap_content"/>
      <TextView Android:id="@+id/Description3TextView" style="@style/AWCText.Centered" Android:layout_width="match_parent" Android:layout_height="wrap_content"/>
      <TextView Android:id="@+id/Description4TextView" style="@style/AWCText.Centered" Android:layout_width="match_parent" Android:layout_height="wrap_content"/>
    </ViewFlipper>

この例では、保留中のインテントを各TextViewに関連付けることができます。したがって、ユーザーがいずれかをクリックすると、別のアクションが発生する可能性があります。

最後に、Androidは、各バージョンでアニメーションビューのサポートを徐々に追加しています。たとえば、TransitionDrawables(クロスフェードセレクタードローアブル)は、Android 3.0。

14
Jeremy Edwards

可能ですが、デフォルトのホーム画面の実装には非常に重く、あまり頻繁に使用するべきではないため、注意して使用してください。

マリオコインブロックウィジェット で、私はアニメーションを行うためにそのようなテクニックを使用しています、あなたはソースコードをチェックアウトすることができます: http://code.google.com/p/mario-coin -block/source/browser/trunk/MarioWidget.CoinBlock/src/com/gueei/mario/coinBlock/view/CoinBlockView.Java

基本的に、アイデアはオフスクリーンのビットマップに手動で描画し、RemoveViews呼び出しを使用してビットマップビューのビットマップをそれに置き換えます。

2
xandy

ウィジェットにはfadeInやfadeOutなどの単純なアニメーションしかありません。非常に単純で、レイアウトアニメーションは必要ありません。ViewFlipperを使用するだけです(非常に簡単であることがわかるまでに3日かかりました)。

それでも、カスタムランチャーを使用せずに本当に素晴らしいものを書くことは不可能です

2
Orest

私はここで他の答えに同意するので、繰り返しません-ウィジェットでの制限されたアニメーションは可能ですが、リソースが重いため、ホーム画面が遅くなり、応答性が低下し、バッテリーが消耗する可能性があります。私の経験から-それはスムーズに実行されません。つまり、重要なのは、フレームが数フレームしか変わらない場合や、イベントにほとんど影響を与えない場合(たとえば、ユーザーのプレスやサービスからのイベントなど)は問題ありません。

しかし、おそらくあなたの質問に直接答えることはないかもしれませんが、適切な代替案かもしれないという考えがあります(あなたのユースケースはわかりません、まったく関係がないかもしれません)ライブ壁紙の実装を検討しましたか?

長所-最高品質のアニメーション、バックグラウンドから制御できます

短所-インタラクティブではなく、ユーザーの壁紙を置き換えます...そしてみんなの好みを満足させるのは難しいです

1
Amir Uval

RemoteViewsではアニメーションは不可能であり、RemoteViewsの更新は30分に1回(または手動で)発生する可能性があります...

とにかく、次のリンクを試すことができます: is-there-a-way-to-animate-on-a-home-widget

0
Rotemmiz