AVPro插件视频滑动条

using RenderHeads.Media.AVProVideo;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;

public class NewBehaviourScript : MonoBehaviour
{
    public MediaPlayer _MediaPlayer;
    public Button PlayBtn, PauseBtn;
    public Slider VideoSlider;
    bool _isHoveringOverTimeline, _wasPlayingBeforeTimelineDrag;
    void Start()
    {
        CreateTimelineDragEvents();
        PlayBtn.onClick.AddListener(Play);
        PauseBtn.onClick.AddListener(Pause);
    }

    #region 视频滑动条
    /// <summary>
    /// 更新时间滑块位置
    /// </summary>
    void UpdateTimelineDrag()
    {
        if (_MediaPlayer.Info != null)
        {
            TimeRange timelineRange = GetTimelineRange();

            if (VideoSlider && !_isHoveringOverTimeline)
            {
                double t = 0.0;
                if (timelineRange.duration > 0.0)
                {
                    t = ((_MediaPlayer.Control.GetCurrentTime() - timelineRange.startTime) / timelineRange.duration);
                }
                VideoSlider.value = Mathf.Clamp01((float)t);
                if (VideoSlider.value == 1)
                {
                    Pause();
                    PlayBtn.gameObject.SetActive(true);
                    PauseBtn.gameObject.SetActive(false);
                }
            }
        }
    }

    void CreateTimelineDragEvents()
    {
        EventTrigger trigger = VideoSlider.gameObject.GetComponent<EventTrigger>();
        if (trigger != null)
        {
            EventTrigger.Entry entry = new EventTrigger.Entry();
            entry.eventID = EventTriggerType.PointerDown;
            entry.callback.AddListener((data) => { OnTimeSliderBeginDrag(); });
            trigger.triggers.Add(entry);

            entry = new EventTrigger.Entry();
            entry.eventID = EventTriggerType.Drag;
            entry.callback.AddListener((data) => { OnTimeSliderDrag(); });
            trigger.triggers.Add(entry);

            entry = new EventTrigger.Entry();
            entry.eventID = EventTriggerType.PointerUp;
            entry.callback.AddListener((data) => { OnTimeSliderEndDrag(); });
            trigger.triggers.Add(entry);

            entry = new EventTrigger.Entry();
            entry.eventID = EventTriggerType.PointerEnter;
            entry.callback.AddListener((data) => { OnTimelineBeginHover((PointerEventData)data); });
            trigger.triggers.Add(entry);

            entry = new EventTrigger.Entry();
            entry.eventID = EventTriggerType.PointerExit;
            entry.callback.AddListener((data) => { OnTimelineEndHover((PointerEventData)data); });
            trigger.triggers.Add(entry);
        }
    }

    private void OnTimeSliderBeginDrag()
    {
        if (_MediaPlayer && _MediaPlayer.Control != null)
        {
            _wasPlayingBeforeTimelineDrag = _MediaPlayer.Control.IsPlaying();
            if (_wasPlayingBeforeTimelineDrag)
            {
                _MediaPlayer.Pause();
            }
            OnTimeSliderDrag();
        }
    }

    private void OnTimeSliderDrag()
    {
        if (_MediaPlayer && _MediaPlayer.Control != null)
        {
            TimeRange timelineRange = GetTimelineRange();
            double time = timelineRange.startTime + (VideoSlider.value * timelineRange.duration);
            _MediaPlayer.Control.Seek(time);
            _isHoveringOverTimeline = true;
        }
    }

    private void OnTimeSliderEndDrag()
    {
        if (_MediaPlayer && _MediaPlayer.Control != null)
        {
            if (_wasPlayingBeforeTimelineDrag)
            {
                _MediaPlayer.Play();
                _wasPlayingBeforeTimelineDrag = false;
            }
        }
    }
    private TimeRange GetTimelineRange()
    {
        if (_MediaPlayer.Info != null)
        {
            return Helper.GetTimelineRange(_MediaPlayer.Info.GetDuration(), _MediaPlayer.Control.GetSeekableTimes());
        }
        return new TimeRange();
    }
    private void OnTimelineBeginHover(PointerEventData eventData)
    {
        if (eventData.pointerCurrentRaycast.gameObject != null)
        {
            _isHoveringOverTimeline = true;
        }
    }

    private void OnTimelineEndHover(PointerEventData eventData)
    {
        _isHoveringOverTimeline = false;
    }


    private void Play()
    {

        if (VideoSlider.value == 1)
        {
            _MediaPlayer.Rewind(true);
        }
        _MediaPlayer.Play();
    }
    private void Pause()
    {
        _MediaPlayer.AutoStart = false;
        _MediaPlayer.Pause();
    }
    #endregion
    void Update()
    {
        UpdateTimelineDrag();
    }
}

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

快乐教主

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值