ict.xunfei/Assets/Scripts/UIManager/MediaContextMenu/MediaPreviewPanel.cs

416 lines
12 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using TMPro;
using UnityEngine.UI;
using UnityEngine.Video;
using DG.Tweening;
/// <summary>
/// 媒体预览
/// </summary>
public class MediaPreviewPanel : PanelBasic
{
private RectTransform operation_area;
private RectTransform header_area;
//交互按钮及文本
private Image audio_preview_panel;
private TextMeshProUGUI name_text;
private TextMeshProUGUI progress_text;
private CustomSlider progress_slider;
private Button play_button;
private Button stop_button;
private Button fast_forward_button;
private Button fast_rewind_button;
private Button close_button;
private Button zoom_button;
//音频组件
private AudioSource audio_source;
//计时属性
private int currentHour;
private int currentMinute;
private int currentSecond;
private int clipHour;
private int clipMinute;
private int clipSecond;
//图片精灵
public Sprite play_sprite;
public Sprite pause_sprite;
public Sprite zoom_in_sprite;
public Sprite zoom_out_sprite;
//视频
private Image video_preview_panel;
//private TextMeshProUGUI video_name_text;
//private TextMeshProUGUI video_progress_text;
//private CustomSlider video_progress_slider;
//private Button video_play_button;
//private Button video_stop_button;
//private Button video_fast_forward_button;
//private Button video_fast_rewind_button;
//private Button video_close_button;
private VideoPlayer video_player;
private RectTransform video_player_rect;
private CanvasGroup header_area_group;
private bool is_video;
// Start is called before the first frame update
void Start()
{
video_player_rect = video_player.GetComponent<RectTransform>();
header_area_group = header_area.GetComponent<CanvasGroup>();
play_button.onClick.AddListener(OnPlay);
stop_button.onClick.AddListener(OnStop);
fast_forward_button.onClick.AddListener(OnFastForward);
fast_rewind_button.onClick.AddListener(OnFastRewind);
progress_slider.onValueStartChanged.AddListener(OnStartDragSlider);
progress_slider.onValueChanged.AddListener(OnDragSlider);
progress_slider.onValueEndChanged.AddListener(OnEndDragSlider);
close_button.onClick.AddListener(OnPreviewPanelClose);
zoom_button.onClick.AddListener(OnZoom);
//视频播放结束事件
video_player.loopPointReached += Video_player_loopPointReached;
}
// Update is called once per frame
void Update()
{
UpdateProgress();
}
/// <summary>
/// 播放、暂停
/// </summary>
void OnPlay()
{
if (is_video)
{
if (video_player != null)
{
if (video_player.isPlaying)
{
video_player.Pause();
play_button.image.sprite = play_sprite;
}
else
{
video_player.Play();
play_button.image.sprite = pause_sprite;
}
}
}
else
{
if (audio_source != null)
{
if (audio_source.isPlaying)
{
audio_source.Pause();
play_button.image.sprite = play_sprite;
}
else
{
if (audio_source.time == 0)//播放结束后time为0再次播放时值不是0强制更新一下
audio_source.time = 0;
audio_source.Play();
play_button.image.sprite = pause_sprite;
}
}
}
}
/// <summary>
/// 停止播放,进度条重置
/// </summary>
void OnStop()
{
if (is_video)
{
video_player?.Stop();
if (video_player != null)
video_player.frame = 0;
play_button.image.sprite = play_sprite;
}
else
{
audio_source?.Pause();
if (audio_source != null)
audio_source.time = 0;
play_button.image.sprite = play_sprite;
}
UpdateProgress(true);
}
/// <summary>
/// 快进 默认5s
/// </summary>
void OnFastForward()
{
if (is_video)
{
if (video_player != null)
{
if (video_player.time != 0)
video_player.time += 5;
else
{
video_player.Pause();
video_player.time = 5;
}
}
}
else
{
if (audio_source != null)
{
if (audio_source.time != 0)
audio_source.time += 5;
else
{
audio_source.Pause();
audio_source.time = 5;
}
}
}
UpdateProgress(true);
}
/// <summary>
/// 快退 默认5s
/// </summary>
void OnFastRewind()
{
if (is_video)
{
if (video_player != null)
{
if (video_player.time < 5)
video_player.time = 0;
else
video_player.time -= 5;
}
}
else
{
if (audio_source != null)
{
if (audio_source.time < 5)
audio_source.time = 0;
else
audio_source.time -= 5;
}
}
UpdateProgress(true);
}
/// <summary>
/// 开始拖拽进度条
/// </summary>
void OnStartDragSlider()
{
if (is_video)
{
video_player?.Pause();
}
else
{
audio_source?.Pause();
}
}
/// <summary>
/// 拖拽进度条
/// </summary>
/// <param name="_value"></param>
void OnDragSlider(float _value)
{
if (is_video)
{
if (video_player != null)
video_player.time = _value * video_player.length;
}
else
{
if (audio_source != null)
audio_source.time = _value * audio_source.clip.length;
}
}
/// <summary>
/// 结束拖拽进度条
/// </summary>
void OnEndDragSlider()
{
if (is_video)
{
video_player?.Play();
}
else
{
audio_source?.Play();
}
}
/// <summary>
/// 关闭预览面板
/// </summary>
void OnPreviewPanelClose()
{
if (is_video)
{
video_player?.Stop();
video_player.targetTexture.Release();
//video_player = null;
}
else
{
audio_source?.Stop();
audio_source = null;
}
OnPopupEnd();
}
bool is_zoom_out;
public float magnification = 2;
public void OnZoom()
{
is_zoom_out = !is_zoom_out;
zoom_button.image.sprite = is_zoom_out ? zoom_in_sprite : zoom_out_sprite;
DOTween.To(() => video_player_rect.sizeDelta, (_size) => video_player_rect.sizeDelta = _size,
is_zoom_out ? new Vector2(528, 297) * magnification : new Vector2(528, 297), 0.25f);
//video_player_rect.sizeDelta = is_zoom_out ? new Vector2(528, 297) * magnification : new Vector2(528, 297);
DOTween.To(() => operation_area.anchoredPosition, (_position) => operation_area.anchoredPosition = _position,
is_zoom_out ? new Vector2(0, 195) : new Vector2(0, 260), 0.25f);
header_area_group.interactable = !is_zoom_out;
header_area_group.alpha = is_zoom_out ? 0 : 1;
}
/// <summary>
/// 预览音频
/// </summary>
/// <param name="_file_name"></param>
public void PreviewAudio(string _file_name)
{
//设置状态
is_video = false;
audio_preview_panel.gameObject.SetActive(true);
video_preview_panel.gameObject.SetActive(false);
play_button.image.sprite = pause_sprite;
audio_source = MediaPlayer.Instance.audio_source;
name_text.text = _file_name;
//计算总时间
clipHour = (int)audio_source.clip.length / 3600;
clipMinute = (int)(audio_source.clip.length - clipHour * 3600) / 60;
clipSecond = (int)(audio_source.clip.length - clipHour * 3600 - clipMinute * 60);
audio_source.Play();
//自适应UI位置
header_area.anchoredPosition = new Vector2(0, -411);
operation_area.anchoredPosition = new Vector2(0, 420);
}
/// <summary>
/// 预览视频
/// </summary>
/// <param name="_file_name"></param>
/// <param name="_url"></param>
public void PreviewVideo(string _file_name, string _url)
{
//设置状态
is_video = true;
audio_preview_panel.gameObject.SetActive(false);
video_preview_panel.gameObject.SetActive(true);
play_button.image.sprite = pause_sprite;
name_text.text = _file_name;
video_player.url = _url;
video_player.prepareCompleted += Video_player_prepareCompleted;
video_player.Prepare();
//自适应UI位置
header_area.anchoredPosition = new Vector2(0, -245);
operation_area.anchoredPosition = new Vector2(0, 260);
}
private void Video_player_loopPointReached(VideoPlayer source)
{
//播放完成后重置图标状态
play_button.image.sprite = play_sprite;
}
private void Video_player_prepareCompleted(VideoPlayer source)
{
clipHour = (int)video_player.length / 3600;
clipMinute = (int)(video_player.length - clipHour * 3600) / 60;
clipSecond = (int)(video_player.length - clipHour * 3600 - clipMinute * 60);
video_player.Play();
}
bool playing;
private void UpdateProgress(bool _update_anyway = false)
{
if (!is_video)
{
if (_update_anyway || (audio_source != null && audio_source.isPlaying))
{
playing = true;
//计算当前时间
currentHour = (int)audio_source.time / 3600;
currentMinute = (int)(audio_source.time - currentHour * 3600) / 60;
currentSecond = (int)(audio_source.time - currentHour * 3600 - currentMinute * 60);
progress_text.text = string.Format("{0:D2}:{1:D2}:{2:D2}/{3:D2}:{4:D2}:{5:D2}",
currentHour, currentMinute, currentSecond, clipHour, clipMinute, clipSecond);
//audio_progress_slider.value = audio_source.time / audio_source.clip.length;
progress_slider.SetValueWithoutNotify(audio_source.time / audio_source.clip.length);
}
//播放结束后会自动停止,更新播放图标状态
if (playing && audio_source != null)
{
play_button.image.sprite = audio_source.isPlaying ? pause_sprite : play_sprite;
}
}
else
{
if (_update_anyway || (video_player != null && video_player.isPlaying))
{
//计算当前时间
currentHour = (int)video_player.time / 3600;
currentMinute = (int)(video_player.time - currentHour * 3600) / 60;
currentSecond = (int)(video_player.time - currentHour * 3600 - currentMinute * 60);
progress_text.text = string.Format("{0:D2}:{1:D2}:{2:D2}/{3:D2}:{4:D2}:{5:D2}",
currentHour, currentMinute, currentSecond, clipHour, clipMinute, clipSecond);
//audio_progress_slider.value = audio_source.time / audio_source.clip.length;
if (video_player.frame == -1)
{
progress_slider.SetValueWithoutNotify(0);
}
else
{
var _progress = (float)(video_player.time / video_player.length);
progress_slider.SetValueWithoutNotify(_progress < 0 ? 0 : _progress);
}
}
}
}
}