/*---------------------------------------------------------------------------- * Copyright (c) TJD Technologies Co., Ltd. 2024. All rights reserved. * * Description: * * Author: huangshuyi * * Create: 2024-7 *--------------------------------------------------------------------------*/ #include "View.h" #include #include "ChangeSliceListener.h" #include "TjdUiImageIds.h" #include "TjdUiMemManage.h" #include "TjdUiMultiLanguageExt.h" #include "TjdUiWatchFaceCtrl.h" #include "TjdUiWatchFaceView.h" #include "common/image_cache_manager.h" #include "components/root_view.h" #include "sql_setting.h" #include "sys_config.h" #include using namespace OHOS; namespace TJD { #define ENABLE_PRINT_INFO 1 #if ENABLE_PRINT_INFO #define static_print_info(...) sys_ui_log_i(__VA_ARGS__) //一般信息打印宏控制 #define static_print_warn(...) sys_ui_log_w(__VA_ARGS__) //警告信息打印一般常开 #define static_print_error(...) sys_ui_log_e(__VA_ARGS__) //错误信息打印一般常开 #define static_print_debug(...) sys_ui_log_d(__VA_ARGS__) #else #define static_print_info(...) #define static_print_warn(...) #define static_print_error(...) #define static_print_debug(...) #endif static constexpr uint16_t ITEM_SIZE = 246; static constexpr int16_t OFFSET_Y = 30; static constexpr uint32_t ROLLER_ITEM = 8; #define MAIN_WF_SELECT_BG_BIN_PATH TJD_IMAGE_PATH "img_wf_select.bin" #define MAIN_WF_0_BIN_PATH TJD_IMAGE_PATH "img_wf_preview.bin" static TjdUiWatchFaceView *g_watchFaceView = nullptr; TjdUiWatchFaceView::TjdUiWatchFaceView() { g_watchFaceView = this; } TjdUiWatchFaceView::~TjdUiWatchFaceView() { g_watchFaceView = nullptr; } TjdUiWatchFaceView *TjdUiWatchFaceView::GetInstance(void) { return g_watchFaceView; } void TjdUiWatchFaceView::OnStart() { LoadDialInfo(); SetUpCoverflowView(); } void TjdUiWatchFaceView::OnStop() { uint32_t itemCnt = wfImageList.size(); for (uint8_t i = 0; i < itemCnt; i++) { if (wfImageList[i].fileOffset < 0) { OHOS::ImageCacheManager::GetInstance().UnloadSingleRes(wfImageList[i].path); } else { OHOS::ImageCacheManager::GetInstance().UnloadAllInMultiRes(wfImageList[i].path); } } } uint32_t TjdUiWatchFaceView::GetCurCoverflowItemWfId(void) { if (lastIndex_ >= wfImageList.size()) { static_print_error("GetCurCoverflowItemWfId: lastIndex_ out of range"); return 0; } return wfImageList[lastIndex_].wfId; } void TjdUiWatchFaceView::LoadDialInfo(void) { wfImageList.clear(); uint32_t itemCnt = 0; WfSelectInfo wfInfo = {}; WfImageInfo wfImageInfo = {}; uint32_t *wfInfoList = TjdUiWfGetIDList(&itemCnt); for (uint8_t i = 0; i < itemCnt; i++) { if (TjdUiWfGetSelectInfobyID(wfInfoList[i], &wfInfo)) { wfImageInfo.wfId = wfInfo.wfId; wfImageInfo.path = wfInfo.PreviewImgFullPath; wfImageInfo.name = wfInfo.name; wfImageInfo.fileOffset = wfInfo.PreviewImgFileOffset; wfImageInfo.fileImgId = wfInfo.PreviewImgId; wfImageInfo.wfType = 0; wfImageList.push_back(wfImageInfo); } } } void TjdUiWatchFaceView::SetUpCoverflowView(void) { coverflow2_.SetPosition(0, 0, GetRootContainer()->GetWidth(), GetRootContainer()->GetHeight()); coverflow2_.SetIntercept(true); coverflow2_.SetOnCoverflowListener(presenter_); coverflow2_.SetOnClickListener(presenter_); coverflow2_.SetThrowDrag(true); coverflow2_.SetImgSize(246, 246); coverflow2_.RequestFocus(); uint32_t cur_id = sql_setting_get_watch_face_id(); for (std::size_t i = 0; i < wfImageList.size(); i++) { coverflow2_.Add(wfImageList[i].name.c_str(), GetImageInfo(i)); if (wfImageList[i].wfId == cur_id) { lastIndex_ = static_cast(i); coverflow2_.SetCurrentPage(i); } } label_.SetPosition(127, 50, 200, 50); label_.SetTextColor(Color::White()); label_.SetAlign(OHOS::TEXT_ALIGNMENT_CENTER, OHOS::TEXT_ALIGNMENT_CENTER); label_.SetText(wfImageList[lastIndex_].name.c_str()); label_.SetFont(TJD_VECTOR_FONT_FILENAME, 30); AddViewToRootContainer(&coverflow2_); AddViewToRootContainer(&label_); } void TjdUiWatchFaceView::CoverflowViewScroll(void) { int16_t contMidX = static_cast(GetRootContainer()->GetWidth() / 2); int16_t minOffset = contMidX; uint8_t newCenterIndex = lastIndex_; for (uint8_t i = 0; i < coverflow2_.GetChildrenNumber(); i++) { OHOS::Rect rect = coverflow2_.GetViewByIndex(i)->GetOrigRect(); int16_t x = rect.GetLeft(); int16_t x1 = rect.GetRight(); int16_t xMid = static_cast(x + (x1 - x + 1) / 2); int16_t distance = MATH_ABS(xMid - contMidX); if (distance < minOffset) { newCenterIndex = i; minOffset = distance; } } if (newCenterIndex != lastIndex_) { lastIndex_ = newCenterIndex; label_.SetText(wfImageList[lastIndex_].name.c_str()); } OHOS::Rect curViewRect = coverflow2_.GetViewByIndex(lastIndex_)->GetOrigRect(); int16_t centerMid = curViewRect.GetLeft() + curViewRect.GetWidth() / 2; int16_t offset = MATH_ABS(contMidX - centerMid); if (offset > curViewRect.GetWidth() / 2) { label_.SetStyle(OHOS::STYLE_TEXT_OPA, 0); } else { uint8_t alpha = (uint8_t)((1.0f - ((float)offset / (curViewRect.GetWidth() / 2))) * OPA_OPAQUE); label_.SetStyle(OHOS::STYLE_TEXT_OPA, alpha); } presenter_->ResetTimer(); } OHOS::ImageInfo *TjdUiWatchFaceView::GetImageInfo(uint8_t index) { if (index >= wfImageList.size()) { return nullptr; } OHOS::ImageInfo *imgInfo = nullptr; auto &info = wfImageList[index]; if (info.fileOffset == 0) { imgInfo = OHOS::ImageCacheManager::GetInstance().LoadOneInMultiRes(info.fileImgId, info.path); } else if (info.fileOffset < 0) { imgInfo = OHOS::ImageCacheManager::GetInstance().LoadSingleRes(info.path); } else { FILE *fp = fopen(info.path.c_str(), "rb"); if (fp) { imgInfo = OHOS::ImageCacheManager::GetInstance().LoadOneInMultiRes(info.fileImgId, info.path, fp, false, info.fileOffset); fclose(fp); } } if (imgInfo) { info.imgData = const_cast(imgInfo->phyAddr); } return imgInfo; } } // namespace TJD