1 Star 0 Fork 0

半月 / movePlayer

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
贡献代码
同步代码
取消
提示: 由于 Git 不支持空文件夾,创建文件夹后会生成空的 .keep 文件
Loading...
README

movePlayer

首次开启App进入SplashActivity, 点击页面快速进入MainActivity(默认等待2秒后进入).

问题描述:

  1. 用户点击了SplashActivity进入MainActivity后(在等待期内)立即退出, 会自动再次打开MainActivity
  2. 用户点击了SplashActivity进入MainActivity, 默认进入的代码任然会再次打开一次MainActivity
  3. 用户多次点击SplashActivity, 会多次打开MainActivity

解决方案

调用finish()关闭启动页面, 并在onDestroy()中取消未执行的消息

public class SplashActivity extends Activity {

    private Handler handler = new Handler();

    // 保证主界面只打开一次
    private boolean isStartMain = false;

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

        // 等待两秒后执行
        // runnable.run() 方法执行在主线程
        handler.postDelayed(new Runnable() {
            public void run() {
                startMainActivity();
            }
        }, 2000);
    }

    // 开启主界面
    private void startMainActivity() {
        if (!isStartMain) {
            isStartMain = true;
            Intent intent = new Intent(SplashActivity.this, MainActivity.class);
            startActivity(intent);

            // 关闭启动页面
            finish();
        }
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        // 点击启动页面, 快速进入到主页面
        startMainActivity();
        return super.onTouchEvent(event);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        // 取消打开MainActivity的意图
        handler.removeCallbacksAndMessages(null);
    }
}

Activity声明周期

打开 -> 关闭 (一个Activity)

Enter   : onCreate() -> onStart() -> onResume()
>> Home : onPause() -> onStop()
Home >> : onRestart() -> onStart() onResume()
Back    : onPause() -> onStop() -> onDestroy()

A -> B(返回) -> A 【B完全覆盖A】

Enter A : A.onCreate() -> A.onStart() -> A.onResume()
A  >> B : A.onPause() -> B.onCreate() -> B.onStart() -> B.onResume() -> A.onStop()
B  >> A : B.onPause() -> A.onRestart() -> A.onStart() -> A.onResume() -> B.onDestroy()

A -> B(返回) -> A 【B不完全覆盖A】

Enter A : A.onCreate() -> A.onStart() -> A.onResume()

// 没有 A.onStop()
A  >> B : A.onPause() -> B.onCreate() -> B.onStart() -> B.onResume()

// 没有 A.onStart() , A.onRestart()	
B  >> A : B.onPause() ->  A.onResume() -> B.onStopp() -> B.onDestroy() 

横竖屏切换

onPause() -> onStop() -> onDestroy() -> onCreate() -> onStart() -> onResume()

配置哪些改变不执行生命周期方法

<!--
    播放页面横屏固定

    横竖屏切换不执行生命周期方法
    android:configChanges="keyboardHidden|screenSize|orientation"

    keyboardHidden:
        键盘隐藏

    screenSize:
        屏幕大小改变

    orientation:
        横竖屏切换不执行生命周期方法

-->
<activity
    android:name=".SystemVideoPlayer"
    android:configChanges="keyboardHidden|screenSize|orientation" />

手势识别器

// 1. 声明
// 定义手势识别器
private GestureDetector detector;

// 2. 创建实例并监听关心的事件
// 实例化手势识别器
detector = new GestureDetector(this, new GestureDetector.SimpleOnGestureListener() {

    // 长按
    @Override
    public void onLongPress(MotionEvent e) {
        switchPlayOrPause();
    }


    // 单击
    @Override
    public boolean onSingleTapConfirmed(MotionEvent e) {
        // Toast.makeText(SystemVideoPlayer.this, "点击", Toast.LENGTH_SHORT).show();
        showMediaController(!isShowMediaController);
        return true;
    }
});

// 3. 关联触摸事件
@Override
public boolean onTouchEvent(MotionEvent event) {
    // 把事件传递给手势识别器
    detector.onTouchEvent(event);
    return super.onTouchEvent(event);
}

滑动屏幕改变音量

onTouchEvent() 中计算逻辑:

  1. 按下时计算初始化值
    需要记录数据, 并移除延迟发送的(HIDE_CONTROLLER)消息
    • startY: 手指按下时Y坐标
    • rangeY: 可滑动的区域总量
    • currVolume: 滑动结束时当前音量
    • maxVolume: 最大音量
  2. 滑动时修改音量
    • endY: 滑动结束时Y坐标
    • changedVolume: 修改的音量
    • finalVolume: 最终的设备音量
  3. 手指离开时延迟发送隐藏控制面板(HIDE_CONTROLLER)

计算公式:
(startY - endY) / rangeY = changedVolume / maxVolume;
finalVolume = min(max(currVolume + changedVolume, 0), maxVolume);

private void touchScreenChangeVolume(MotionEvent event) {
    switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN: // 按下

            touchStartY = event.getY();
            touchRangeY = Math.min(screenHeight, screenWidth);
            touchCurrVolume = audioManager.getStreamVolume(AudioManager.STREAM_MUSIC);

            // 移除隐藏控制面板消息
            handler.removeMessages(HIDE_CONTROLLER);
            break;

        case MotionEvent.ACTION_MOVE: // 滑动

            float moveEndY = event.getY();
            float changeDistance = (touchStartY - moveEndY);
            float changeVolume = changeDistance / touchRangeY * maxVolume;
            if (0 != changeVolume) {
                float finalVolume = Math.min(Math.max(0, changeVolume + touchCurrVolume), maxVolume);
                updateVolume((int) finalVolume);
            }

            break;

        case MotionEvent.ACTION_UP: // 离开
            // 延迟发送隐藏控制面板消息
            handler.sendEmptyMessageDelayed(HIDE_CONTROLLER, HIDE_CONTROLLER_DELAY_TIME);
            break;
    }
}

空文件

简介

视频播放器 展开 收起
Android
取消

发行版

暂无发行版

贡献者

全部

近期动态

加载更多
不能加载更多了
Android
1
https://gitee.com/osby/movePlayer.git
git@gitee.com:osby/movePlayer.git
osby
movePlayer
movePlayer
master

搜索帮助