【发布时间】:2012-05-20 18:00:26
【问题描述】:
我想做一个动画,一个从右到左移动的波浪。 我做了一个波浪的图像,它的开始与结束重合
我想做一个波浪移动的动画,animationlist 我需要超过 400 帧,并且应用程序的大小会增长...
我需要一种方法来将这个唯一的框架从右向左移动,有什么帮助吗?
【问题讨论】:
标签: android image animation loops wave
我想做一个动画,一个从右到左移动的波浪。 我做了一个波浪的图像,它的开始与结束重合
我想做一个波浪移动的动画,animationlist 我需要超过 400 帧,并且应用程序的大小会增长...
我需要一种方法来将这个唯一的框架从右向左移动,有什么帮助吗?
【问题讨论】:
标签: android image animation loops wave
您可以创建自己的Drawable 来实现Animatable,并让图像从右向左移动。拥有它实际上是一件非常有用的事情。但是,您无法从 XML 中指定它,您必须以编程方式构建和设置它。
【讨论】:
Drawable 的类来创建自己的自定义drawable,并让它实现Animatable。然后,您将自己绘制,每次都在不同的位置,从单个输入图像生成选取框动画。
您甚至可以创建一个 GIF 并播放这个 GIF: 下面是代码:
类 MainActivity:
import android.app.Activity;
import android.os.Bundle;
public class MainActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(new MYGIFView(MainActivity.this));
}
}
类MYGIFView:
import java.io.InputStream;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Movie;
import android.view.View;
class MYGIFView extends View {
Movie movie, movie1;
InputStream is = null, is1 = null;
long moviestart;
public MYGIFView(Context context) {
super(context);
// Provide your own gif animation file
is = context.getResources().openRawResource(R.drawable.animation);
movie = Movie.decodeStream(is);
}
@Override
protected void onDraw(Canvas canvas) {
canvas.drawColor(Color.WHITE);
super.onDraw(canvas);
long now = android.os.SystemClock.uptimeMillis();
System.out.println("now=" + now);
if (moviestart == 0) { // first time
moviestart = now;
}
System.out.println("\tmoviestart=" + moviestart);
int relTime = (int) ((now - moviestart) % movie.duration());
System.out.println("time=" + relTime + "\treltime=" + movie.duration());
movie.setTime(relTime);
movie.draw(canvas, this.getWidth() / 2 - 20, this.getHeight() / 2 - 40);
this.invalidate();
}
}
drawable 文件夹内将是您的 GIF 图像。
【讨论】:
首先,您必须将图像 src 的大小加倍,有 2 个波浪而不是一个。 接下来,您必须使用 imageview 的框架边界,您必须适合 仅 ONE 波。这就是线索。
注意你的图片尺寸,尤其是宽度。
对于动画,使用这个:
<?xml version="1.0" encoding="utf-8"?>
<translate
xmlns:android="http://schemas.android.com/apk/res/android"
android:fromXDelta="0%"
android:toXDelta="-50%"
android:fromYDelta="0%"
android:toYDelta="0%"
android:duration="500"
android:repeatCount="1000"
android:interpolator="@android:anim/linear_interpolator"
android:zAdjustment="top" />
例如,您可以将其命名为 res/anim/wave.xml
班级(活动?):
...
Animation anim = AnimationUtils.loadAnimation( this, R.anim.wave);
anim.setRepeatMode(Animation.Infinite);
animatedIm = (ImageView) findviewbyid(<your-id>)
animatedIm.setAnimation(anim);
您可能需要调整 imageview 的大小,以获得连续的波浪移动
【讨论】: