Android Surface Rotate 实现流程
流程图
graph LR
A[开始] --> B(初始化SurfaceView)
B --> C(创建SurfaceHolder)
C --> D(添加SurfaceHolder.Callback)
D --> E(重写SurfaceHolder.Callback方法)
E --> F(获取Surface)
F --> G(设置Surface大小)
G --> H(设置Surface格式)
H --> I(创建MediaPlayer)
I --> J(设置MediaPlayer音频源)
J --> K(设置MediaPlayer视频源)
K --> L(设置MediaPlayer监听)
L --> M(准备MediaPlayer)
M --> N(开始MediaPlayer)
N --> O(设置SurfaceView监听)
O --> P(创建SensorManager)
P --> Q(获取传感器)
Q --> R(注册传感器监听)
R --> S(传感器变化时回调方法)
S --> T(计算旋转角度)
T --> U(设置SurfaceView旋转矩阵)
U --> V(结束)
V --> W[结束]
操作步骤
步骤 |
操作 |
初始化SurfaceView |
创建一个SurfaceView,并在布局文件中添加SurfaceView元素 |
创建SurfaceHolder |
在SurfaceView中创建一个SurfaceHolder对象 |
添加SurfaceHolder.Callback |
通过SurfaceHolder对象添加一个SurfaceHolder.Callback回调接口 |
重写SurfaceHolder.Callback方法 |
通过实现SurfaceHolder.Callback接口的方法,获取SurfaceView的状态变化 |
获取Surface |
在SurfaceHolder.Callback的surfaceCreated方法中,通过SurfaceHolder对象获取Surface |
设置Surface大小 |
通过SurfaceHolder对象的setFixedSize方法设置Surface的大小 |
设置Surface格式 |
通过SurfaceHolder对象的setFormat方法设置Surface的格式 |
创建MediaPlayer |
创建一个MediaPlayer对象 |
设置MediaPlayer音频源 |
通过MediaPlayer对象的setAudioSource方法设置音频源 |
设置MediaPlayer视频源 |
通过MediaPlayer对象的setVideoSource方法设置视频源 |
设置MediaPlayer监听 |
通过MediaPlayer对象的setOnPreparedListener方法设置监听事件 |
准备MediaPlayer |
调用MediaPlayer对象的prepareAsync方法准备播放器 |
开始MediaPlayer |
在MediaPlayer对象准备完成后调用start方法开始播放 |
设置SurfaceView监听 |
通过SurfaceView对象的setOnTouchListener方法设置监听事件 |
创建SensorManager |
创建一个SensorManager对象 |
获取传感器 |
通过SensorManager对象的getDefaultSensor方法获取加速度传感器 |
注册传感器监听 |
通过SensorManager对象的registerListener方法注册传感器监听 |
传感器变化时回调方法 |
在传感器变化时,通过回调方法获取手机的旋转角度 |
计算旋转角度 |
根据获取的旋转角度计算出需要旋转的角度 |
设置SurfaceView旋转矩阵 |
通过SurfaceView对象的setRotation方法设置旋转矩阵 |
结束 |
结束操作 |
代码实现
初始化SurfaceView
SurfaceView surfaceView = findViewById(R.id.surfaceView);
创建SurfaceHolder
SurfaceHolder surfaceHolder = surfaceView.getHolder();
添加SurfaceHolder.Callback
surfaceHolder.addCallback(new SurfaceHolder.Callback() {
// Override methods for SurfaceHolder.Callback
});
重写SurfaceHolder.Callback方法
@Override
public void surfaceCreated(SurfaceHolder holder) {
// 获取Surface
Surface surface = holder.getSurface();
// 设置Surface大小
holder.setFixedSize(width, height);
// 设置Surface格式
holder.setFormat(format);
// 创建MediaPlayer
MediaPlayer mediaPlayer = new MediaPlayer();
// 设置MediaPlayer音频源
mediaPlayer.setAudioSource(audioSource);
// 设置MediaPlayer视频源
mediaPlayer.setVideoSource(videoSource);
// 设置MediaPlayer监听
mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
// 准备MediaPlayer
mp.prepareAsync();
}
});
// 开始MediaPlayer
mediaPlayer.start();
// 设置SurfaceView监听
surfaceView.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
// 处理触摸事件
return true;
}
});
// 创建SensorManager
SensorManager sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
// 获取传感器
Sensor sensor = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
// 注册传感器监听
sensorManager.registerListener(sensorEventListener, sensor