在窗口小部件中动画.png图像

时间:2012-12-19 11:20:29

标签: android android-widget android-animation android-imageview

问题描述


我正在为Android编写一个 简单的Widget应用程序 ,在我的Widget I Layout中我有ImageViewRefresh控件,我在其上设置了Refresh Image Picture(Green图片如下)。

问题


在某些时候,我按下我的Widget中的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" />

我想要旋转的图片。

Rotate Image

2 个答案:

答案 0 :(得分:4)

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

  • 经测试,系统不会自动旋转drawable,但有些样式你可以改变它(我老实说不记得,它是2年前在Eclair上),但你可以尝试找到它。
  • 下面的答案有效(因为它已经过测试),但不适用于自定义绘图,它不会旋转它们。
  • 对于自定义动画可绘制,请参阅此处:Custom Drawable for ProgressBar/ProgressDialog
  • 但正如其中一条评论所述,app小部件不应该运行动画Is there a way to animate on a 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>

答案 1 :(得分:-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在您的资源中是不同的drawable,每个drawable都代表图像的不同状态。

要创建图像,您只需使用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);