Android SurfaceView 执行动画

1. 概述

在Android开发中,SurfaceView是一个强大的视图容器,它可以用于绘制复杂的图形、动画和视频等。在本文中,我们将教会一位刚入行的小白如何使用SurfaceView来执行动画。

2. 实现步骤

步骤 代码示例 说明
1 ```java

// 创建一个继承自SurfaceView的自定义视图类 public class MySurfaceView extends SurfaceView implements SurfaceHolder.Callback { private MyThread myThread;

public MySurfaceView(Context context) {
    super(context);
    init();
}

public MySurfaceView(Context context, AttributeSet attrs) {
    super(context, attrs);
    init();
}

private void init() {
    SurfaceHolder holder = getHolder();
    holder.addCallback(this);
}

@Override
public void surfaceCreated(SurfaceHolder holder) {
    // 初始化绘制线程
    myThread = new MyThread(holder);
    myThread.start();
}

@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
    // 空实现
}

@Override
public void surfaceDestroyed(SurfaceHolder holder) {
    // 停止绘制线程
    myThread.setRunning(false);
    boolean retry = true;
    while (retry) {
        try {
            myThread.join();
            retry = false;
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

}

| 2 | ```java
// 创建一个继承自Thread的绘制线程类
public class MyThread extends Thread {
    private SurfaceHolder surfaceHolder;
    private boolean isRunning = true;

    public MyThread(SurfaceHolder surfaceHolder) {
        this.surfaceHolder = surfaceHolder;
    }

    public void setRunning(boolean running) {
        isRunning = running;
    }

    @Override
    public void run() {
        while (isRunning) {
            Canvas canvas = null;
            try {
                canvas = surfaceHolder.lockCanvas();
                if (canvas != null) {
                    // 在这里进行绘制和动画的操作
                    draw(canvas);
                    // 控制帧率
                    Thread.sleep(16);
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            } finally {
                if (canvas != null) {
                    surfaceHolder.unlockCanvasAndPost(canvas);
                }
            }
        }
    }

    private void draw(Canvas canvas) {
        // 绘制代码
    }
}
``` | 创建一个继承自Thread的绘制线程类,通过SurfaceHolder来进行绘制操作。在run()方法中,利用lockCanvas()和unlockCanvasAndPost()方法来获取和释放绘图画布,并在其中进行绘制和动画的操作。通过设置isRunning变量来控制线程的运行状态。 |
| 3 | ```java
// 在Activity中使用自定义的SurfaceView
public class MainActivity extends AppCompatActivity {
    private MySurfaceView mySurfaceView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mySurfaceView = findViewById(R.id.my_surface_view);
    }

    @Override
    protected void onResume() {
        super.onResume();
        // 恢复绘制线程
        mySurfaceView.onResume();
    }

    @Override
    protected void onPause() {
        super.onPause();
        // 暂停绘制线程
        mySurfaceView.onPause();
    }
}
``` | 在Activity中使用自定义的SurfaceView。在onResume()方法中恢复绘制线程的运行,在onPause()方法中暂停绘制线程的运行。需要确保在布局文件中添加一个id为my_surface_view的SurfaceView控件。 |

以上就是使用SurfaceView执行动画的基本步骤和代码示例。小白可以按照这个流程来实现自己的动画效果。在自定义的SurfaceView类中,可以根据具体需求进行绘制和动画的操作。同时,可以通过调整帧率来控制动画的流畅性。希望对小白有所帮助!