416 lines
12 KiB
C#
416 lines
12 KiB
C#
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);
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|