当前位置:首页 » 安卓系统 » android播放动画

android播放动画

发布时间: 2023-05-08 06:44:15

Ⅰ 吐血总结【Android动画】必知必会

通过AnimationListener可以监听Animation的运行过程,有三个方法分别是Animation开始的时候调用,完成的时候调用,重复的时候调用。
AnimationSet,动画集合。 我们最常用的是调用其 addAnimation 将一个个不一样的动画组织到一起来,然后调用view 的 startAnimation 方法触发这些动画执行。

setAnimation是告诉该控件我待会要执行什么动画,而要执行的的动画,是需要手动添加的。并且需要父view在动画快要开启的时候,调用invalidate。需要一定的条件限制。
而startAnimation告诉该控件,我要立马执行该动画,该动画就是已经设置好的动画。调用它时就会立即开始动画。

参看这篇文章: Android动画之Interpolator插补器和TypeEvaluator估值器

Property Animation提供了Animator.AnimatorListener和Animator.AnimatorUpdateListener两个监听器用于动画在播放过程中的重要动画事件。下面是两个监听器接口和方法的一些介绍和说明:

上面讲到ViewAnimation有许多xml加载,当然PropertyAnimation也可以对应xml加载,位置为 res/animator/
animator.xml

调用就用到了AnimatorInflater类了

组合动画也可以xml加载

在 Android 3.0 中给 View 增加了一些新的属性以及相应的 getter、setter 方法。Property Animation系统可以通过修改 View 对象实际的属性值来实现屏幕上的动画效果。此外,当属性值发生变化时,Views 也会自动调用 invalidate() 方法来刷新屏幕。 View 类中新增的便于实现 property 动画的属性包括:

1 . 第一个参数:设置目标对象,即操纵的view
2 . 第二个参数:设置操作的动画的属性值(见上面讲解的动画属性值)
3 . 第三个参数:可变数组参数 (初始值,中间值,结束值)。可以有一个到N个,如果是一个值的话默认这个值是动画过渡值的结束值。如果有N个值,动画就在这N个值之间过渡。

针对同一个对象多个属性,同时作用多种动画

可以调用其playTogether(同时执行)、playSequentially(顺序执行)、play、before、with、after 等方法设置动画的执行顺序,然后调用其start 触发动画执行。

Android 3.0后,谷歌给View增加animate方法直接驱动属性动画。

Ⅱ Android播放Spine骨骼动画笔记

官方实例: http://zh.esotericsoftware.com/spine-demos
官方工具: EsotericSoftware / spine-runtimes
java相关包: https://github.com/EsotericSoftware/spine-runtimes/tree/3.8/spine-libgdx

Libgdx实现和原生view进行层级透明叠加,修改GLSurfaceView为GLTextureview:
https://www.pianshen.com/article/6271275180/
此篇文章CSDN地址

检查了我们的json文件中的name,没有为null值的啊,于是对比可以运行的spine文件json发现:

最后发现是果然还是我的libgdx太搭并老,升级为最新的运枝握即旁庆可

之前的版本是

注意:升级成为新版本,那么格式也要用新版本,就是那种缺省了字段的json格式
所以版本匹配很重要。

而Demo只有 'armeabi','armeabi-v7a', 'x86' 这三个so的支持,于是我们修改配置如下

于是就可以正确的运行了,如果想支持其他的cup架构,那么就要找到对应的架构的 libgdx.so 文件,添加到项目中。

更新后:

这是1.9.10的介绍: https://www.badlogicgames.com/wordpress/

Ⅲ 求助一个android动画怎么写,音乐播放状态的动画

在Android3.0(即API Level11)以前,Android仅支持2种动画:分别是Frame Animation(逐帧动画)和Tween Animation(补间动画),在3.0之后Android支持了一种新的动画系统,称为:Property Animation(属性动画)。

一、Frame Animation:(逐帧动画)

这个很好理解,一帧帧的播放图片,利用人眼视觉残留原理,给我们带来动画的感觉。它的原理的GIF图片、电影播放原理一样。

1.定义逐帧动画比较简单,只要在中使用子元素定义所有播放帧即可。

(1) android:oneshot 设置是否仅播放一次

(2) android:drawable 设置每一帧图片

(3) android:ration 设置图片间切换间隔

2.习惯上把AnimationDrawable设置为ImageView的背景

android:background=@anim/frame_anim

然后我们就可以在java代码中获取AnimationDrawable对象了

AnimationDrawable anim = (AnimationDrawable)imageView.getBackground();

(需要注意的是,AnimationDrawable默认是不播放的,调用其start()方法开始播放,stop停止播放)

3.上面的动画文件是通过xml文件来配置的,如果你喜欢,也可以通过在java代码中创建AnimationDrawable对象,然后通过addFrame(Drawable frame, int ration)方法向动画添加帧,然后start()。。。

二、Tween Animation:(补间动画)

补间动画就是我们只需指定开始、结束的“关键帧“,而变化中的其他帧由系统来计算,不必自己一帧帧的去定义。

1. Android使用Animation代表抽象动画,包括四种子类:AlphaAnimation(透明度动画)、ScaleAnimation(缩放动画)、TranslateAnimation(位移动画)、RotateAnimation(透明度动画)。Android里面允许在java中创建Animation类对象,但是一般都会采用动画资源文件来定义动画,把界面与逻辑分离

<set android:interpolator="@android:anim/linear_interpolator" xmlns:android="http://schemas.android.com/apk/res/android">
<!-- 定义透明度的变换 -->

<!-- 定义旋转变换 -->
<rotate android:ration="3000/" android:fromdegrees="0" android:pivotx="50%" android:pivoty="50%" android:todegrees="1800">
</rotate></alpha></set>

(一个set可以同时定义多个动画,一起执行。)

2. android:interpolator=@android:anim/linear_interpolator控制动画期间需要补入多少帧,简单来说就是控制动画速度,有些地方翻译为“插值“。Interpolator有几种实现类:LinearInterpolator、AccelerateInterpolator、、CycleInterpolator、DecelerateInterpolator,具体使用可以参考官方API Demo。

3. 定义好anim文件后,我们可以通过AnimationUtils工具类来加载它们,加载成功后返回一个Animation。然后就可以通过View的startAnimation(anim)开始执行动画了。

Animation anim = AnimationUtils.loadAnimation(this, R.anim.anim);
//设置动画结束后保留结束状态
anim.setFillAfter(true);
//设置插值效果
anim.setInterpolator(interpolator);
//对view执行动画
view. startAnimation(anim);

三、Property Animation:(属性动画)

属性动画,这个是在Android 3.0中才引进的,它可以直接更改我们对象的属性。在上面提到的Tween Animation中,只是更改View的绘画效果而View的真实属性是不改变的。假设你用Tween动画将一个Button从左边移到右边,无论你怎么点击移动后的Button,他都没有反应。而当你点击移动前Button的位置时才有反应,因为Button的位置属性木有改变。而Property Animation则可以直接改变View对象的属性值,这样可以让我们少做一些处理工作,提高效率与代码的可读性。

(1)ValueAnimator:包含Property Animation动画的所有核心功能,如动画时间,开始、结束属性值,相应时间属性值计算方法等。应用ValueAnimator有两个步骤

1计算属性值。

2根据属性值执行相应的动作,如改变对象的某一属性。

我们的主是第二步,需要实现ValueAnimator.onUpdateListener接口,这个接口只有一个函数onAnimationUpdate(),将要改变View对象属性的事情在该接口中do。

animation.addUpdateListener(new AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
//do your work
}
});

(2)ObjectAnimator:继承自ValueAnimator,要指定一个对象及该对象的一个属性,当属性值计算完成时自动设置为该对象的相应属性,即完成了Property Animation的全部两步操作。实际应用中一般都会用ObjectAnimator来改变某一对象的某一属性,但用ObjectAnimator有一定的限制,要想使用ObjectAnimator,应该满足以下条件:

1.对象应该有一个setter函数:set(驼峰命名法)

2如下面的例子,像ofFloat之类的工场方法,第一个参数为对象名,第二个为属性名,后面的参数为可变参数,如果values…参数只设置了一个值的话,那么会假定为目的值,属性值的变化范围为当前值到目的值,为了获得当前值,该对象要有相应属性的getter方法:get

3如果有getter方法,其应返回值类型应与相应的setter方法的参数类型一致。

ObjectAnimator oa=ObjectAnimator.ofFloat(tv, alpha, 0f, 1f);
oa.setDuration(3000);
oa.start();

如果不满足上面的条件,我们只能乖乖的使用ValueAnimator来创建动画。

(3)Animator.AnimatorListener:可以为Animator设置动画监听,需要重写下面四个方法。

onAnimationStart()
onAnimationEnd()
onAnimationRepeat()
onAnimationCancel()

这里我们也可以实现AnimatorListenerAdapter,他的好处是可以只用定义想监听的事件而不用实现每个函数却只定义一空函数体。如下:

anim.addListener(new AnimatorListenerAdapter() {
public void on AnimationEnd(Animator animation){
//do your work
}
});

(4)AnimationSet:可以组合多个动画共同工作

AnimatorSet bouncer = new AnimatorSet();
bouncer.play(anim1).before(anim2);
bouncer.play(anim2).with(anim3);
bouncer.play(anim2).with(anim4)
bouncer.play(anim5).after(amin2);
animatorSet.start();

上面的代码意思是: 首先播放anim1;同时播放anim2,anim3,anim4;最后播放anim5。

(5)TimeInterplator:与Tween中的interpolator类似。有以下几种

AccelerateInterpolator 加速,开始时慢中间加速

DecelerateInterpolator 减速,开始时快然后减速

先加速后减速,开始结束时慢,中间加速

AnticipateInterpolator 反向 ,先向相反方向改变一段再加速播放

反向加回弹,先向相反方向改变,再加速播放,会超出目的值然后缓慢移动至目的值

BounceInterpolator 跳跃,快到目的值时值会跳跃,如目的值100,后面的值可能依次为85,77,70,80,90,100

CycleIinterpolator 循环,动画循环一定次数,值的改变为一正弦函数:Math.sin(2 * mCycles * Math.PI * input)

LinearInterpolator 线性,线性均匀改变

OvershottInterpolator 回弹,最后超出目的值然后缓慢改变到目的值

TimeInterpolator 一个接口,允许你自定义interpolator,以上几个都是实现了这个接口

(6)Keyframes:可以让我们定义除了开始和结束以外的关键帧。KeyFrame是抽象类,要通过ofInt(),ofFloat(),ofObject()获得适当的KeyFrame,然后通过PropertyValuesHolder.ofKeyframe获得PropertyValuesHolder对象,如下:

Keyframe kf0 = Keyframe.ofInt(0, 400);
Keyframe kf1 = Keyframe.ofInt(0.25f, 200);
Keyframe kf2 = Keyframe.ofInt(0.5f, 400);
Keyframe kf4 = Keyframe.ofInt(0.75f, 100);
Keyframe kf3 = Keyframe.ofInt(1f, 500);
PropertyValuesHolder pvhRotation = PropertyValuesHolder.ofKeyframe(width, kf0, kf1, kf2, kf4, kf3);
ObjectAnimator rotationAnim = ObjectAnimator.ofPropertyValuesHolder(btn, pvhRotation);
上述代码的意思是:设置btn对象的width属性值使其:开始时 Width=400,动画开始1/4时 Width=200,动画开始1/2时 Width=400,动画开始3/4时 Width=100,动画结束时 Width=500。

(7)ViewPropertyAnimator:对一个View同时改变多种属性,非常推荐用这种。该类对多属性动画进行了优化,会合并一些invalidate()来减少刷新视图。而且使用起来非常简便,但是要求API LEVEL 12,即Android 3.1以上。仅需要一行代码即可完成水平、竖直移动

myView.animate().translationX(50f). translationY(100f);

(8)常需要改变的一些属性:

translationX,translationY: View相对于原始位置的偏移量

rotation,rotationX,rotationY: 旋转,rotation用于2D旋转角度,3D中用到后两个

scaleX,scaleY: 缩放比

x,y: View的最终坐标,是View的left,top位置加上translationX,translationY

alpha: 透明度

四、最后自己总结一下这三种动画的优缺点:

(1)Frame Animation(帧动画)主要用于播放一帧帧准备好的图片,类似GIF图片,优点是使用简单方便、缺点是需要事先准备好每一帧图片;

(2)Tween Animation(补间动画)仅需定义开始与结束的关键帧,而变化的中间帧由系统补上,优点是不用准备每一帧,缺点是只改变了对象绘制,而没有改变View本身属性。因此如果改变了按钮的位置,还是需要点击原来按钮所在位置才有效。

(3)Property Animation(属性动画)是3.0后推出的动画,优点是使用简单、降低实现的复杂度、直接更改对象的属性、几乎可适用于任何对象而仅非View类,缺点是需要3.0以上的API支持,限制较大!但是目前国外有个开源库,可以提供低版本支持!

Ⅳ Android 动画详解

  android中酷炫的效果,都离不开动画的支持。这里我们详细介绍一下android中动画的分类。android的中动画分为帧动画、补间动画、属性动画。原理各不相同,实现的效果也大不相同。下面一一讲解三种动画。

  帧动画顾名思义就是通过顺序一帧一帧播放图片从而产生动画效果,效果类似放电影。该动画缺点比较明显,就是如果图片过大过多会导致OOM。帧动画xml文件放置在drawable目录下而非anim文件夹下。

  补间动画是通过对view进行旋转、缩放、渐变、透明度变化,而达到的一种动画效果。是一种渐进式动画。并且可以通过组合以上四种操作,完成复杂的自定义动画效果。缺点就是只是改变的view的展示状态,但是不会改变view的位置。例如我们将一个button通过位移想左移动100dp,然后停留在终点。但是我们可以发现展示的位置button点击无效果,不可以交互。而在button原始位置空白的地方点击会触发button的点击效果。也就是button本质还是在原来位置,只是展示左移了100dp。

透明度动画,通过改变view的透明度展示动画。对应AlphaAnimation和<alpha>xml标签

缩放动画,通过修改view的大小展示动画。对应ScaleAnimation类和<scale>xml表情

通过旋转view展示动画。对应RotateAnimation类和<rotate>xml标签

平移动画,更改view的展示位置展示动画。对应TranslateAnimation类和<translate>xml表情

应用动画xml配置

使用java类配置动画,具体参数类同xml参数,建议使用xml配置动画

  属性动画本质是通过改变对象的属性(例如:x,y等属性),来实现动画的,所以基本上是无所不能的,只要对象有这个属性,就能实现动画效果。属性动画是在api11的新特性,通过动态的改变view的属性从而达到动画效果。虽然可以使用nineoldandroid库向下兼容,但是兼容本质是使用补间动画完成,也就是说不会更改view的属性,也不会更改view的位置。属性动画比较常用的类: ValueAnimator、ObjectAnimator、AnimationSet,其中ObjectAnimator是ValueAnimator的子类,而AnminationSet是动画集合

动画配置同样可以使用xml配置,参数类似,这里不做详细说明。

根据时间流逝百分比计算当前属性改变百分比。同xml配置动画中的 android:interpolator 属性配置,常见有LinearInterpolator(线性差值器)、(加速减速差值器)
等。自定义需要实现 Interpolator 或者 TimeInterpolator 。Interpolator接口继承TimeInterpolator。

根据当前属性改变百分比计算改变后的属性值。属性动画特有的属性。自定义估值器需要实现 TypeEvaluator 接口。

可以对任意属性做属性动画,属性动画要求动画作用的对象提供该属性的get()和set()方法。因为属性动画本质就是根据外界传递的对象属性的初始值和终点值,然后根据估值器和差值器计算属性值,不断调用属性的set方法,通过时间的推移所传递的值,越来越近终点值。
注意:

使用ValueAnimator通过监听动画过程,自己改变对象属性完成动画

Ⅳ Android开发之ImageView播放GIF动画实例

Android开发之ImageView播放GIF动画实例

Android的原生控件并不支持播放GIF格式的图片,如果想在Android中显示一张GIF动态图片,可以利用 ImageView控件来完成,但是放进去之后,你会发现,ImageView它只会显示这张图片的第一帧,不会产生任何的动画效果。我们必须通过自定义控件的方式来实现ImageView播放GIF 图片的功能。

首先我们来编写一个PowerImageView控件,让它既能支持ImageView控件原生的所有功能,同时还可以播放GIF动态图片。

先新建一个项目PowerImageViewTest,这里使用Android 4.0+Eclipse。

由于是要自定义控件,会需要一些自定义的控件属性,因此我们需要在values目录下新建一个attrs.xml的文件,在这个文件中添加项目需要的自定义属性。

这里我们目前暂时只需要一个自动播放auto_play属性,XML文件代码如下:

<?xml version="1.0" encoding="utf-8"?>

这个文件完成之后,下面我们来开始编写主类PowerImageView类,由于PowerImageView类需要支持ImageView的所有功能,我们必须要让PowerImageView继承自ImageView,代码如下:

public class PowerImageView extends ImageView implements OnClickListener {

/**

* 播放GIF动画的关键类

*/

private Movie mMovie;

/**

* 开始播放按钮图片

*/

private Bitmap mStartButton;

/**

* 记录动画开始的时间

*/

private long mMovieStart;

/**

* GIF图片的宽度

*/

private int mImageWidth;

/**

* GIF图片的高度

*/

private int mImageHeight;

/**

* 图片是否正在播放

*/

private boolean isPlaying;

/**

* 是否允许自动播放

*/

private boolean isAutoPlay;

/**

* PowerImageView构造函数。

*

* @param context

*/

public PowerImageView(Context context) {

super(context);

}

/**

* PowerImageView构造函数。

*

* @param context

*/

public PowerImageView(Context context, AttributeSet attrs) {

this(context, attrs, 0);

}

/**

* PowerImageView构造函数,在这里完成所有必要的初始化操作。

*

* @param context

*/

public PowerImageView(Context context, AttributeSet attrs, int defStyle) {

super(context, attrs, defStyle);

TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.PowerImageView);

int resourceId = getResourceId(a, context, attrs);

if (resourceId != 0) {

// 当资源id不等于0时,就去获取该资源的流

InputStream is = getResources().openRawResource(resourceId);

// 使用Movie类对流进行解码

mMovie = Movie.decodeStream(is);

if (mMovie != null) {

// 如果返回值不等于null,就说明这是一个GIF图片,下面获取是否自动播放的属性

isAutoPlay = a.getBoolean(R.styleable.PowerImageView_auto_play, false);

Bitmap bitmap = BitmapFactory.decodeStream(is);

mImageWidth = bitmap.getWidth();

mImageHeight = bitmap.getHeight();

bitmap.recycle();

if (!isAutoPlay) {

// 当不允许自动播放的时候,得到开始播放按钮的图片,并注册点击事件

mStartButton = BitmapFactory.decodeResource(getResources(),R.drawable.start_play);

setOnClickListener(this);

}

}

}

}


@Override

public void onClick(View v) {

if (v.getId() == getId()) {

// 当用户点击图片时,开始播放GIF动画

isPlaying = true;

invalidate();

}

}


@Override

protected void onDraw(Canvas canvas) {

if (mMovie == null) {

// mMovie等于null,说明是张普通的图片,则直接调用父类的onDraw()方法

super.onDraw(canvas);

} else {

// mMovie不等于null,说明是张GIF图片

if (isAutoPlay) {

// 如果允许自动播放,就调用playMovie()方法播放GIF动画

playMovie(canvas);

invalidate();

} else {

// 不允许自动播放时,判断当前图片是否正在播放

if (isPlaying) {

// 正在播放就继续调用playMovie()方法,一直到动画播放结束为止

if (playMovie(canvas)) {

isPlaying = false;

}

invalidate();

} else {

// 还没开始播放就只绘制GIF图片的第一帧,并绘制一个开始按钮

mMovie.setTime(0);

mMovie.draw(canvas, 0, 0);

int offsetW = (mImageWidth - mStartButton.getWidth()) / 2;

int offsetH = (mImageHeight - mStartButton.getHeight()) / 2;

canvas.drawBitmap(mStartButton, offsetW, offsetH, null);

}

}

}

}


@Override

protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {

super.onMeasure(widthMeasureSpec, heightMeasureSpec);

if (mMovie != null) {

// 如果是GIF图片则重写设定PowerImageView的大小

setMeasuredDimension(mImageWidth, mImageHeight);

}

}


/**

* 开始播放GIF动画,播放完成返回true,未完成返回false。

*

* @param canvas

* @return 播放完成返回true,未完成返回false。

*/

private boolean playMovie(Canvas canvas) {

long now = SystemClock.uptimeMillis();

if (mMovieStart == 0) {

mMovieStart = now;

}

int ration = mMovie.ration();

if (ration == 0) {

ration = 1000;

}

int relTime = (int) ((now - mMovieStart) % ration);

mMovie.setTime(relTime);

mMovie.draw(canvas, 0, 0);

if ((now - mMovieStart) >= ration) {

mMovieStart = 0;

return true;

}

return false;

}


/**

* 通过Java反射,获取到src指定图片资源所对应的id。

*

* @param a

* @param context

* @param attrs

* @return 返回布局文件中指定图片资源所对应的id,没有指定任何图片资源就返回0。

*/

private int getResourceId(TypedArray a, Context context, AttributeSet attrs) {

try {

Field field = TypedArray.class.getDeclaredField("mValue");

field.setAccessible(true);

TypedValue typedValueObject = (TypedValue) field.get(a);

return typedValueObject.resourceId;

} catch (Exception e) {

e.printStackTrace();

} finally {

if (a != null) {

a.recycle();

}

}

return 0;

}


}

这个类的代码注释已经非常详细了,我再来简单地解释一下。可以看到,我们重写了ImageView中所有的构建函数,使得 PowerImageView的用法可以和ImageView完全相同。在构造函数中,则是对所有必要的数据进行了初始化操作。首先,我们调用了 getResourceId()方法去获取图片资源对应的id值,在getResourceId()方法内部是通过Java的反射机制来进行获取的。得到了图片资源的id后,我们将它转换成InputStream,然后传入到Movie.decodeStream()方法中以解码出Movie对象。如果得到的Movie对象等于null,说明这是一张普通的图片资源,就不再进行任何特殊处理,因为父类ImageView都帮我们处理好了。如果得到的 Movie对象不等于null,则说明这是一张GIF图片,接着就要去获取是否允许自动播放、图片的宽高等属性的值。如果不允许自动播放,还要给播放按钮 注册点击事件,默认是不允许自动播放的。

接下来会进入到onMeasure()方法中。在这个方法中我们进行判断,如果这是一张GIF图片,则需要将PowerImageView的宽高重定义,使得控件的大小刚好可以放得下这张GIF图片。

再往后就会进入到onDraw()方法中。在这个方法里同样先判断当前是一张普通的图片还是GIF图片,如果是普通的图片就直接调用 super.onDraw()方法交给ImageView去处理就好了。如果是GIF图片,则先判断该图是否允许自动播放,允许的话就调用 playMovie()方法去播放GIF图片就好,不允许的话则会先在PowerImageView中绘制该GIF图片的第一帧,并在图片上绘制一个播放 按钮,当用户点击了播放按钮时,再去调用playMovie()方法去播放GIF图片。

下面我们来看看playMovie()方法中是怎样播放GIF图片的吧。可以看到,首先会对动画开始的时间做下记录,然后对动画持续的时间做下记 录,接着使用当前的时间减去动画开始的时间,得到的时间就是此时PowerImageView应该显示的那一帧,然后借助Movie对象将这一帧绘制到屏 幕上即可。之后每次调用playMovie()方法都会绘制一帧图片,连贯起来也就形成了GIF动画。注意,这个方法是有返回值的,如果当前时间减去动画 开始时间大于了动画持续时间,那就说明动画播放完成了,返回true,否则返回false。

完成了PowerImageView的编写,下面我们就来看一看如何使用它吧,其实非常简单,打开或新建activity_main.xml,代码如下所示:

<relativelayout p=""

android:layout_width="match_parent"

android:layout_height="match_parent" >


<com.example.powerimageviewtest.powerimageview p=""

android:id="@+id/image_view"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_centerInParent="true"

android:src="@drawable/anim"

/>


可以看到,PowerImageView的用法和ImageView几乎完全一样,使用android:src属性来指定一张图片即可,这里指定的anim就是一张GIF图片。然后我们让PowerImageView在布局里居中显示MainActivity中的代码都是自动生成的,这里就不再贴出来了。在AndroidManifest.xml中还有一点需要注意,有些4.0 以上系统的手机启动了硬件加速功能之后会导致GIF动画播放不出来,因此我们需要在AndroidManifest.xml中去禁用硬件加速功能,可以通过指定android:hardwareAccelerated属性来完成,代码如下所示:

<?xml version="1.0" encoding="utf-8"?>

<manifest p=""

package="com.example.powerimageviewtest"

android:versionCode="1"

android:versionName="1.0" >


<uses-sdk p=""

android:minSdkVersion="14"

android:targetSdkVersion="17" />


android:allowBackup="true"

android:icon="@drawable/ic_launcher"

android:label="@string/app_name"

android:theme="@style/AppTheme"

android:hardwareAccelerated="false"

>

android:name="com.example.powerimageviewtest.MainActivity"

android:label="@string/app_name" >


现在可以来运行一下代码了,一打开程序你就会看到GIF图片的第一帧,点击图片之后就可以播放GIF动画了。

然后我们还可以通过修改activity_main.xml中的代码,给它加上允许自动播放的属性,代码如下所示:

<relativelayout p=""

xmlns:attr="http://schemas.android.com/apk/res/com.example.powerimageviewtest"

android:layout_width="match_parent"

android:layout_height="match_parent" >


<com.example.powerimageviewtest.powerimageview p=""

android:id="@+id/image_view"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_centerInParent="true"

android:src="@drawable/anim"

attr:auto_play="true"

/>


这里使用了刚才我们自定义的属性,通过attr:auto_play来启用和禁用自动播放功能。现在将auto_play属性指定成true后,PowerImageView上就不会再显示一个播放按钮,而是会循环地自动播放动画。不仅如此,PowerImageView还继承了ImageView原生的所有功能,只要指定的不是GIF图 片,PowerImageView表现的结果就和ImageView完全一致,现在我们来放一张普通的PNG图片,修改 activity_main.xml中的代码,如下所示:

<relativelayout p=""

android:layout_width="match_parent"

android:layout_height="match_parent" >


<com.example.powerimageviewtest.powerimageview p=""

android:id="@+id/image_view"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_centerInParent="true"

android:src="@drawable/myphoto"

/>


这里在src属性里面指定了一张名字为myphoto的PNG图片,图片在布局正中央显示出来了,正是普通ImageView所具备的功能。我们还可以在PowerImageView中指定android:scaleType等属性,用法和原生的ImageView完全一样。

Ⅵ Android 中的动画有哪几类,它们的特点和区别是什么

Android 中的动画有帧动画,补间动画,属性动画,她们的忑点和使用方法如下:
###帧动画
> 一张张图片不断的切换,形成动画效果
* 在drawable目录下定义xml文件,子节点为animation-list,在这里定义要显示的图片和每张图片的显示时长
<animation-list xmlns:android="http://schemas.android.com/apk/res/android" android:oneshot="false">
<item android:drawable="@drawable/g1" android:ration="200" />
<item android:drawable="@drawable/g2" android:ration="200" />
<item android:drawable="@drawable/g3" android:ration="200" />
</animation-list>
* 在屏幕上播放帧动画
ImageView iv = (ImageView) findViewById(R.id.iv);
//把动画文件设置为imageView的背景
iv.setBackgroundResource(R.drawable.animations);
AnimationDrawable ad = (AnimationDrawable) iv.getBackground();
//播放动画
ad.start();
###补间动画
* 原形态变成新形态时为了过渡变形过程,生成的动画就叫补间动画
* 位移、旋转、缩放、透明
#####位移:
* 参数10指的是X的起点坐标,但不是指屏幕x坐标为10的位置,而是imageview的 真实X + 10
* 参数150指的是X的终点坐标,它的值是imageview的 真实X + 150
//创建为位移动画对象,设置动画的初始位置和结束位置
TranslateAnimation ta = new TranslateAnimation(10, 150, 20, 140);
* x坐标的起点位置,如果相对于自己,传0.5f,那么起点坐标就是 真实X + 0.5 * iv宽度
* x坐标的终点位置,如果传入2,那么终点坐标就是 真实X + 2 * iv的宽度
* y坐标的起点位置,如果传入0.5f,那么起点坐标就是 真实Y + 0.5 * iv高度
* y坐标的终点位置,如果传入2,那么终点坐标就是 真实Y + 2 * iv高度
TranslateAnimation ta = new TranslateAnimation(Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 2, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 2);
* 动画播放相关的设置
//设置动画持续时间
ta.setDuration(2000);
//动画重复播放的次数
ta.setRepeatCount(1);
//动画重复播放的模式
ta.setRepeatMode(Animation.REVERSE);
//动画播放完毕后,组件停留在动画结束的位置上
ta.setFillAfter(true);
//播放动画
iv.startAnimation(ta);
#####缩放:
* 参数0.1f表示动画的起始宽度是真实宽度的0.1倍
* 参数4表示动画的结束宽度是真实宽度的4倍
* 缩放的中心点在iv左上角
ScaleAnimation sa = new ScaleAnimation(0.1f, 4, 0.1f, 4);
* 参数0.1f和4意义与上面相同
* 改变缩放的中心点:传入的两个0.5f,类型都是相对于自己,这两个参数改变了缩放的中心点
* 中心点x坐标 = 真实X + 0.5 * iv宽度
* 中心点Y坐标 = 真实Y + 0.5 * iv高度
ScaleAnimation sa = new ScaleAnimation(0.1f, 4, 0.1f, 4, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
#####透明:
* 0为完全透明,1为完全不透明
AlphaAnimation aa = new AlphaAnimation(0, 0.5f);
#####旋转:
* 20表示动画开始时的iv的角度
* 360表示动画结束时iv的角度
* 默认旋转的圆心在iv左上角
RotateAnimation ra = new RotateAnimation(20, 360);
* 20,360的意义和上面一样
* 指定圆心坐标,相对于自己,值传入0.5,那么圆心的x坐标:真实X + iv宽度 * 0.5
* 圆心的Y坐标:真实Y + iv高度 * 0.5
RotateAnimation ra = new RotateAnimation(20, 360, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
---
#属性动画
* 补间动画,只是一个动画效果,组件其实还在原来的位置上,xy没有改变
###位移:
* 第一个参数target指定要显示动画的组件
* 第二个参数propertyName指定要改变组件的哪个属性
* 第三个参数values是可变参数,就是赋予属性的新的值
* 传入0,代表x起始坐标:当前x + 0
* 传入100,代表x终点坐标:当前x + 100

//具有get、set方法的成员变量就称为属性
ObjectAnimator oa = ObjectAnimator.ofFloat(bt, "translationX", 0, 100) ;

###缩放:
* 第三个参数指定缩放的比例
* 0.1是从原本高度的十分之一开始
* 2是到原本高度的2倍结束

ObjectAnimator oa = ObjectAnimator.ofFloat(bt, "scaleY", 0.1f, 2);
###透明:
* 透明度,0是完全透明,1是完全不透明

ObjectAnimator oa = ObjectAnimator.ofFloat(bt, "alpha", 0.1f, 1);
###旋转
* rotation指定是顺时针旋转
* 20是起始角度
* 270是结束角度
ObjectAnimator oa = ObjectAnimator.ofFloat(bt, "rotation", 20, 270);
* 属性指定为rotationX是竖直翻转
* 属性指定为rotationY是水平翻转
ObjectAnimator oa = ObjectAnimator.ofFloat(bt, "rotationY", 20, 180);
###可变参数
* 第三个参数可变参数可以传入多个参数,可以实现往回位移(旋转、缩放、透明)
ObjectAnimator oa = ObjectAnimator.ofFloat(bt, "translationX", 0, 70, 30, 100) ;

Ⅶ 请问android动画如何顺序播放两种效果

你可以这么做

在第一种动画上设置动画监听,当监听到动画结束后在执行第二种动画。例如

AlphaAnimationanimation=newAlphaAnimation(0,1);//第一种动画
animation.setDuration(100);
animation.setAnimationListener(newAnimationListener(){

@Override
publicvoidonAnimationStart(Animationanimation){
//代码

}

@Override
publicvoidonAnimationRepeat(Animationanimation){
//代码
}

@Override
publicvoidonAnimationEnd(Animationanimation){
//第二种动画
}
});
View.startAnimation(animation);
热点内容
abaqus如何配置证书 发布:2025-05-19 18:19:38 浏览:582
美食的密码是多少 发布:2025-05-19 18:18:58 浏览:71
买合资车选哪个品牌好配置高 发布:2025-05-19 18:01:51 浏览:49
pythonc回调 发布:2025-05-19 17:55:50 浏览:268
苹果如何把通讯录转移到安卓手机 发布:2025-05-19 17:49:13 浏览:255
开机设密码源码 发布:2025-05-19 17:47:20 浏览:885
死锁检测算法 发布:2025-05-19 17:45:17 浏览:109
sql查询列 发布:2025-05-19 17:38:16 浏览:279
安卓怎么录屏只录一点 发布:2025-05-19 17:12:39 浏览:522
甘肃移动服务密码在哪里 发布:2025-05-19 17:11:15 浏览:542