using System.Collections; using UnityEngine; using UI.Poem; using System.Collections.Generic; using ET; using FairyGUI; using System.Threading.Tasks; namespace GFGGame { public class PoemPhotoSaveView : BaseWindow { private UI_PoemPhotoSaveUI _ui; private int curIndex; private bool saveFinished; private bool captureFinished; private byte[] byteArr; public override void Dispose() { if(_ui != null) { _ui.Dispose(); _ui = null; } base.Dispose(); } protected override void OnInit() { base.OnInit(); packageName = UI_PoemPhotoSaveUI.PACKAGE_NAME; _ui = UI_PoemPhotoSaveUI.Create(); viewCom = _ui.target; isfullScreen = true; this.modal = false; clickBlankToClose = false; } protected override void OnShown() { base.OnShown(); SavePhotoList savePhoto = (SavePhotoList)viewData; _ui.m_c1.selectedIndex = savePhoto.pageIndex; UpdateProgress(0, savePhoto.listChoose.Count); RefreshUI(savePhoto); } protected override void OnHide() { base.OnHide(); ResetData(); } private void ResetData() { curIndex = 0; byteArr = null; saveFinished = false; captureFinished = false; } private async void RefreshUI(SavePhotoList savePhoto) { for(int i = 0; i < savePhoto.listChoose.Count; i++) { int index = GetPhotoListIndex(savePhoto.photoInfos, savePhoto.listChoose[i]); byte[] bytes = null; if (_ui.m_c1.selectedIndex == 0) { RefreshPhoto(savePhoto.photoInfos[index]); bytes = savePhoto.photoInfos[index].Bytes; } else { RefreshTravelPhoto(savePhoto.photoInfos[i]); captureFinished = false; Timers.inst.StartCoroutine(CaptureByUI()); while (!captureFinished) { await Task.Delay(17); } bytes = byteArr; } saveFinished = false; SavePhoto(bytes); while (!saveFinished) { await Task.Delay(17); } ++curIndex; UpdateProgress(curIndex, savePhoto.listChoose.Count); if (curIndex == savePhoto.listChoose.Count) { PromptController.Instance.ShowFloatTextPrompt("已全部保存至相册!"); Hide(); } } } private int GetPhotoListIndex(List photoInfos, long pictureID) { for (int i = 0; i < photoInfos.Count; i++) { if (photoInfos[i].PictureId == pictureID) { return i; } } return -1; } private void UpdateProgress(int cur, int max) { _ui.m_progress.value = cur; _ui.m_progress.max = max; } private void RefreshPhoto(PoemPhotoData data) { UI_ListPhotoPreviewItem item = UI_ListPhotoPreviewItem.Proxy(_ui.m_personalPhoto.target); item.m_comPhoto.m_loaPhoto.texture = data.Ntexture; UI_ListPhotoPreviewItem.ProxyEnd(); } private void RefreshTravelPhoto(PoemPhotoData data) { UI_ComPostcard item = UI_ComPostcard.Proxy(_ui.m_travelPhoto.target); PoemPhotoData photoData = data; TravelLoactionCfg loactionCfg = TravelLoactionCfgArray.Instance.GetCfg(photoData.TravelLocationId); item.m_comTravel.m_loaBg.url = ResPathUtil.GetTravelBgPath(loactionCfg.res); item.m_txtLocationName.text = loactionCfg.name; item.m_txtTime.text = TimeUtil.FormattingTimeTo_yyyMMdd1(photoData.CreationTime); item.m_comTravel.m_loaRole.url = ""; if (photoData.TravelSuitId > 0) { TravelSuitCfg travelSuitCfg = TravelSuitCfgArray.Instance.GetCfg(photoData.TravelSuitId); item.m_comTravel.m_loaRole.url = ResPathUtil.GetTravelRolePath(travelSuitCfg.reourcesArr[photoData.SuitResIndex]); item.m_comTravel.m_loaRole.SetXY(loactionCfg.positionsArr[photoData.PositionIndex][0], loactionCfg.positionsArr[photoData.PositionIndex][1]); } UI_ComPostcard.ProxyEnd(); } private IEnumerator CaptureByUI() { //等待帧画面渲染结束 yield return new WaitForEndOfFrame(); int width = (int)(_ui.m_saveImg.width * UIContentScaler.scaleFactor); int height = (int)(_ui.m_saveImg.height * UIContentScaler.scaleFactor); Vector2 pos = _ui.m_saveImg.LocalToGlobal(Vector2.zero); pos.y = Screen.height - pos.y - height; Texture2D tex = new Texture2D(width, height, TextureFormat.RGB24, false); //从屏幕读取像素, leftBtmX/leftBtnY 是读取的初始位置,width、height是读取像素的宽度和高度 tex.ReadPixels(new Rect(pos.x, pos.y, width, height), 0, 0); //执行读取操作 tex.Apply(); byte[] bytes = tex.EncodeToPNG(); captureFinished = true; byteArr = bytes; } private void SavePhoto(byte[] bytes) { #if UNITY_EDITOR // pc端保存 string path = Application.dataPath + "/StreamingAssets/" + TimeHelper.ServerNowSecs + curIndex + ".png"; System.IO.File.WriteAllBytes(path, bytes); Debug.Log("the photo saved in:" + path); saveFinished = true; #else // 手机端 string fileName = "wsj" + TimeHelper.ServerNowSecs + curIndex + ".jpg"; NativeGallery.Permission permission = NativeGallery.SaveImageToGallery(bytes, "Wanshijing", fileName, (success, path) => { if (success) { saveFinished = true; } else { } }); #endif } } }