Browse Source

[feat]亲密度分析,截图回复-对话分析Tab,增加上传截图卡片

hezihao 7 months ago
parent
commit
b8fb73c2f2

+ 3 - 0
assets/color/common_color.xml

@@ -45,6 +45,7 @@
     <color name="black35">#59000000</color>
     <color name="black35">#59000000</color>
     <color name="black30">#4D000000</color>
     <color name="black30">#4D000000</color>
     <color name="black25">#40000000</color>
     <color name="black25">#40000000</color>
+    <color name="black28">#47000000</color>
     <color name="black20">#33000000</color>
     <color name="black20">#33000000</color>
     <color name="black15">#26000000</color>
     <color name="black15">#26000000</color>
     <color name="black10">#1A000000</color>
     <color name="black10">#1A000000</color>
@@ -73,4 +74,6 @@
     <!-- 紫色渐变色 -->
     <!-- 紫色渐变色 -->
     <color name="purple_gradient1">#FFE1BAFF</color>
     <color name="purple_gradient1">#FFE1BAFF</color>
     <color name="purple_gradient2">#FFBE68FF</color>
     <color name="purple_gradient2">#FFBE68FF</color>
+    <color name="purple_gradient3">#FF7D46FC</color>
+    <color name="purple_gradient4">#FFBC87FF</color>
 </resources>
 </resources>

BIN
assets/images/icon_upload_screenshot_sample_image.webp


+ 20 - 4
assets/string/base/string.xml

@@ -221,7 +221,9 @@
     <string name="keyboard_guide_wechat_not_install">未安装微信</string>
     <string name="keyboard_guide_wechat_not_install">未安装微信</string>
     <string name="keyboard_guide_input_hint">选择粘贴TA的话,选择人设风格回复</string>
     <string name="keyboard_guide_input_hint">选择粘贴TA的话,选择人设风格回复</string>
 
 
-    <string name="keyboard_guide_ta_reply1">👋 欢迎使用【追爱小键盘】\n复制任意一句对话,点击人设体验回复</string>
+    <string name="keyboard_guide_ta_reply1">👋
+        欢迎使用【追爱小键盘】\n复制任意一句对话,点击人设体验回复
+    </string>
     <string name="keyboard_guide_ta_reply2">你睡了吗?</string>
     <string name="keyboard_guide_ta_reply2">你睡了吗?</string>
     <string name="keyboard_guide_ta_reply3">我先去吃饭了,一会聊</string>
     <string name="keyboard_guide_ta_reply3">我先去吃饭了,一会聊</string>
 
 
@@ -232,7 +234,8 @@
     <string name="intimacy_analyse_tab_scan_image_reply">识图回复</string>
     <string name="intimacy_analyse_tab_scan_image_reply">识图回复</string>
 
 
     <string name="intimacy_analyse">亲密度分析</string>
     <string name="intimacy_analyse">亲密度分析</string>
-    <string name="intimacy_analyse_upload_card_tip">上传与对方的聊天记录,揭秘文字后的真实想法</string>
+    <string name="intimacy_analyse_upload_card_tip">上传与对方的聊天记录,揭秘文字后的真实想法
+    </string>
     <string name="intimacy_analyse_switch_ta_test">换TA测测</string>
     <string name="intimacy_analyse_switch_ta_test">换TA测测</string>
     <string name="intimacy_analyse_upload_limit_tip">还可上传%s张</string>
     <string name="intimacy_analyse_upload_limit_tip">还可上传%s张</string>
     <string name="intimacy_analyse_upload_fail">上传失败</string>
     <string name="intimacy_analyse_upload_fail">上传失败</string>
@@ -242,7 +245,9 @@
 
 
     <string name="intimacy_analyse_step_title_select_image">选择你的图片</string>
     <string name="intimacy_analyse_step_title_select_image">选择你的图片</string>
     <string name="intimacy_analyse_step_title_select_prediction_direction">选择预测方向</string>
     <string name="intimacy_analyse_step_title_select_prediction_direction">选择预测方向</string>
-    <string name="intimacy_analyse_prediction_direction_card_tip">选择不同阶段的标签,可以更精准地分析</string>
+    <string name="intimacy_analyse_prediction_direction_card_tip">
+        选择不同阶段的标签,可以更精准地分析
+    </string>
     <string name="intimacy_analyse_add_prediction_direction">添加预测方向</string>
     <string name="intimacy_analyse_add_prediction_direction">添加预测方向</string>
     <string name="intimacy_analyse_prediction_direction">预测方向</string>
     <string name="intimacy_analyse_prediction_direction">预测方向</string>
     <string name="intimacy_analyse_model">模型</string>
     <string name="intimacy_analyse_model">模型</string>
@@ -250,7 +255,8 @@
     <string name="intimacy_analyse_analysis_result">分析结果</string>
     <string name="intimacy_analyse_analysis_result">分析结果</string>
     <string name="intimacy_analyse_analysis_now">立即分析</string>
     <string name="intimacy_analyse_analysis_now">立即分析</string>
     <string name="intimacy_analyse_report_creating">报告生成中...</string>
     <string name="intimacy_analyse_report_creating">报告生成中...</string>
-    <string name="intimacy_analyse_analysis_use_ai_tip">报告内容由AI大数据解读,请勿作为决策依据</string>
+    <string name="intimacy_analyse_analysis_use_ai_tip">报告内容由AI大数据解读,请勿作为决策依据
+    </string>
 
 
     <string name="my_self">自己</string>
     <string name="my_self">自己</string>
     <string name="and">与</string>
     <string name="and">与</string>
@@ -260,6 +266,16 @@
     <string name="intimacy_current_stage">目前阶段</string>
     <string name="intimacy_current_stage">目前阶段</string>
     <string name="intimacy_value_percent">%</string>
     <string name="intimacy_value_percent">%</string>
 
 
+    <string name="intimacy_unlock_analyse">解锁分析</string>
+    <string name="intimacy_upload_screenshot">上传截图</string>
+    <string name="intimacy_analyse_upload_screenshot_card_tip">
+        上传朋友圈、小红书、抖音等社交平台截图帮你搭讪帮你撩
+    </string>
+    <string name="intimacy_analyse_upload_screenshot_sample_title">温暖了四季</string>
+    <string name="intimacy_analyse_upload_screenshot_sample_desc">祝我恢复单身生活 ✌</string>
+    <string name="intimacy_analyse_upload_screenshot_sample_publish_time">刚刚</string>
+    <string name="intimacy_analyse_upload_screenshot_sample_image">示例图</string>
+
     <string name="next_step">下一步</string>
     <string name="next_step">下一步</string>
     <string name="recently">最近</string>
     <string name="recently">最近</string>
 
 

+ 2 - 1
lib/module/intimacy_analyse/analyse_report/intimacy_analyse_report_view.dart

@@ -8,6 +8,7 @@ import 'package:keyboard/module/intimacy_analyse/analyse_report/widget/report_ti
 import '../../../data/bean/intimacy_analyse_report.dart';
 import '../../../data/bean/intimacy_analyse_report.dart';
 import '../../../resource/assets.gen.dart';
 import '../../../resource/assets.gen.dart';
 import '../../../resource/colors.gen.dart';
 import '../../../resource/colors.gen.dart';
+import '../../../resource/string.gen.dart';
 import '../../../widget/avatar/avatar_image_widget.dart';
 import '../../../widget/avatar/avatar_image_widget.dart';
 import '../../../widget/markdown/markdown_viewer.dart';
 import '../../../widget/markdown/markdown_viewer.dart';
 import '../widget/intimacy_user_widget.dart';
 import '../widget/intimacy_user_widget.dart';
@@ -259,7 +260,7 @@ class IntimacyAnalyseReportView
             ),
             ),
             SizedBox(width: 4.w),
             SizedBox(width: 4.w),
             Text(
             Text(
-              "解锁分析",
+              StringName.intimacyUnlockAnalyse,
               style: TextStyle(
               style: TextStyle(
                 color: ColorName.white,
                 color: ColorName.white,
                 fontSize: 16.sp,
                 fontSize: 16.sp,

+ 3 - 0
lib/module/intimacy_analyse/screenshot_reply/conversation_analysis/conversation_analysis_controller.dart

@@ -4,4 +4,7 @@ import 'package:keyboard/base/base_controller.dart';
 /// 对话分析Controller
 /// 对话分析Controller
 @injectable
 @injectable
 class ConversationAnalysisController extends BaseController {
 class ConversationAnalysisController extends BaseController {
+  /// 点击上传截图按钮
+  void clickUploadScreenshotBtn() {
+  }
 }
 }

+ 129 - 4
lib/module/intimacy_analyse/screenshot_reply/conversation_analysis/conversation_analysis_view.dart

@@ -1,6 +1,13 @@
 import 'package:flutter/material.dart';
 import 'package:flutter/material.dart';
+import 'package:flutter_screenutil/flutter_screenutil.dart';
+import 'package:get/get_state_manager/src/rx_flutter/rx_obx_widget.dart';
 import 'package:keyboard/base/base_view.dart';
 import 'package:keyboard/base/base_view.dart';
 
 
+import '../../../../resource/assets.gen.dart';
+import '../../../../resource/colors.gen.dart';
+import '../../../../resource/string.gen.dart';
+import '../../../../utils/string_format_util.dart';
+import '../../widget/step_card.dart';
 import 'conversation_analysis_controller.dart';
 import 'conversation_analysis_controller.dart';
 
 
 /// 对话分析Tab页
 /// 对话分析Tab页
@@ -15,11 +22,129 @@ class ConversationAnalysisView
 
 
   @override
   @override
   Widget buildBody(BuildContext context) {
   Widget buildBody(BuildContext context) {
-    return Center(
-      child: Text(
-        '对话分析',
-        style: TextStyle(fontSize: 20, color: Color(0xFF000000)),
+    return Stack(
+      children: [
+        Column(
+          children: [
+            // 上传截图例子卡片
+            _buildUploadScreenshotSampleCard(),
+          ],
+        ),
+        // 上传截图按钮
+        Positioned.fill(
+          child: Align(
+            alignment: Alignment.bottomCenter,
+            child: _buildBottomLayout(context),
+          ),
+        ),
+      ],
+    );
+  }
+
+  /// 上传截图例子卡片
+  Widget _buildUploadScreenshotSampleCard() {
+    return StepCard(
+      bgImageProvider: Assets.images.bgIntimacyAnalyseUploadCard.provider(),
+      stepLabel: "",
+      stepTitle: StringName.intimacyUploadScreenshot,
+      stepDesc: StringName.intimacyAnalyseUploadScreenshotCardTip,
+      topIconWidget: Assets.images.iconIntimacyAnalyseUploadTop.image(
+        height: 63.h,
+        width: 103.w,
       ),
       ),
+      contentWidget: Column(
+        children: [
+          Container(
+            margin: EdgeInsets.only(left: 12.w, top: 17.h, right: 12.w),
+            padding: EdgeInsets.only(
+              left: 12.w,
+              top: 12.h,
+              right: 12.w,
+              bottom: 12.h,
+            ),
+            decoration: BoxDecoration(
+              color: ColorName.white,
+              borderRadius: BorderRadius.circular(16.r),
+            ),
+            child: Stack(
+              children: [
+                Assets.images.iconUploadScreenshotSampleImage.image(
+                  width: 288.w,
+                  height: 290.h,
+                  // fit: BoxFit.cover,
+                ),
+                Positioned(
+                  right: 12.w,
+                  bottom: 12.w,
+                  child: Container(
+                    padding: EdgeInsets.all(6.w),
+                    decoration: BoxDecoration(
+                      color: ColorName.black28,
+                      borderRadius: BorderRadius.circular(9.r),
+                    ),
+                    child: Text(
+                      StringName.intimacyAnalyseUploadScreenshotSampleImage,
+                      style: TextStyle(
+                        color: ColorName.white,
+                        fontSize: 12.sp,
+                        fontWeight: FontWeight.w500,
+                      ),
+                    ),
+                  ),
+                ),
+              ],
+            ),
+          ),
+        ],
+      ),
+    );
+  }
+
+  /// 上传截图按钮
+  Widget _buildUploadScreenshotBtn() {
+    return GestureDetector(
+      onTap: () {
+        controller.clickUploadScreenshotBtn();
+      },
+      child: Container(
+        margin: EdgeInsets.symmetric(horizontal: 16.w),
+        padding: EdgeInsets.symmetric(vertical: 14.h),
+        width: double.maxFinite,
+        decoration: ShapeDecoration(
+          // 渐变背景
+          gradient: LinearGradient(
+            colors: [ColorName.purpleGradient3, ColorName.purpleGradient4],
+            begin: Alignment.centerLeft,
+            end: Alignment.centerRight,
+          ),
+          shape: RoundedRectangleBorder(
+            borderRadius: BorderRadius.circular(50.r),
+          ),
+        ),
+        child: Center(
+          child: Text(
+            StringName.intimacyUploadScreenshot,
+            style: TextStyle(
+              color: ColorName.white,
+              fontSize: 16.sp,
+              fontWeight: FontWeight.w500,
+            ),
+          ),
+        ),
+      ),
+    );
+  }
+
+  /// 底部布局
+  Widget _buildBottomLayout(BuildContext context) {
+    return Column(
+      // 高度包裹内容
+      mainAxisSize: MainAxisSize.min,
+      crossAxisAlignment: CrossAxisAlignment.start,
+      children: [
+        // 上传截图按钮
+        _buildUploadScreenshotBtn(), SizedBox(height: 20.h),
+      ],
     );
     );
   }
   }
 }
 }

+ 0 - 1
lib/module/intimacy_analyse/screenshot_reply/intimacy_analyse_screenshot_reply_view.dart

@@ -6,7 +6,6 @@ import 'package:keyboard/module/intimacy_analyse/screenshot_reply/scan_image_rep
 import 'package:nested_scroll_views/material.dart';
 import 'package:nested_scroll_views/material.dart';
 
 
 import '../../../resource/colors.gen.dart';
 import '../../../resource/colors.gen.dart';
-import '../../../widget/tabbar/custom_tab_indicator.dart';
 import 'conversation_analysis/conversation_analysis_view.dart';
 import 'conversation_analysis/conversation_analysis_view.dart';
 import 'intimacy_analyse_screenshot_reply_controller.dart';
 import 'intimacy_analyse_screenshot_reply_controller.dart';
 
 

+ 28 - 13
lib/module/intimacy_analyse/widget/step_card.dart

@@ -58,7 +58,11 @@ class StepCard extends StatelessWidget {
               children: [
               children: [
                 // 步骤标题
                 // 步骤标题
                 Container(
                 Container(
-                  margin: EdgeInsets.only(left: 12.w, top: 16.h),
+                  margin: EdgeInsets.only(
+                    // 存在步骤标签时,才有左边距
+                    left: hasStepLabel() ? 12.w : 0,
+                    top: 16.h,
+                  ),
                   child: _buildStepTitle(),
                   child: _buildStepTitle(),
                 ),
                 ),
                 SizedBox(height: 4.h),
                 SizedBox(height: 4.h),
@@ -66,6 +70,7 @@ class StepCard extends StatelessWidget {
                 stepDesc.isNotEmpty
                 stepDesc.isNotEmpty
                     ? _buildStepDesc(stepDesc)
                     ? _buildStepDesc(stepDesc)
                     : SizedBox(height: 6.h),
                     : SizedBox(height: 6.h),
+                // 内容区域
                 contentWidget,
                 contentWidget,
                 SizedBox(height: 12.h),
                 SizedBox(height: 12.h),
               ],
               ],
@@ -76,15 +81,20 @@ class StepCard extends StatelessWidget {
     );
     );
   }
   }
 
 
+  /// 是否有步骤标签
+  bool hasStepLabel() {
+    String stepLabelStr = stepLabel ?? "";
+    return stepLabelStr.isNotEmpty == true;
+  }
+
   /// 步骤标题
   /// 步骤标题
   Widget _buildStepTitle() {
   Widget _buildStepTitle() {
     // 步骤标签
     // 步骤标签
-    String stepLabelStr = stepLabel ?? "";
     Widget stepLabelWidget;
     Widget stepLabelWidget;
-    if (stepLabelStr.isBlank == true) {
-      stepLabelWidget = SizedBox();
+    if (hasStepLabel()) {
+      stepLabelWidget = StepLabelWidget(label: stepLabel ?? "");
     } else {
     } else {
-      stepLabelWidget = StepLabelWidget(label: stepLabelStr);
+      stepLabelWidget = SizedBox();
     }
     }
 
 
     return Row(
     return Row(
@@ -112,14 +122,19 @@ class StepCard extends StatelessWidget {
     }
     }
     return Row(
     return Row(
       children: [
       children: [
-        Container(
-          margin: EdgeInsets.only(left: 12.w),
-          child: Text(
-            desc,
-            style: TextStyle(
-              fontSize: 12.sp,
-              fontWeight: FontWeight.w400,
-              color: ColorName.black60,
+        Expanded(
+          child: Container(
+            margin: EdgeInsets.only(left: 12.w, right: 12.w),
+            child: Text(
+              desc,
+              // 单行,超过时显示省略号
+              overflow: TextOverflow.ellipsis,
+              maxLines: 1,
+              style: TextStyle(
+                fontSize: 12.sp,
+                fontWeight: FontWeight.w400,
+                color: ColorName.black60,
+              ),
             ),
             ),
           ),
           ),
         ),
         ),

+ 6 - 0
lib/resource/assets.gen.dart

@@ -823,6 +823,11 @@ class $AssetsImagesGen {
   AssetGenImage get iconUploadFail =>
   AssetGenImage get iconUploadFail =>
       const AssetGenImage('assets/images/icon_upload_fail.webp');
       const AssetGenImage('assets/images/icon_upload_fail.webp');
 
 
+  /// File path: assets/images/icon_upload_screenshot_sample_image.webp
+  AssetGenImage get iconUploadScreenshotSampleImage => const AssetGenImage(
+    'assets/images/icon_upload_screenshot_sample_image.webp',
+  );
+
   /// File path: assets/images/icon_uploading.webp
   /// File path: assets/images/icon_uploading.webp
   AssetGenImage get iconUploading =>
   AssetGenImage get iconUploading =>
       const AssetGenImage('assets/images/icon_uploading.webp');
       const AssetGenImage('assets/images/icon_uploading.webp');
@@ -1032,6 +1037,7 @@ class $AssetsImagesGen {
     iconUploadAddSymbol,
     iconUploadAddSymbol,
     iconUploadDelete,
     iconUploadDelete,
     iconUploadFail,
     iconUploadFail,
+    iconUploadScreenshotSampleImage,
     iconUploading,
     iconUploading,
     iconWechat,
     iconWechat,
     iconWechatPayment,
     iconWechatPayment,

+ 9 - 0
lib/resource/colors.gen.dart

@@ -76,6 +76,9 @@ class ColorName {
   /// Color: #40000000
   /// Color: #40000000
   static const Color black25 = Color(0x40000000);
   static const Color black25 = Color(0x40000000);
 
 
+  /// Color: #47000000
+  static const Color black28 = Color(0x47000000);
+
   /// Color: #4D000000
   /// Color: #4D000000
   static const Color black30 = Color(0x4D000000);
   static const Color black30 = Color(0x4D000000);
 
 
@@ -202,6 +205,12 @@ class ColorName {
   /// Color: #FFBE68FF
   /// Color: #FFBE68FF
   static const Color purpleGradient2 = Color(0xFFBE68FF);
   static const Color purpleGradient2 = Color(0xFFBE68FF);
 
 
+  /// Color: #FF7D46FC
+  static const Color purpleGradient3 = Color(0xFF7D46FC);
+
+  /// Color: #FFBC87FF
+  static const Color purpleGradient4 = Color(0xFFBC87FF);
+
   /// Color: #666666
   /// Color: #666666
   static const Color secondaryTextColor = Color(0xFF666666);
   static const Color secondaryTextColor = Color(0xFF666666);
 
 

+ 14 - 0
lib/resource/string.gen.dart

@@ -189,6 +189,13 @@ class StringName {
   static final String intimacyValue = 'intimacy_value'.tr; // 情感亲密度
   static final String intimacyValue = 'intimacy_value'.tr; // 情感亲密度
   static final String intimacyCurrentStage = 'intimacy_current_stage'.tr; // 目前阶段
   static final String intimacyCurrentStage = 'intimacy_current_stage'.tr; // 目前阶段
   static final String intimacyValuePercent = 'intimacy_value_percent'.tr; // %
   static final String intimacyValuePercent = 'intimacy_value_percent'.tr; // %
+  static final String intimacyUnlockAnalyse = 'intimacy_unlock_analyse'.tr; // 解锁分析
+  static final String intimacyUploadScreenshot = 'intimacy_upload_screenshot'.tr; // 上传截图
+  static final String intimacyAnalyseUploadScreenshotCardTip = 'intimacy_analyse_upload_screenshot_card_tip'.tr; // 上传朋友圈、小红书、抖音等社交平台截图帮你搭讪帮你撩
+  static final String intimacyAnalyseUploadScreenshotSampleTitle = 'intimacy_analyse_upload_screenshot_sample_title'.tr; // 温暖了四季
+  static final String intimacyAnalyseUploadScreenshotSampleDesc = 'intimacy_analyse_upload_screenshot_sample_desc'.tr; // 祝我恢复单身生活 ✌
+  static final String intimacyAnalyseUploadScreenshotSamplePublishTime = 'intimacy_analyse_upload_screenshot_sample_publish_time'.tr; // 刚刚
+  static final String intimacyAnalyseUploadScreenshotSampleImage = 'intimacy_analyse_upload_screenshot_sample_image'.tr; // 示例图
   static final String nextStep = 'next_step'.tr; // 下一步
   static final String nextStep = 'next_step'.tr; // 下一步
   static final String recently = 'recently'.tr; // 最近
   static final String recently = 'recently'.tr; // 最近
 }
 }
@@ -383,6 +390,13 @@ class StringMultiSource {
       'intimacy_value': '情感亲密度',
       'intimacy_value': '情感亲密度',
       'intimacy_current_stage': '目前阶段',
       'intimacy_current_stage': '目前阶段',
       'intimacy_value_percent': '%',
       'intimacy_value_percent': '%',
+      'intimacy_unlock_analyse': '解锁分析',
+      'intimacy_upload_screenshot': '上传截图',
+      'intimacy_analyse_upload_screenshot_card_tip': '上传朋友圈、小红书、抖音等社交平台截图帮你搭讪帮你撩',
+      'intimacy_analyse_upload_screenshot_sample_title': '温暖了四季',
+      'intimacy_analyse_upload_screenshot_sample_desc': '祝我恢复单身生活 ✌',
+      'intimacy_analyse_upload_screenshot_sample_publish_time': '刚刚',
+      'intimacy_analyse_upload_screenshot_sample_image': '示例图',
       'next_step': '下一步',
       'next_step': '下一步',
       'recently': '最近',
       'recently': '最近',
     },
     },