【问题标题】:Android homescreen widget animationsAndroid 主屏幕小部件动画
【发布时间】:2011-03-22 17:43:35
【问题描述】:

我正在考虑创建一个支持动画的小部件,最好是通过 android.view.animation 框架,否则通过在后台服务触发的代码中设置远程视图的属性。

有没有人对这两种方法有任何经验,我正在尝试的方法是否可行,或者我正在走向死胡同?

【问题讨论】:

  • 看看同样的,如果你现在已经完成了,如果你能在这里分享你的解决方案会很好。
  • 当然 - 会尽量找时间写出来。本质上,诀窍是定义具有内置初始动画的布局,然后在需要动画时设置这些布局。 IIRC 您需要切换到新布局来触发动画,因此您可能需要具有相同动画的多个布局并在它们之间交替。设置一个计时器以在动画完成后切换回非动画版本的小部件也很有用 - 否则返回主屏幕会再次触发动画。
  • 你想通过后台服务控制哪一个,布局还是动画?你能详细描述一下这个问题吗?

标签: android animation android-widget


【解决方案1】:

实际上可以为 RemoteView 小部件设置动画。问题是它具有超级限制性,这是设计使然,因为在系统进程中运行自定义代码会带来安全隐患。

我的意思是,Android 只能处理以 res/anim xml 文件表示的动画,这些文件通过 xml 绑定到布局。一些 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 才交叉淡入淡出。

【讨论】:

    【解决方案2】:

    这是可能的,但请谨慎使用,因为它对默认主屏幕实现来说非常繁重,您不应该经常使用它。

    Mario Coin Block widget,我就是用这样的技术做动画的,你可以查看源代码:http://code.google.com/p/mario-coin-block/source/browse/trunk/MarioWidget.CoinBlock/src/com/gueei/mario/coinBlock/view/CoinBlockView.java

    基本上这个想法是在屏幕外的 Bitmap 上手动绘制,并使用 RemoveViews Call 将 BitmapView 的位图替换为它。

    【讨论】:

      【解决方案3】:

      我同意这里的其他答案,所以我不会重复 - 小部件上的有限动画是可能的,但资源繁重,它可能会使主屏幕变慢且响应速度变慢,并且会消耗电池电量。根据我的经验 - 它运行不顺畅。 所以底线是 - 如果只是几帧不时变化,或者对于某些事件很少发生的效果(例如用户按下或来自您的服务的某些事件),那没关系。

      但这里的想法可能不会直接回答您的问题,但可能是一个合适的替代方案(我不知道您的用例,它可能根本不相关) 您是否考虑过实施动态壁纸?

      优点 - 最高质量的动画, 可以从后台控制

      缺点 - 不互动, 替换用户的壁纸……很难满足大家的口味

      【讨论】:

        【解决方案4】:

        你的widget上只能有fadeIn或fadeOut这样简单的动画,很简单,你不需要任何布局动画,只需要使用ViewFlipper(我花了3天的时间调查才发现它是如此简单) .

        然而,如果不使用自定义启动器,就不可能写出真正伟大的东西

        【讨论】:

          【解决方案5】:

          RemoteViews 上不可能有动画,RemoteViews 更新可以以每 30 分钟一次(或手动)的速度发生...

          不管怎样,你可以试试下面的链接:is-there-a-way-to-animate-on-a-home-widget

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2014-03-05
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多