/*---------------------------------------------------------------------------- * Copyright (c) TJD Technologies Co., Ltd. 2024. All rights reserved. * * Description: TjdUiAppPlayDialAdapter.cpp * * Author: liuguanwu * * Create: 2024-10 *--------------------------------------------------------------------------*/ #include "TjdUiImageIds.h" #include "TjdUiAppPlayDialAdapter.h" #include "TjdUiAppPlayDialPresenter.h" #include "TjdUiAppPlayDialView.h" #include "TjdUiAppPlayDialModel.h" #include "common/image_cache_manager.h" #include "sys_config.h" #include "TjdUiMultiLanguage.h" #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 #define TJD_VECTOR_FONT_FILENAME "PingFangMedium.TTF" #define PLAY_DIAL_BIN_PATH TJD_IMAGE_PATH "img_play_dial.bin" #define LIST_ITEM_WIDTH (Screen::GetInstance().GetWidth() - 16) #define LIST_ITEM_HEIGHT (126) using namespace OHOS; namespace TJD { // 待定使用 const AiStyleItem g_AiStyleItem[] = { {0, AI_STYLE_INVALID, STR_ID_387},//风格选择 {IMG_PLAY_DIAL_STYLE_JAPANESE_ANIME, AI_STYLE_JAPANESE_ANIME, STR_ID_388},//日系动漫 {IMG_PLAY_DIAL_STYLE_OIL_PAINTING, AI_STYLE_OIL_PAINTING, STR_ID_389},//油画 {IMG_PLAY_DIAL_STYLE_ANTIQUITIES, AI_STYLE_ANTIQUITIES, STR_ID_390},//古风 {IMG_PLAY_DIAL_STYLE_ABSTRACT_ART, AI_STYLE_ABSTRACT_ART, STR_ID_391},//抽象派 {IMG_PLAY_DIAL_STYLE_DARK_ART, AI_STYLE_DARK_ART, STR_ID_392},//黑暗艺术 {IMG_PLAY_DIAL_STYLE_INK_AND_WASH, AI_STYLE_INK_AND_WASH, STR_ID_393},//水墨画 {IMG_PLAY_DIAL_STYLE_3D_RENDERING, AI_STYLE_3D_RENDERING, STR_ID_394},//3D渲染 {IMG_PLAY_DIAL_STYLE_VANGOGH_WIND, AI_STYLE_VANGOGH_WIND, STR_ID_395},//梵高风 {IMG_PLAY_DIAL_STYLE_ILLUSTRATION, AI_STYLE_ILLUSTRATION, STR_ID_396},//插画 {IMG_PLAY_DIAL_STYLE_HAYAO_MIYAZAKI, AI_STYLE_HAYAO_MIYAZAKI, STR_ID_397},//宫崎骏 {IMG_PLAY_DIAL_STYLE_MONET, AI_STYLE_MONET, STR_ID_398},//莫奈 {IMG_PLAY_DIAL_STYLE_MACHINERY, AI_STYLE_MACHINERY, STR_ID_399},//机械 {IMG_PLAY_DIAL_STYLE_CERAMIC_WORLD, AI_STYLE_CERAMIC_WORLD, STR_ID_400},//陶艺世界 {IMG_PLAY_DIAL_STYLE_PAPER_CUT, AI_STYLE_PAPER_CUT, STR_ID_401},//剪纸风格 {IMG_PLAY_DIAL_STYLE_BLACK_WHITE_SKETCH, AI_STYLE_BLACK_WHITE_SKETCH, STR_ID_402},//黑白素描 {IMG_PLAY_DIAL_STYLE_THICK_COATING_WIND, AI_STYLE_THICK_COATING_WIND, STR_ID_403},//厚涂风 {IMG_PLAY_DIAL_STYLE_5D_PORTRAIT, AI_STYLE_5D_PORTRAIT, STR_ID_404},//5D人像 {IMG_PLAY_DIAL_STYLE_SCIENCE_FICTION, AI_STYLE_SCIENCE_FICTION, STR_ID_405},//科幻 }; bool listContainerStyle::InitContainer() { if (imageBg_ == nullptr) { imageBg_ = new UIImageView(); if (imageBg_ == nullptr) { return false; } } imageBg_->SetResizeMode(UIImageView::ImageResizeMode::CENTER); if (image_ == nullptr) { image_ = new UIImageView(); if (image_ == nullptr) { return false; } } image_->SetResizeMode(UIImageView::ImageResizeMode::CENTER); if (label_ == nullptr) { label_ = new UILabelExt(); if (label_ == nullptr) { delete image_; image_ = nullptr; return false; } } label_->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT); label_->SetFont(TJD_VECTOR_FONT_FILENAME, 40); // 40: item font size Add(imageBg_); Add(image_); Add(label_); return true; } uint16_t TjdPlayDialAdapter::GetCount(void) { return sizeof(g_AiStyleItem) / sizeof(g_AiStyleItem[0]); } OHOS::UIView *TjdPlayDialAdapter::GetView(UIView* inView, int16_t index) { if (index >= GetCount() || index < 0) { static_print_error("inView=[%p], index=[%d]\n", inView, index); return nullptr; } UIImageView* image = nullptr; UILabelExt* label = nullptr; ImageInfo* imgInfo = nullptr; listContainerStyle* newView = nullptr; if (inView == nullptr) { newView = new listContainerStyle(); if (newView == nullptr) { static_print_error("newView == nullptr:\n"); return nullptr; } if (!newView->InitContainer()) { delete newView; static_print_error("newView->InitContainer():false\n"); return nullptr; } } else { newView = static_cast(inView); } static_print_debug("TjdPlayDialAdapter::GetView() list index:%d\n", index); if (newView != nullptr) { //newView->Resize(width_, height_); newView->Resize(LIST_ITEM_WIDTH, LIST_ITEM_HEIGHT); newView->SetStyle(STYLE_BACKGROUND_OPA, OPA_OPAQUE); //newView->SetStyle(STYLE_BACKGROUND_COLOR, Color::Red().full); //newView->SetViewIndex(index); newView->SetViewIndex(g_AiStyleItem[index].resId); newView->SetOnClickListener(&TjdUiAppPlayDialPresenter::GetInstance()); if(g_AiStyleItem[index].styleId == AI_STYLE_INVALID) { image = newView->GetImageBgView(); imgInfo = nullptr; image->SetSrc(imgInfo); image->LayoutCenterOfParent(); image = newView->GetImageView(); imgInfo = nullptr; image->SetSrc(imgInfo); image->LayoutCenterOfParent(); label = newView->GetLabelView(); label->SetFont(TJD_VECTOR_FONT_FILENAME, TJD_FONT_SIZE_34); label->SetTextId(g_AiStyleItem[index].styleINamed); //label->LayoutCenterOfParent(0, -100); label->SetY(0); label->SetWidth(LIST_ITEM_WIDTH); label->SetHeight(LIST_ITEM_HEIGHT); label->SetLineBreakMode(UILabel::LINE_BREAK_MARQUEE); //label->SetStyle(STYLE_BORDER_WIDTH, 1); label->LayoutCenterOfParent(); label->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER); label->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT); newView->SetTouchable(false); }else{ image = newView->GetImageBgView(); imgInfo = ImageCacheManager::GetInstance().LoadOneInMultiRes(IMG_PLAY_DIAL_SINGLE_LIST, PLAY_DIAL_BIN_PATH); image->SetSrc(imgInfo); image->LayoutCenterOfParent(); image = newView->GetImageView(); imgInfo = ImageCacheManager::GetInstance().LoadOneInMultiRes(g_AiStyleItem[index].resId, PLAY_DIAL_BIN_PATH); image->SetSrc(imgInfo); //image->SetAutoEnable(false);//如果置为false,则需要设置图片控件的宽度和高度,否则将没有显示 image->LayoutCenterOfParent(); image->LayoutLeftOfParent(16); //image->LayoutBottomOfParent(); image->SetResizeMode(UIImageView::ImageResizeMode::CENTER);//这里如果SetAutoEnable为false,则需要设置 image->SetViewId("img"); label = newView->GetLabelView(); label->SetFont(TJD_VECTOR_FONT_FILENAME, TJD_FONT_SIZE_34); label->SetTextId(g_AiStyleItem[index].styleINamed); //label->SetTextId(g_itemNode[index].txtId); label->LayoutRightToSibling(image->GetViewId(), 0); label->SetY(0); label->SetWidth(LIST_ITEM_WIDTH - (image->GetWidth() + image->GetX() + 24)); label->SetHeight(LIST_ITEM_HEIGHT); label->SetLineBreakMode(UILabel::LINE_BREAK_MARQUEE); //label->SetStyle(STYLE_BORDER_WIDTH, 1); //label->SetPosition(image->GetX() + 110, 0); //label->SetPosition(image->GetX() + 110, 0, LIST_ITEM_WIDTH - 110 - image->GetX(), LIST_ITEM_HEIGHT); //label->SetFont(fontName_, fontSize_); label->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER); label->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT); newView->SetViewId(PLAYDIAL_AI_STYLE_VIEW_ITEM_ID); newView->SetTouchable(true); } } static_print_debug("TjdPlayDialAdapter::GetView:%p\n", newView); return newView; } static int LinearEaseIn(int start, int end, int value, int duration) { float t = static_cast(value) / duration; return static_cast(start + (end - start) * t); } void TjdPlayDialAdapter::StyleList::ReMeasure() { #if 0 //printf("UITestListFPS::TestList::ReMeasure\n"); UIViewGroup* view = static_cast(GetChildrenHead()); if (view == nullptr) { return; } int16_t midY = GetY() + GetHeight() / 2; int16_t y; const int scaleFactor_ = 200; int16_t total = midY; do { y = view->GetY(); if (direction_ == VERTICAL) { int offset = (y + view->GetHeight() / 2 - midY); //越靠经中点,offset越小,返回的temp值越接近0 //int temp = EasingEquation::SineEaseIn(0, scaleFactor_, abs(offset), scaleFactor_); int temp = LinearEaseIn(0, total, abs(offset), total*4); float scale = 1.0 - (static_cast(temp) / total); //scale = 0.3; Rect reRect = view->GetRelativeRect(); UIView* child = view->GetChildrenHead(); while (child != nullptr) { if (child->GetViewType() == UI_IMAGE_VIEW) { break; } child = child->GetNextSibling(); } UIImageView* imageView = static_cast(child); //printf("view name:%s, scale:%f\n", imageView->GetViewId(), scale); imageView->Scale(Vector2(scale, scale), Vector2(imageView->GetWidth() / 2, imageView->GetHeight() / 2)); //imageView->Scale(Vector2(scale, scale), Vector2(0, 0)); child = view->GetChildrenHead(); while (child != nullptr) { if (child->GetViewType() == UI_LABEL_EXT) { break; } child = child->GetNextSibling(); } UIImageView* labelView = static_cast(child); int16_t tar = total * 2; if (abs(offset) > tar) { offset = tar; } temp = LinearEaseIn(0, total, abs(offset), tar); scale = 1.0 - (static_cast(temp) / total); //labelView->SetStyle(STYLE_TEXT_OPA, scale * 255); labelView->UIView::SetStyle(STYLE_TEXT_OPA, scale * 255); } view = static_cast(view->GetNextSibling()); } while (view != nullptr); #endif } #if 0 void TjdHistoryScrollView::ListAnimatorCallback::Callback(OHOS::UIView* view) { if (view == nullptr) { return; } TjdHistoryScrollView* scrollView = static_cast(view); bool needStopX = false; if (startValueX_ != endValueX_) { int16_t actX = OHOS::EasingEquation::CubicEaseOut(startValueX_, endValueX_, scrollView->scrollAnimator_.GetRunTime(), scrollView->scrollAnimator_.GetTime()); //scrollView->ScrollBy(actX - previousValueX_, 0); scrollView->MoveOffset(actX - previousValueX_, 0); previousValueX_ = actX; } else { needStopX = true; } //printf("TjdAnimatorViewback::StartAnimatorOnDragEnd(): x[%d-%d-%d],\n", startValueX_, endValueX_, previousValueX_); } #endif bool listContainerHistory::InitContainer() { if (ItemBg_ == nullptr) { ItemBg_ = new TjdHistoryScrollView(); if (ItemBg_ == nullptr) { return false; } } if (startView_ == nullptr) { startView_ = new UIImageView(); if (startView_ == nullptr) { return false; } } if (imageBg_ == nullptr) { imageBg_ = new UIImageView(); if (imageBg_ == nullptr) { return false; } } imageBg_->SetResizeMode(UIImageView::ImageResizeMode::CENTER); if (image_ == nullptr) { image_ = new UIImageView(); if (image_ == nullptr) { return false; } } image_->SetResizeMode(UIImageView::ImageResizeMode::CENTER); if (deleteView_ == nullptr) { deleteView_ = new UIImageView(); if (deleteView_ == nullptr) { return false; } } deleteView_->SetResizeMode(UIImageView::ImageResizeMode::CENTER); ItemBg_->Add(startView_); ItemBg_->Add(imageBg_); ItemBg_->Add(image_); ItemBg_->Add(deleteView_); Add(ItemBg_); return true; } uint16_t PlayDialHistoryAdapter::GetCount(void) { std::vector *strList = TjdUiAppPlayDialModel::GetInstance().GetHistoryFileList(); static_print_debug("PlayDialHistoryAdapter::GetCount():%d\n", strList->size()); return strList->size(); } OHOS::UIView *PlayDialHistoryAdapter::GetView(UIView* inView, int16_t index) { static_print_debug("PlayDialHistoryAdapter::GetView:start %p-%d\n", inView, index); if (index >= GetCount() || index < 0) { static_print_error("inView=[%p], index=[%d]\n", inView, index); return nullptr; } std::vector *strList = TjdUiAppPlayDialModel::GetInstance().GetHistoryFileList(); UIImageView* image = nullptr; ImageInfo* imgInfo = nullptr; listContainerHistory* newView = nullptr; if (inView == nullptr) { newView = new listContainerHistory(); if (newView == nullptr) { static_print_error("newView == nullptr:\n"); return nullptr; } if (!newView->InitContainer()) { delete newView; static_print_error("newView->InitContainer():false\n"); return nullptr; } newView->SetPosition(0, 0,466, 220); newView->SetStyle(STYLE_BACKGROUND_OPA, OPA_OPAQUE); //newView->GetItemBgView()->SetPositionPercent(1, 1); newView->GetItemBgView()->SetPosition(0, 0,466, 220); //newView->GetItemBgView()->SetStyle(STYLE_BACKGROUND_OPA, OPA_OPAQUE); //newView->GetItemBgView()->SetStyle(STYLE_BACKGROUND_COLOR, 0xff0000ff); newView->GetItemBgView()->SetDirection(UIAbstractScroll::HORIZONTAL); newView->GetItemBgView()->SetViewId(PLAYDIAL_LOG_LIST_VIEW_ITEM_ID); newView->GetItemBgView()->SetOnDragListener(&TjdUiAppPlayDialPresenter::GetInstance()); newView->GetItemBgView()->SetTouchable(true); image = newView->GetStartView(); image->SetAutoEnable(false); image->SetPosition(0, 0, 10, 200); //image->SetStyle(STYLE_BACKGROUND_OPA, OPA_OPAQUE); //image->SetStyle(STYLE_BACKGROUND_COLOR, 0xff00ff00); std::string temp_str = (strList->data()[index]); imgInfo = ImageCacheManager::GetInstance().LoadSingleRes(temp_str); image = newView->GetImageBgView(); image->SetAutoEnable(false); image->SetPosition(53, 10, 360, 200); image->SetSrc(imgInfo); image->SetResizeMode(UIImageView::COVER); image->SetViewId(PLAYDIAL_LOG_LIST_VIEW_IMAGE_ID); image->SetOnClickListener(&TjdUiAppPlayDialPresenter::GetInstance()); image->SetTouchable(true); image = newView->GetImageView(); image->SetAutoEnable(false); image->SetPosition(53-18, 10-18, 360, 200); image->SetStyle(STYLE_BORDER_WIDTH, 18); image->SetStyle(STYLE_BORDER_RADIUS, 48); //image->SetStyle(STYLE_BORDER_OPA, 200); image->SetStyle(STYLE_BORDER_COLOR, 0xff000000); imgInfo = ImageCacheManager::GetInstance().LoadOneInMultiRes(IMG_PLAY_DIAL_DELETE, PLAY_DIAL_BIN_PATH); image = newView->GetDeleteView(); image->SetAutoEnable(false); image->SetPosition(420, 10, 200, 200); image->SetSrc(imgInfo); image->SetViewId(PLAYDIAL_LOG_LIST_VIEW_DELETE_ID); image->SetOnClickListener(&TjdUiAppPlayDialPresenter::GetInstance()); image->SetTouchable(true); } else { newView = static_cast(inView); } if (newView != nullptr) { newView->GetItemBgView()->SetViewIndex(index); int16_t xDistanceTemp = newView->GetItemBgView()->GetChildrenHead()->GetX(); if(xDistanceTemp < 0) { newView->GetItemBgView()->ScrollBy(-xDistanceTemp, 0); } std::string temp_str = (strList->data()[index]); imgInfo = ImageCacheManager::GetInstance().LoadSingleRes(temp_str); image = newView->GetImageBgView(); image->SetSrc(imgInfo); } static_print_debug("PlayDialHistoryAdapter::GetView:%p-%d-[%s]\n", newView, index, strList->data()[index].c_str()); return newView; } } // namespace TJD