7

问题描述


我正在为 Android 编写一个简单的小部件应用程序,在我的小部件 I 布局ImageViewRefresh中,我可以控制我设置的刷新图像图片(下面的绿色图像)。

问题


在某些时候,我按下ImageViewRefresh 我的小部件中的一个按钮,应用程序开始从 Internet 下载一些内容,而应用程序在后台下载数据我想做一些动画,比如旋转我的图像(下面的绿色图像)。我可以这样做吗?

研究


我已经阅读了一些关于图像动画的帖子,但我只能在应用程序中找到 .gif 图片的动画,这是一种旋转图像的方法,例如制作一些旋转的图像并更改它们或其他东西。

代码示例

这是我的图像中的一部分代码layout没有旋转。为什么 ?(我的图像是简单的 .png 图像)

<ProgressBar
        android:id="@+id/progressBarRefresh"
        android:layout_width="36dp"
        android:indeterminateDrawable="@drawable/arrow_refresh"
        android:layout_height="36dp"
        android:layout_alignTop="@+id/imageViewArrowNext"
        android:layout_marginRight="70dp"
        android:layout_toLeftOf="@+id/textViewAutherName"
        android:indeterminate="true" />

我要旋转的图像。

旋转图像

4

2 回答 2

4

编辑:我会提前道歉,但我相信我的回答可能会误导问题:

  • 经测试,系统不会自动旋转可绘制对象,但是您可以更改样式来执行此操作(老实说,我不记得了,这是 2 年前在 Eclair 上的),但是您可以尝试找到它。
  • 下面的答案有效(因为它已经过测试)但不适用于自定义可绘制对象,它不会旋转它们。
  • 对于自定义动画可绘制请参阅此处:ProgressBar/ProgressDialog 的自定义可绘制
  • 但正如其中一条评论所提到的,应用程序小部件不应该运行动画有没有办法在 Home Widget 上制作动画?

原帖:

不要尝试自己为小部件设置动画

使用ProgressBar它是不确定的并用于setIndeterminateDrawable(Drawable d);设置要旋转的图像。(或者只留下看起来也很漂亮的本地人)

编辑: 这是代码的样子:

// in your widget update method:
View v = LayoutInflater.from(context).inflate(R.layout.widget, null);
ProgressBar pb = (ProgressBar) v.findViewById(R.id.progressBar1);
pb.setIndeterminateDrawable(R.drawable.widget_processing);

这是类似这样的 XML 的样子:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/RelativeLayout1"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >

<ImageView
    android:id="@+id/imageView1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentLeft="true"
    android:layout_alignParentTop="true"
    android:src="@drawable/ic_launcher" />

<TextView
    android:id="@+id/textView1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentTop="true"
    android:layout_toRightOf="@+id/imageView1"
    android:text="Medium Text"
    android:textAppearance="?android:attr/textAppearanceMedium" />

<TextView
    android:id="@+id/textView2"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignBottom="@+id/imageView1"
    android:layout_alignLeft="@+id/textView1"
    android:text="Small Text"
    android:textAppearance="?android:attr/textAppearanceSmall" />

<ProgressBar
    android:id="@+id/progressBar1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentRight="true"
    android:layout_alignParentTop="true"
    android:indeterminate="true" />

</RelativeLayout>
于 2012-12-19T11:38:59.963 回答
-1

在 Android 中为图像设置动画的最佳方式是使用 AnimationDrawable 系统。为此,您需要在您的可绘制文件夹之一中使用类似于下面的 xml。

<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
    android:oneshot="true">
    <item android:drawable="@drawable/image1" android:duration="200" />
    <item android:drawable="@drawable/image2" android:duration="200" />
    <item android:drawable="@drawable/image3" android:duration="200" />
</animation-list>

其中 image1、image2 和 image3 是资源中不同的可绘制对象,每个都代表图像的不同状态。

要创建图像,您只需使用 Gimp 或 Photoshop 打开图像,然后将其旋转几度并将其导出为新图像,然后重复。

或者,您可以使用以下代码来旋转 ImageView。首先在你的 res 文件夹下创建一个“anim”文件夹,然后添加一个 rotate.xml 文件,内容如下:

<rotate
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:fromDegrees="0"
    android:interpolator="@android:anim/linear_interpolator"
    android:toDegrees="360"
    android:pivotX="50%"
    android:pivotY="50%"
    android:duration="1000"
    android:startOffset="0"
/>

然后像这样导入并启动动画:

Animation rotation = AnimationUtils.loadAnimation(this, R.anim.rotation);
rotation.setRepeatCount(Animation.INFINITE);
imageView.startAnimation(rotation);
于 2012-12-19T11:33:30.220 回答