Android逐帧动画的简单使用-语音播放效果的实现

逐帧动画(Frame-By-Frame Animation)原理很简单,即快速切换不同的图片,形成动画效果。Android中逐帧动画的实现方式也很简单,下面以语音播放效果为例说明。

1. 首先准备图片素材

三张图片分别命名为play1.png,  play2.png,  play3.png,放入drawable目录下,图片如下:

    

2. 编写anim.xml文件,放人drawable目录下,文件内容如下:

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

 

<animation-listxmlns:android="http://schemas.android.com/apk/res/android"

        android:oneshot="false">

    <item android:drawable="@drawable/play3"android:duration="200"/>

    <item android:drawable="@drawable/play2"android:duration="200"/>

    <item android:drawable="@drawable/play1"android:duration="200"/>

</animation-list>

(注:1,oneshot表示是否循环播放,true表示不循环,false表示循环,duration表示间隔时间

  2,三张图片所在item的顺序,表示播放顺序,即按照play3-play2-play1顺序播放)


3. 编写activity_main.xml布局,将上面的anim.xml设置为ImageView的背景。文件内容如下:

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

<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"

    android:layout_width="match_parent"

    android:layout_height="match_parent"

    android:orientation="vertical"

    android:paddingLeft="10dp"

    android:paddingRight="10dp">

 

    <LinearLayout

        android:layout_width="match_parent"

        android:layout_height="wrap_content"

        android:orientation="horizontal">

 

        <Button

            android:id="@+id/startAnim"

            android:layout_width="0dp"

            android:layout_height="wrap_content"

            android:layout_margin="10dp"

            android:layout_weight="1"

            android:text="startAnim"/>

 

        <Button

            android:id="@+id/stopAnim"

            android:layout_width="0dp"

            android:layout_height="wrap_content"

            android:layout_margin="10dp"

            android:layout_weight="1"

            android:text="stopAnim"/>

    </LinearLayout>

 

    <ImageView

        android:id="@+id/ivAnim"

        android:layout_width="wrap_content"

        android:layout_height="wrap_content"

        android:background="@drawable/anim"

        android:layout_gravity="center_horizontal"

         />

 

</LinearLayout>

预览图片如下图:



4. 获取ImageView的背景,强转成AnimationDrawable,然后分别调用start()和stop()来控制动画的开始与停止,java代码如下:

packagecom.example;

 

importandroid.app.Activity;

importandroid.graphics.drawable.AnimationDrawable;

importandroid.os.Bundle;

importandroid.view.View;

importandroid.view.View.OnClickListener;

importandroid.widget.Button;

importandroid.widget.ImageView;

 

public class MainActivity extends Activity {

    // 开始按钮/停止按钮

    private Button startAnim;

    private Button stopAnim;

    private AnimationDrawabledrawable;

    private ImageView ivAnim;

 

    @Override

    public voidonCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);

 

        // 控件初始化

        startAnim =(Button) findViewById(R.id.startAnim);

        stopAnim =(Button) findViewById(R.id.stopAnim);

        ivAnim =(ImageView) findViewById(R.id.ivAnim);

        drawable = (AnimationDrawable)ivAnim.getBackground();

        // 开始按钮设置监听器

        startAnim.setOnClickListener(newOnClickListener() {

 

            @Override

            public voidonClick(View v) {

                if (drawable !=null) {

                    drawable.start();

                }

            }

        });

        // 停止按钮设置监听器

        stopAnim.setOnClickListener(newOnClickListener() {

 

            @Override

            public voidonClick(View v) {

                if (drawable !=null) {

                    drawable.stop();

                }

            }

        });

    }

}

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单的Java代码示例,演示如何在Android使用OpenGL实现逐帧动画播放效果: ```java public class MyGLRenderer implements GLSurfaceView.Renderer { private Context mContext; private int[] mTextures; private int mCurrentFrame = 0; private int mFrameCount; private int mFrameWidth; private int mFrameHeight; public MyGLRenderer(Context context, int frameCount, int frameWidth, int frameHeight) { mContext = context; mFrameCount = frameCount; mFrameWidth = frameWidth; mFrameHeight = frameHeight; mTextures = new int[frameCount]; } @Override public void onSurfaceCreated(GL10 gl, EGLConfig config) { // 初始化OpenGL ES gl.glClearColor(0.0f, 0.0f, 0.0f, 0.0f); gl.glEnable(GL10.GL_BLEND); gl.glBlendFunc(GL10.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA); // 加载动画帧图像资源 for (int i = 0; i < mFrameCount; i++) { Bitmap bitmap = BitmapFactory.decodeResource(mContext.getResources(), R.drawable.frame_1 + i); gl.glGenTextures(1, mTextures, i); gl.glBindTexture(GL10.GL_TEXTURE_2D, mTextures[i]); GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bitmap, 0); bitmap.recycle(); } } @Override public void onSurfaceChanged(GL10 gl, int width, int height) { // 设置视口大小 gl.glViewport(0, 0, width, height); gl.glMatrixMode(GL10.GL_PROJECTION); gl.glLoadIdentity(); GLU.gluOrtho2D(gl, 0, width, 0, height); gl.glMatrixMode(GL10.GL_MODELVIEW); gl.glLoadIdentity(); } @Override public void onDrawFrame(GL10 gl) { // 绘制纹理 gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT); gl.glBindTexture(GL10.GL_TEXTURE_2D, mTextures[mCurrentFrame]); float ratio = (float) mFrameWidth / mFrameHeight; gl.glPushMatrix(); gl.glTranslatef((gl.glGetParameter(GL10.GL_VIEWPORT, 0) - mFrameWidth) / 2, (gl.glGetParameter(GL10.GL_VIEWPORT, 1) - mFrameHeight) / 2, 0); gl.glScalef(Math.min(gl.glGetParameter(GL10.GL_VIEWPORT, 2) / (float) mFrameWidth, gl.glGetParameter(GL10.GL_VIEWPORT, 3) / (float) mFrameHeight), Math.min(gl.glGetParameter(GL10.GL_VIEWPORT, 2) / (float) mFrameWidth, gl.glGetParameter(GL10.GL_VIEWPORT, 3) / (float) mFrameHeight) * ratio, 1); gl.glEnableClientState(GL10.GL_VERTEX_ARRAY); gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY); float vertices[] = {0, 0, 0, mFrameHeight, mFrameWidth, mFrameHeight, mFrameWidth, 0}; gl.glVertexPointer(2, GL10.GL_FLOAT, 0, FloatBuffer.wrap(vertices)); float texCoords[] = {0, 0, 0, 1, 1, 1, 1, 0}; gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, FloatBuffer.wrap(texCoords)); gl.glDrawArrays(GL10.GL_TRIANGLE_FAN, 0, 4); gl.glDisableClientState(GL10.GL_VERTEX_ARRAY); gl.glDisableClientState(GL10.GL_TEXTURE_COORD_ARRAY); gl.glPopMatrix(); // 更新当前显示的纹理 mCurrentFrame = (mCurrentFrame + 1) % mFrameCount; } } ``` 你可以将以上代码添加到你的Android项目中,并根据实际需求进行调整和优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值