Procházet zdrojové kódy

feat: 生成分享海报图

DoggyZhang před 4 měsíci
rodič
revize
b804ce06d7
27 změnil soubory, kde provedl 766 přidání a 207 odebrání
  1. 1 1
      app/dependencies/releaseRuntimeClasspath.txt
  2. 7 1
      app/src/main/java/com/adealink/weparty/constant/Tags.kt
  3. 2 2
      app/src/main/java/com/adealink/weparty/module/share/Router.kt
  4. binární
      app/src/main/res/drawable-xhdpi/common_app_logo_ic.png
  5. 1 1
      app/src/main/res/drawable/bg_splash.xml
  6. 1 0
      app/src/main/res/values/colors.xml
  7. 1 0
      app/src/main/res/values/strings.xml
  8. 1 3
      frame/tuikit/TUIRoomKit/tuiroomkit/build.gradle
  9. 1 1
      module/profile/src/main/java/com/adealink/weparty/profile/me/MeFragment.kt
  10. 1 1
      module/share/src/main/AndroidManifest.xml
  11. 4 0
      module/share/src/main/java/com/adealink/weparty/share/data/Tags.kt
  12. 15 13
      module/share/src/main/java/com/adealink/weparty/share/poster/SharePosterActivity.kt
  13. 7 7
      module/share/src/main/java/com/adealink/weparty/share/poster/adapter/PhotoItemViewBinder.kt
  14. 219 0
      module/share/src/main/java/com/adealink/weparty/share/poster/comp/SharePosterComp.kt
  15. 1 1
      module/share/src/main/java/com/adealink/weparty/share/poster/data/ShareFriendData.kt
  16. binární
      module/share/src/main/res/drawable-xhdpi/share_poster_game_title_bg.png
  17. binární
      module/share/src/main/res/drawable-xhdpi/share_poster_shot_bg.png
  18. binární
      module/share/src/main/res/drawable-xhdpi/share_poster_shot_news_ic.png
  19. 9 0
      module/share/src/main/res/drawable/share_poster_shot_game_name_bg.xml
  20. 8 0
      module/share/src/main/res/drawable/share_poster_shot_news_bg.xml
  21. 0 176
      module/share/src/main/res/layout/activity_share_friend.xml
  22. 76 0
      module/share/src/main/res/layout/activity_share_poster.xml
  23. 107 0
      module/share/src/main/res/layout/layout_share_poster_content.xml
  24. 37 0
      module/share/src/main/res/layout/layout_share_poster_game_item.xml
  25. 0 0
      module/share/src/main/res/layout/layout_share_poster_photo_item.xml
  26. 264 0
      module/share/src/main/res/layout/layout_share_poster_shot.xml
  27. 3 0
      module/share/src/main/res/values/strings.xml

+ 1 - 1
app/dependencies/releaseRuntimeClasspath.txt

@@ -281,7 +281,7 @@ io.noties.markwon:linkify:4.6.2
 io.reactivex.rxjava3:rxandroid:3.0.0
 io.reactivex.rxjava3:rxjava:3.0.4
 io.trtc.uikit:common:2.8.0.634
-io.trtc.uikit:rtc_room_engine:2.8.4.60
+io.trtc.uikit:rtc_room_engine:3.2.3.844
 javax.inject:javax.inject:1
 org.checkerframework:checker-qual:3.43.0
 org.conscrypt:conscrypt-android:2.5.3

+ 7 - 1
app/src/main/java/com/adealink/weparty/constant/Tags.kt

@@ -11,4 +11,10 @@ const val TAG_TOO_LARGE_TOOL = "TooLargeTool"
 
 fun logTime(tag: String, msg: String) {
     Log.d(tag, "$msg, time: ${SystemClock.elapsedRealtime()}")
-}
+}
+
+
+/**
+ * 一些Dialog的tag
+ */
+const val STORAGE_PERMISSION_DIALOG = "storage_permission_dialog"

+ 2 - 2
app/src/main/java/com/adealink/weparty/module/share/Router.kt

@@ -17,9 +17,9 @@ interface Share {
         }
     }
 
-    interface ShareFriend {
+    interface Poster {
         companion object {
-            const val PATH = "${Common.PATH}/share_friend"
+            const val PATH = "${Common.PATH}/poster"
         }
     }
 

binární
app/src/main/res/drawable-xhdpi/common_app_logo_ic.png


+ 1 - 1
app/src/main/res/drawable/bg_splash.xml

@@ -8,6 +8,6 @@
     <item android:top="218dp">
         <bitmap
             android:gravity="top"
-            android:src="@drawable/ic_launcher" />
+            android:src="@drawable/common_app_logo_ic" />
     </item>
 </layer-list>

+ 1 - 0
app/src/main/res/values/colors.xml

@@ -1177,4 +1177,5 @@
     <color name="color_FF01327B">#FF01327B</color>
     <color name="color_FF0A625F">#FF0A625F</color>
     <color name="color_FFE5E6EB">#FFE5E6EB</color>
+    <color name="color_FF466811">#FF466811</color>
 </resources>

+ 1 - 0
app/src/main/res/values/strings.xml

@@ -254,4 +254,5 @@
     <string name="common_main_message_tab">消息</string>
     <string name="common_main_me_tab">我的</string>
     <string name="common_logout">Log out</string>
+    <string name="toast_storage_permission_no_granted">The storage permission has not been obtained, and the picture cannot be saved. Go to [System Settings] to open it.</string>
 </resources>

+ 1 - 3
frame/tuikit/TUIRoomKit/tuiroomkit/build.gradle

@@ -1,5 +1,3 @@
-import org.gradle.util.VersionNumber
-
 apply plugin: 'com.android.library'
 def projects = this.rootProject.getAllprojects().stream().map { project -> project.name }.collect()
 
@@ -47,7 +45,7 @@ dependencies {
     implementation project(':timcommon')
 
     api rootProject.getProperties().containsKey("common") ? rootProject.ext.common : "io.trtc.uikit:common:2.8.0.634"
-    api rootProject.getProperties().containsKey("roomEngineSdk") ? rootProject.ext.roomEngineSdk : "io.trtc.uikit:rtc_room_engine:2.8.+"
+    api rootProject.getProperties().containsKey("roomEngineSdk") ? rootProject.ext.roomEngineSdk : "io.trtc.uikit:rtc_room_engine:3.2.3.844"
     api rootProject.getProperties().containsKey("liteavSdk") ? rootProject.ext.liteavSdk : "com.tencent.liteav:LiteAVSDK_Professional:12.5.+"
     api rootProject.getProperties().containsKey("liteavScreenCaptureSdk") ? rootProject.ext.liteavScreenCaptureSdk : "com.tencent.liteav:LiteAVSDK_ScreenCapture:12.5.+"
     if (projects.contains("tuicore")) {

+ 1 - 1
module/profile/src/main/java/com/adealink/weparty/profile/me/MeFragment.kt

@@ -73,7 +73,7 @@ class MeFragment : BaseFragment(R.layout.fragment_me) {
 
     private fun clickShare() {
         activity?.let { act ->
-            Router.build(act, Share.ShareFriend.PATH).start()
+            Router.build(act, Share.Poster.PATH).start()
         }
     }
 

+ 1 - 1
module/share/src/main/AndroidManifest.xml

@@ -17,7 +17,7 @@
 
     <application>
         <activity
-            android:name=".sharefriend.ShareFriendActivity"
+            android:name=".poster.SharePosterActivity"
             android:screenOrientation="portrait"
             android:theme="@style/AppTheme" />
     </application>

+ 4 - 0
module/share/src/main/java/com/adealink/weparty/share/data/Tags.kt

@@ -0,0 +1,4 @@
+package com.adealink.weparty.share.data
+
+const val TAG_SHARE = "tag_share"
+const val TAG_SHARE_POSTER = "${TAG_SHARE}_poster"

+ 15 - 13
module/share/src/main/java/com/adealink/weparty/share/sharefriend/ShareFriendActivity.kt → module/share/src/main/java/com/adealink/weparty/share/poster/SharePosterActivity.kt

@@ -1,4 +1,4 @@
-package com.adealink.weparty.share.sharefriend
+package com.adealink.weparty.share.poster
 
 import androidx.constraintlayout.widget.ConstraintLayout
 import androidx.core.view.updateLayoutParams
@@ -11,14 +11,15 @@ import com.adealink.frame.util.DisplayUtil.getStatusBarHeight
 import com.adealink.weparty.commonui.BaseActivity
 import com.adealink.weparty.commonui.recycleview.adapter.MultiTypeListAdapter
 import com.adealink.weparty.module.share.Share
-import com.adealink.weparty.share.databinding.ActivityShareFriendBinding
-import com.adealink.weparty.share.sharefriend.adapter.PhotoItemViewBinder
-import com.adealink.weparty.share.sharefriend.data.PhotoData
-import com.adealink.weparty.share.sharefriend.data.PhotoItemData
+import com.adealink.weparty.share.databinding.ActivitySharePosterBinding
+import com.adealink.weparty.share.poster.adapter.PhotoItemViewBinder
+import com.adealink.weparty.share.poster.comp.SharePosterComp
+import com.adealink.weparty.share.poster.data.PhotoData
+import com.adealink.weparty.share.poster.data.PhotoItemData
 
-@RouterUri(path = [Share.ShareFriend.PATH], desc = "分享给好友")
-class ShareFriendActivity : BaseActivity(), PhotoItemViewBinder.OnPhotoSelectedListener {
-    private val binding by viewBinding(ActivityShareFriendBinding::inflate)
+@RouterUri(path = [Share.Poster.PATH], desc = "分享给好友")
+class SharePosterActivity : BaseActivity(), PhotoItemViewBinder.OnPhotoSelectedListener {
+    private val binding by viewBinding(ActivitySharePosterBinding::inflate)
 
     private val listAdapter by fastLazy { MultiTypeListAdapter<PhotoItemData>() }
     private val photoItemList = mutableListOf<PhotoItemData>()
@@ -27,16 +28,17 @@ class ShareFriendActivity : BaseActivity(), PhotoItemViewBinder.OnPhotoSelectedL
         super.initViews()
         setContentView(binding.root)
         binding.topBar.updateLayoutParams<ConstraintLayout.LayoutParams> {
-            topMargin = getStatusBarHeight(this@ShareFriendActivity)
+            topMargin = getStatusBarHeight(this@SharePosterActivity)
         }
 
         listAdapter.register(PhotoItemViewBinder(this))
         binding.rvAlbum.layoutManager = LinearLayoutManager(this, RecyclerView.HORIZONTAL, false)
         binding.rvAlbum.adapter = listAdapter
+    }
 
-        binding.btnShare.setOnClickListener {
-
-        }
+    override fun initComponents() {
+        super.initComponents()
+        SharePosterComp(this, binding.btnShare).attach()
     }
 
     override fun loadData() {
@@ -64,7 +66,7 @@ class ShareFriendActivity : BaseActivity(), PhotoItemViewBinder.OnPhotoSelectedL
             }
         )
         listAdapter.submitList(photoItemList)
-        binding.ivPhoto.setImageUrl(selectedPhoto?.data?.url)
+        binding.clContent.ivPhoto.setImageUrl(selectedPhoto?.data?.url)
     }
 
     override fun onSelected(data: PhotoItemData) {

+ 7 - 7
module/share/src/main/java/com/adealink/weparty/share/sharefriend/adapter/PhotoItemViewBinder.kt → module/share/src/main/java/com/adealink/weparty/share/poster/adapter/PhotoItemViewBinder.kt

@@ -1,4 +1,4 @@
-package com.adealink.weparty.share.sharefriend.adapter
+package com.adealink.weparty.share.poster.adapter
 
 import android.view.LayoutInflater
 import android.view.ViewGroup
@@ -10,14 +10,14 @@ import com.adealink.weparty.commonui.ext.dpf
 import com.adealink.weparty.commonui.recycleview.adapter.BindingViewHolder
 import com.adealink.weparty.commonui.recycleview.adapter.multitype.ItemViewBinder
 import com.adealink.weparty.share.R
-import com.adealink.weparty.share.databinding.LayoutShareFriendPhotoItemBinding
-import com.adealink.weparty.share.sharefriend.data.PhotoItemData
+import com.adealink.weparty.share.databinding.LayoutSharePosterPhotoItemBinding
+import com.adealink.weparty.share.poster.data.PhotoItemData
 
 class PhotoItemViewBinder(val listener: OnPhotoSelectedListener) :
-    ItemViewBinder<PhotoItemData, BindingViewHolder<LayoutShareFriendPhotoItemBinding>>() {
+    ItemViewBinder<PhotoItemData, BindingViewHolder<LayoutSharePosterPhotoItemBinding>>() {
 
     override fun onBindViewHolder(
-        holder: BindingViewHolder<LayoutShareFriendPhotoItemBinding>,
+        holder: BindingViewHolder<LayoutSharePosterPhotoItemBinding>,
         item: PhotoItemData,
     ) {
         holder.binding.ivPhoto.setImageUrl(item.data.url)
@@ -35,8 +35,8 @@ class PhotoItemViewBinder(val listener: OnPhotoSelectedListener) :
     override fun onCreateViewHolder(
         inflater: LayoutInflater,
         parent: ViewGroup,
-    ): BindingViewHolder<LayoutShareFriendPhotoItemBinding> {
-        return BindingViewHolder(LayoutShareFriendPhotoItemBinding.inflate(inflater, parent, false))
+    ): BindingViewHolder<LayoutSharePosterPhotoItemBinding> {
+        return BindingViewHolder(LayoutSharePosterPhotoItemBinding.inflate(inflater, parent, false))
     }
 
     interface OnPhotoSelectedListener {

+ 219 - 0
module/share/src/main/java/com/adealink/weparty/share/poster/comp/SharePosterComp.kt

@@ -0,0 +1,219 @@
+package com.adealink.weparty.share.poster.comp
+
+import android.Manifest
+import android.annotation.SuppressLint
+import android.graphics.Bitmap
+import android.os.Build
+import android.view.LayoutInflater
+import android.view.View
+import androidx.lifecycle.LifecycleOwner
+import androidx.lifecycle.lifecycleScope
+import com.adealink.frame.aab.util.getCompatString
+import com.adealink.frame.base.AppBase
+import com.adealink.frame.coroutine.dispatcher.Dispatcher
+import com.adealink.frame.ext.copyToAlbum
+import com.adealink.frame.log.Log
+import com.adealink.frame.mvvm.view.ViewComponent
+import com.adealink.frame.util.AppUtil
+import com.adealink.frame.util.ViewShotUtil
+import com.adealink.frame.util.getFileName
+import com.adealink.weparty.commonui.BaseActivity
+import com.adealink.weparty.commonui.toast.util.showToast
+import com.adealink.weparty.commonui.widget.CommonDialog
+import com.adealink.weparty.constant.STORAGE_PERMISSION_DIALOG
+import com.adealink.weparty.permission.PermissionUtils
+import com.adealink.weparty.share.R
+import com.adealink.weparty.share.data.TAG_SHARE_POSTER
+import com.adealink.weparty.share.databinding.LayoutSharePosterShotBinding
+import com.adealink.weparty.storage.file.FilePath
+import com.google.zxing.BarcodeFormat
+import com.google.zxing.EncodeHintType
+import com.journeyapps.barcodescanner.BarcodeEncoder
+import kotlinx.coroutines.launch
+import kotlinx.coroutines.withContext
+import java.io.File
+import com.adealink.weparty.R as APP_R
+
+class SharePosterComp(
+    lifecycleOwner: LifecycleOwner,
+    val shareButton: View
+) : ViewComponent(lifecycleOwner) {
+
+    override fun onCreate() {
+        super.onCreate()
+        initView()
+    }
+
+    private fun initView() {
+        shareButton.setOnClickListener {
+            sharePoster()
+        }
+    }
+
+    //保存图片需要检查存储权限
+    @SuppressLint("CheckResult")
+    private fun checkStoragePermissionAndSaveImg() {
+        val context = activity ?: return
+        val permission = getMediaImagePermission()
+        if (PermissionUtils.hasPermissions(context, *permission)) {
+            sharePoster()
+        } else {
+            PermissionUtils.getRxPermissions(context)
+                .request(*permission).subscribe { granted ->
+                    if (granted) {
+                        sharePoster()
+                    } else {
+                        showPermissionNoGrantedDialog()
+                    }
+                }
+        }
+    }
+
+    private fun sharePoster() {
+        (activity as? BaseActivity)?.showLoading()
+        viewLifecycleOwner.lifecycleScope.launch {
+            var qrCodeImg: Bitmap?
+            try {
+                qrCodeImg = generateQRCode()
+                val posterPath = generatePosterBitmap(qrCodeImg)
+                savePosterToAlbum(posterPath)
+                showToast(R.string.share_save_poster_success)
+            } catch (e: Exception) {
+                Log.d(TAG_SHARE_POSTER, "sharePoster fail, for ${e.message}", e)
+                showToast(R.string.share_save_poster_fail)
+            } finally {
+                (activity as? BaseActivity)?.dismissLoading()
+            }
+        }
+    }
+
+    private suspend fun generateQRCode(): Bitmap? {
+        return withContext(Dispatcher.WENEXT_THREAD_POOL) {
+            val qrCodeText = "Hello, 扫码呀!!!!"
+            try {
+                val barcodeEncoder = BarcodeEncoder()
+                val bitmap = barcodeEncoder.encodeBitmap(
+                    qrCodeText,
+                    BarcodeFormat.QR_CODE,
+                    400, 400,
+                    mapOf<EncodeHintType, Any>(
+                        EncodeHintType.CHARACTER_SET to "UTF-8",
+                        EncodeHintType.MARGIN to "2"
+                    )
+                )
+                return@withContext bitmap
+            } catch (e: Exception) {
+                Log.e(TAG_SHARE_POSTER, "generateQRCode fail, ${e.message}", e)
+            }
+            return@withContext null
+        }
+    }
+
+    private suspend fun generatePosterBitmap(qrCode: Bitmap?): String? {
+        return withContext(Dispatcher.WENEXT_THREAD_POOL) {
+            //加载模版布局
+            val shotView =
+                LayoutInflater.from(context).inflate(R.layout.layout_share_poster_shot, null)
+
+            // TODO: 海报内容要动态填入
+            val shotViewBinding = LayoutSharePosterShotBinding.bind(shotView)
+            shotViewBinding.tvNews.text = "新闻标题123123123123"
+
+            shotViewBinding.ivPhoto.setImageUrl("https://im.sdk.qcloud.com/download/tuikit-resource/community-cover/community_cover_default.png")
+            shotViewBinding.tvName.text = "用户名字"
+            shotViewBinding.tvEvaluate.text = "4.9"
+            shotViewBinding.tvLocation.text = "雅加达"
+            shotViewBinding.tvSummary.text =
+                "自我介绍总结,自我介绍总结,自我介绍总结,自我介绍总结"
+
+            shotViewBinding.vGame1.ivGame.setImageUrl("https://im.sdk.qcloud.com/download/tuikit-resource/group-avatar/group_avatar_default.png")
+            shotViewBinding.vGame1.tvGame.text = "Game1"
+
+            shotViewBinding.vGame2.ivGame.setImageUrl("https://im.sdk.qcloud.com/download/tuikit-resource/group-avatar/group_avatar_default.png")
+            shotViewBinding.vGame2.tvGame.text = "Game2"
+
+            shotViewBinding.vGame3.ivGame.setImageUrl("https://im.sdk.qcloud.com/download/tuikit-resource/group-avatar/group_avatar_default.png")
+            shotViewBinding.vGame3.tvGame.text = "Game3"
+
+            if (qrCode != null && !qrCode.isRecycled) {
+                shotViewBinding.ivQrCode.setImageBitmap(qrCode)
+            }
+
+            //测量视图(重要!)
+            shotView.measure(
+                View.MeasureSpec.makeMeasureSpec(SHOT_WIDTH, View.MeasureSpec.EXACTLY),
+                View.MeasureSpec.makeMeasureSpec(SHOT_HEIGHT, View.MeasureSpec.EXACTLY)
+            )
+            //布局视图
+            shotView.layout(0, 0, shotView.measuredWidth, shotView.measuredHeight)
+
+            //创建 Bitmap 并绘制
+            val savePath = FilePath.shareImagePath
+            if (savePath.isNullOrEmpty()) {
+                Log.e(TAG_SHARE_POSTER, "shotViewAndSave fail, for shareImagePath is null.")
+                return@withContext null
+            }
+            val shotPath = ViewShotUtil.of(shotView)
+                .setSavePath(savePath)
+                .setFilename(SHOT_IMG_NAME)
+                .minWidth(SHOT_WIDTH)
+                .maxWidth(SHOT_WIDTH)
+                .toPNG()
+                .save()
+            if (shotPath.isNullOrEmpty()) {
+                Log.e(
+                    TAG_SHARE_POSTER,
+                    "shotViewAndSave fail, for ViewShot fail."
+                )
+                return@withContext null
+            }
+            return@withContext shotPath
+        }
+    }
+
+    private suspend fun savePosterToAlbum(posterPath: String?) {
+        return withContext(Dispatcher.WENEXT_THREAD_POOL) {
+            if (posterPath.isNullOrEmpty()) {
+                Log.d(TAG_SHARE_POSTER, "saveImage fail, for shotView fail.")
+                return@withContext
+            }
+            val imgName = getFileName(posterPath)
+            if (imgName.isNullOrEmpty()) {
+                Log.d(TAG_SHARE_POSTER, "saveImage fail, for can not find imgName.")
+                return@withContext
+            }
+            withContext(Dispatcher.WENEXT_THREAD_POOL) {
+                File(posterPath).copyToAlbum(AppUtil.appContext, imgName, AppBase.appName)
+            }
+        }
+    }
+
+
+    private fun getMediaImagePermission(): Array<String> {
+        return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
+            arrayOf(Manifest.permission.READ_MEDIA_IMAGES)
+        } else {
+            arrayOf(Manifest.permission.WRITE_EXTERNAL_STORAGE)
+        }
+    }
+
+    private fun showPermissionNoGrantedDialog() {
+        val permissionDialog = CommonDialog.Builder()
+            .message(getCompatString(APP_R.string.toast_storage_permission_no_granted))
+            .onPositive {
+                PermissionUtils.startPermissionSettingActivity(activity)
+            }
+            .dismissAfterClick(true)
+            .setShowDefaultCancel(true)
+            .build()
+        permissionDialog.show(fragmentManager, STORAGE_PERMISSION_DIALOG)
+    }
+
+    companion object {
+
+        const val SHOT_IMG_NAME = "poster"
+        const val SHOT_WIDTH = 750 //像素
+        const val SHOT_HEIGHT = 1492 //像素
+    }
+
+}

+ 1 - 1
module/share/src/main/java/com/adealink/weparty/share/sharefriend/data/ShareFriendData.kt → module/share/src/main/java/com/adealink/weparty/share/poster/data/ShareFriendData.kt

@@ -1,4 +1,4 @@
-package com.adealink.weparty.share.sharefriend.data
+package com.adealink.weparty.share.poster.data
 
 import com.adealink.weparty.commonui.recycleview.diffutil.BaseListItemData
 

binární
module/share/src/main/res/drawable-xhdpi/share_poster_game_title_bg.png


binární
module/share/src/main/res/drawable-xhdpi/share_poster_shot_bg.png


binární
module/share/src/main/res/drawable-xhdpi/share_poster_shot_news_ic.png


+ 9 - 0
module/share/src/main/res/drawable/share_poster_shot_game_name_bg.xml

@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android"
+    android:shape="rectangle">
+    <corners android:radius="200dp" />
+    <gradient
+        android:angle="0"
+        android:endColor="#B1EF5D"
+        android:startColor="#4ED2FF" />
+</shape>

+ 8 - 0
module/share/src/main/res/drawable/share_poster_shot_news_bg.xml

@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android"
+    android:shape="rectangle">
+    <gradient
+        android:angle="0"
+        android:endColor="#00FFFFFF"
+        android:startColor="#33E0FFED" />
+</shape>

+ 0 - 176
module/share/src/main/res/layout/activity_share_friend.xml

@@ -1,176 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:app="http://schemas.android.com/apk/res-auto"
-    xmlns:tools="http://schemas.android.com/tools"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    android:background="@color/color_FFF1F2F5">
-
-    <com.adealink.weparty.commonui.widget.CommonTopBar
-        android:id="@+id/top_bar"
-        android:layout_width="match_parent"
-        android:layout_height="@dimen/common_top_bar_height"
-        android:background="@color/white"
-        app:layout_constraintTop_toTopOf="parent"
-        app:top_bar_title="@string/share_friend_title" />
-
-    <androidx.core.widget.NestedScrollView
-        android:layout_width="0dp"
-        android:layout_height="0dp"
-        app:layout_constraintBottom_toBottomOf="parent"
-        app:layout_constraintEnd_toEndOf="parent"
-        app:layout_constraintStart_toStartOf="parent"
-        app:layout_constraintTop_toBottomOf="@id/top_bar">
-
-        <androidx.constraintlayout.widget.ConstraintLayout
-            android:layout_width="match_parent"
-            android:layout_height="wrap_content">
-
-            <androidx.constraintlayout.widget.ConstraintLayout
-                android:id="@+id/cl_content"
-                android:layout_width="0dp"
-                android:layout_height="wrap_content"
-                android:layout_marginHorizontal="16dp"
-                android:layout_marginTop="32dp"
-                android:background="@drawable/share_friend_content_bg"
-                android:paddingHorizontal="16dp"
-                android:paddingTop="12dp"
-                android:paddingBottom="60dp"
-                app:layout_constraintEnd_toEndOf="parent"
-                app:layout_constraintStart_toStartOf="parent"
-                app:layout_constraintTop_toTopOf="parent">
-
-                <androidx.appcompat.widget.AppCompatTextView
-                    android:id="@+id/tv_name"
-                    android:layout_width="wrap_content"
-                    android:layout_height="wrap_content"
-                    android:ellipsize="end"
-                    android:fontFamily="@font/poppins_semibold"
-                    android:includeFontPadding="false"
-                    android:singleLine="true"
-                    android:textColor="@color/color_FF1D2129"
-                    android:textSize="18sp"
-                    app:layout_constrainedWidth="true"
-                    app:layout_constraintEnd_toStartOf="@id/v_gender"
-                    app:layout_constraintHorizontal_bias="0"
-                    app:layout_constraintHorizontal_chainStyle="packed"
-                    app:layout_constraintStart_toStartOf="parent"
-                    app:layout_constraintTop_toTopOf="parent"
-                    tools:text="Super Beautiful Girl Super Beautiful Girl Super Beautiful Girl" />
-
-                <com.adealink.weparty.module.profile.widget.GenderView
-                    android:id="@+id/v_gender"
-                    style="@style/CommonGenderView"
-                    android:layout_marginEnd="24dp"
-                    app:layout_constraintBottom_toBottomOf="@id/tv_name"
-                    app:layout_constraintEnd_toStartOf="@id/v_barrier_end"
-                    app:layout_constraintStart_toEndOf="@id/tv_name"
-                    app:layout_constraintTop_toTopOf="@id/tv_name" />
-
-                <androidx.constraintlayout.widget.Barrier
-                    android:id="@+id/v_barrier_end"
-                    android:layout_width="wrap_content"
-                    android:layout_height="wrap_content"
-                    app:barrierDirection="start"
-                    app:constraint_referenced_ids="iv_evaluate_star" />
-
-                <androidx.appcompat.widget.AppCompatImageView
-                    android:id="@+id/iv_evaluate_star"
-                    android:layout_width="18dp"
-                    android:layout_height="18dp"
-                    app:layout_constraintBottom_toBottomOf="@id/tv_name"
-                    app:layout_constraintEnd_toStartOf="@id/tv_evaluate"
-                    app:layout_constraintTop_toTopOf="@id/tv_name"
-                    app:srcCompat="@drawable/common_evaluate_star_selected_ic" />
-
-                <androidx.appcompat.widget.AppCompatTextView
-                    android:id="@+id/tv_evaluate"
-                    android:layout_width="wrap_content"
-                    android:layout_height="wrap_content"
-                    android:fontFamily="@font/poppins_semibold"
-                    android:includeFontPadding="false"
-                    android:textColor="@color/color_FF1D2129"
-                    android:textSize="18sp"
-                    app:layout_constraintBottom_toBottomOf="@id/tv_name"
-                    app:layout_constraintEnd_toEndOf="parent"
-                    app:layout_constraintTop_toTopOf="@id/tv_name"
-                    tools:text="4.2" />
-
-                <com.adealink.frame.image.view.NetworkImageView
-                    android:id="@+id/iv_photo"
-                    android:layout_width="0dp"
-                    android:layout_height="0dp"
-                    android:layout_marginTop="9dp"
-                    app:layout_constraintDimensionRatio="1:1"
-                    app:layout_constraintEnd_toEndOf="parent"
-                    app:layout_constraintStart_toStartOf="parent"
-                    app:layout_constraintTop_toBottomOf="@id/tv_name"
-                    app:roundedCornerRadius="20dp" />
-
-                <androidx.appcompat.widget.AppCompatTextView
-                    android:id="@+id/tv_location"
-                    android:layout_width="wrap_content"
-                    android:layout_height="wrap_content"
-                    android:background="@drawable/share_friend_photo_location_bg"
-                    android:gravity="center"
-                    android:includeFontPadding="false"
-                    android:paddingStart="12dp"
-                    android:paddingEnd="20dp"
-                    android:textColor="@color/color_FF4E5969"
-                    android:textSize="14sp"
-                    app:layout_constraintBottom_toBottomOf="@id/iv_photo"
-                    app:layout_constraintStart_toStartOf="@id/iv_photo"
-                    tools:text="Photototjo123ju123l123lk" />
-
-                <androidx.appcompat.widget.AppCompatTextView
-                    android:id="@+id/tv_summary"
-                    android:layout_width="0dp"
-                    android:layout_height="wrap_content"
-                    android:layout_marginTop="14dp"
-                    android:gravity="start"
-                    android:includeFontPadding="false"
-                    android:paddingStart="12dp"
-                    android:paddingEnd="20dp"
-                    android:textColor="@color/color_FF4E5969"
-                    android:textSize="14sp"
-                    app:layout_constrainedWidth="true"
-                    app:layout_constraintEnd_toEndOf="@id/iv_photo"
-                    app:layout_constraintStart_toStartOf="@id/iv_photo"
-                    app:layout_constraintTop_toBottomOf="@id/iv_photo"
-                    tools:text="Hello brother, multiple seasons of S, online,tiple seasons of S, online," />
-
-            </androidx.constraintlayout.widget.ConstraintLayout>
-
-            <androidx.recyclerview.widget.RecyclerView
-                android:id="@+id/rv_album"
-                android:layout_width="0dp"
-                android:layout_height="wrap_content"
-                android:layout_marginTop="24dp"
-                app:layout_constraintEnd_toEndOf="parent"
-                app:layout_constraintStart_toStartOf="parent"
-                app:layout_constraintTop_toBottomOf="@id/cl_content"
-                tools:itemCount="1"
-                tools:listitem="@layout/layout_share_friend_photo_item" />
-
-        </androidx.constraintlayout.widget.ConstraintLayout>
-
-    </androidx.core.widget.NestedScrollView>
-
-    <com.adealink.weparty.commonui.widget.CommonButton
-        android:id="@+id/btn_share"
-        android:layout_width="0dp"
-        android:layout_height="48dp"
-        android:layout_marginHorizontal="16dp"
-        android:layout_marginBottom="24dp"
-        android:fontFamily="@font/poppins_semibold"
-        android:gravity="center"
-        android:includeFontPadding="false"
-        android:text="@string/share_share_poster"
-        android:textColor="@color/white"
-        android:textSize="16sp"
-        app:layout_constraintBottom_toBottomOf="parent"
-        app:layout_constraintEnd_toEndOf="parent"
-        app:layout_constraintStart_toStartOf="parent" />
-
-
-</androidx.constraintlayout.widget.ConstraintLayout>

+ 76 - 0
module/share/src/main/res/layout/activity_share_poster.xml

@@ -0,0 +1,76 @@
+<?xml version="1.0" encoding="utf-8"?>
+<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:background="@color/color_FFF1F2F5">
+
+    <com.adealink.weparty.commonui.widget.CommonTopBar
+        android:id="@+id/top_bar"
+        android:layout_width="match_parent"
+        android:layout_height="@dimen/common_top_bar_height"
+        android:background="@color/white"
+        app:layout_constraintTop_toTopOf="parent"
+        app:top_bar_title="@string/share_friend_title" />
+
+    <androidx.core.widget.NestedScrollView
+        android:layout_width="0dp"
+        android:layout_height="0dp"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toBottomOf="@id/top_bar">
+
+        <androidx.constraintlayout.widget.ConstraintLayout
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content">
+
+            <include
+                android:id="@+id/cl_content"
+                layout="@layout/layout_share_poster_content"
+                android:layout_width="0dp"
+                android:layout_height="wrap_content"
+                android:layout_marginHorizontal="16dp"
+                android:layout_marginTop="32dp"
+                android:background="@drawable/share_friend_content_bg"
+                android:paddingHorizontal="16dp"
+                android:paddingTop="12dp"
+                android:paddingBottom="60dp"
+                app:layout_constraintEnd_toEndOf="parent"
+                app:layout_constraintStart_toStartOf="parent"
+                app:layout_constraintTop_toTopOf="parent" />
+
+            <androidx.recyclerview.widget.RecyclerView
+                android:id="@+id/rv_album"
+                android:layout_width="0dp"
+                android:layout_height="wrap_content"
+                android:layout_marginTop="24dp"
+                app:layout_constraintEnd_toEndOf="parent"
+                app:layout_constraintStart_toStartOf="parent"
+                app:layout_constraintTop_toBottomOf="@id/cl_content"
+                tools:itemCount="1"
+                tools:listitem="@layout/layout_share_poster_photo_item" />
+
+        </androidx.constraintlayout.widget.ConstraintLayout>
+
+    </androidx.core.widget.NestedScrollView>
+
+    <com.adealink.weparty.commonui.widget.CommonButton
+        android:id="@+id/btn_share"
+        android:layout_width="0dp"
+        android:layout_height="48dp"
+        android:layout_marginHorizontal="16dp"
+        android:layout_marginBottom="24dp"
+        android:fontFamily="@font/poppins_semibold"
+        android:gravity="center"
+        android:includeFontPadding="false"
+        android:text="@string/share_share_poster"
+        android:textColor="@color/white"
+        android:textSize="16sp"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintStart_toStartOf="parent" />
+
+
+</androidx.constraintlayout.widget.ConstraintLayout>

+ 107 - 0
module/share/src/main/res/layout/layout_share_poster_content.xml

@@ -0,0 +1,107 @@
+<?xml version="1.0" encoding="utf-8"?>
+<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent">
+
+    <androidx.appcompat.widget.AppCompatTextView
+        android:id="@+id/tv_name"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:ellipsize="end"
+        android:fontFamily="@font/poppins_semibold"
+        android:includeFontPadding="false"
+        android:singleLine="true"
+        android:textColor="@color/color_FF1D2129"
+        android:textSize="18sp"
+        app:layout_constrainedWidth="true"
+        app:layout_constraintEnd_toStartOf="@id/v_gender"
+        app:layout_constraintHorizontal_bias="0"
+        app:layout_constraintHorizontal_chainStyle="packed"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toTopOf="parent"
+        tools:text="Super Beautiful Girl Super Beautiful Girl Super Beautiful Girl" />
+
+    <com.adealink.weparty.module.profile.widget.GenderView
+        android:id="@+id/v_gender"
+        style="@style/CommonGenderView"
+        android:layout_marginEnd="24dp"
+        app:layout_constraintBottom_toBottomOf="@id/tv_name"
+        app:layout_constraintEnd_toStartOf="@id/v_barrier_end"
+        app:layout_constraintStart_toEndOf="@id/tv_name"
+        app:layout_constraintTop_toTopOf="@id/tv_name" />
+
+    <androidx.constraintlayout.widget.Barrier
+        android:id="@+id/v_barrier_end"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        app:barrierDirection="start"
+        app:constraint_referenced_ids="iv_evaluate_star" />
+
+    <androidx.appcompat.widget.AppCompatImageView
+        android:id="@+id/iv_evaluate_star"
+        android:layout_width="18dp"
+        android:layout_height="18dp"
+        app:layout_constraintBottom_toBottomOf="@id/tv_name"
+        app:layout_constraintEnd_toStartOf="@id/tv_evaluate"
+        app:layout_constraintTop_toTopOf="@id/tv_name"
+        app:srcCompat="@drawable/common_evaluate_star_selected_ic" />
+
+    <androidx.appcompat.widget.AppCompatTextView
+        android:id="@+id/tv_evaluate"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:fontFamily="@font/poppins_semibold"
+        android:includeFontPadding="false"
+        android:textColor="@color/color_FF1D2129"
+        android:textSize="18sp"
+        app:layout_constraintBottom_toBottomOf="@id/tv_name"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintTop_toTopOf="@id/tv_name"
+        tools:text="4.2" />
+
+    <com.adealink.frame.image.view.NetworkImageView
+        android:id="@+id/iv_photo"
+        android:layout_width="0dp"
+        android:layout_height="0dp"
+        android:layout_marginTop="9dp"
+        app:layout_constraintDimensionRatio="1:1"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toBottomOf="@id/tv_name"
+        app:roundedCornerRadius="20dp" />
+
+    <androidx.appcompat.widget.AppCompatTextView
+        android:id="@+id/tv_location"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:background="@drawable/share_friend_photo_location_bg"
+        android:gravity="center"
+        android:includeFontPadding="false"
+        android:paddingStart="12dp"
+        android:paddingEnd="20dp"
+        android:textColor="@color/color_FF4E5969"
+        android:textSize="14sp"
+        app:layout_constraintBottom_toBottomOf="@id/iv_photo"
+        app:layout_constraintStart_toStartOf="@id/iv_photo"
+        tools:text="Photototjo123ju123l123lk" />
+
+    <androidx.appcompat.widget.AppCompatTextView
+        android:id="@+id/tv_summary"
+        android:layout_width="0dp"
+        android:layout_height="wrap_content"
+        android:layout_marginTop="14dp"
+        android:gravity="start"
+        android:includeFontPadding="false"
+        android:paddingStart="12dp"
+        android:paddingEnd="20dp"
+        android:textColor="@color/color_FF4E5969"
+        android:textSize="14sp"
+        app:layout_constrainedWidth="true"
+        app:layout_constraintEnd_toEndOf="@id/iv_photo"
+        app:layout_constraintStart_toStartOf="@id/iv_photo"
+        app:layout_constraintTop_toBottomOf="@id/iv_photo"
+        tools:text="Hello brother, multiple seasons of S, online,tiple seasons of S, online," />
+
+</androidx.constraintlayout.widget.ConstraintLayout>

+ 37 - 0
module/share/src/main/res/layout/layout_share_poster_game_item.xml

@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="utf-8"?>
+<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_width="wrap_content"
+    android:layout_height="wrap_content"
+    tools:ignore="PxUsage">
+
+    <com.adealink.frame.image.view.NetworkImageView
+        android:id="@+id/iv_game"
+        android:layout_width="104px"
+        android:layout_height="104px"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toTopOf="parent"
+        app:roundAsCircle="true" />
+
+    <androidx.appcompat.widget.AppCompatTextView
+        android:id="@+id/tv_game"
+        android:layout_width="134px"
+        android:layout_height="42px"
+        android:background="@drawable/share_poster_shot_game_name_bg"
+        android:ellipsize="end"
+        android:gravity="center"
+        android:includeFontPadding="false"
+        android:paddingHorizontal="6px"
+        android:singleLine="true"
+        android:textColor="@color/white"
+        android:textSize="22px"
+        app:layout_constrainedWidth="true"
+        app:layout_constraintBottom_toBottomOf="@id/iv_game"
+        app:layout_constraintEnd_toEndOf="@id/iv_game"
+        app:layout_constraintStart_toStartOf="@id/iv_game"
+        app:layout_constraintTop_toBottomOf="@id/iv_game"
+        tools:text="Lol Mobile" />
+
+</androidx.constraintlayout.widget.ConstraintLayout>

+ 0 - 0
module/share/src/main/res/layout/layout_share_friend_photo_item.xml → module/share/src/main/res/layout/layout_share_poster_photo_item.xml


+ 264 - 0
module/share/src/main/res/layout/layout_share_poster_shot.xml

@@ -0,0 +1,264 @@
+<?xml version="1.0" encoding="utf-8"?>
+<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_width="750px"
+    android:layout_height="1492px"
+    android:background="@drawable/share_poster_shot_bg"
+    tools:ignore="PxUsage">
+
+    <androidx.constraintlayout.widget.ConstraintLayout
+        android:layout_width="match_parent"
+        android:layout_height="64px"
+        android:background="@drawable/share_poster_shot_news_bg"
+        android:paddingHorizontal="24px"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toTopOf="parent">
+
+        <androidx.appcompat.widget.AppCompatImageView
+            android:id="@+id/iv_news"
+            android:layout_width="42px"
+            android:layout_height="42px"
+            app:layout_constraintBottom_toBottomOf="parent"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintTop_toTopOf="parent"
+            app:srcCompat="@drawable/share_poster_shot_news_ic" />
+
+        <androidx.appcompat.widget.AppCompatTextView
+            android:id="@+id/tv_news"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_marginStart="12px"
+            android:ellipsize="end"
+            android:gravity="start"
+            android:includeFontPadding="false"
+            android:textColor="@color/color_FF466811"
+            android:textSize="22px"
+            app:layout_constrainedWidth="true"
+            app:layout_constraintBottom_toBottomOf="parent"
+            app:layout_constraintEnd_toEndOf="parent"
+            app:layout_constraintHorizontal_bias="0"
+            app:layout_constraintStart_toEndOf="@id/iv_news"
+            app:layout_constraintTop_toTopOf="parent"
+            tools:text="在 11.11 与「用户xxx」进行了一场「网球」比赛" />
+
+    </androidx.constraintlayout.widget.ConstraintLayout>
+
+    <androidx.constraintlayout.widget.ConstraintLayout
+        android:layout_width="686px"
+        android:layout_height="870px"
+        android:layout_marginTop="118px"
+        android:paddingHorizontal="32px"
+        android:paddingTop="25px"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toTopOf="parent">
+
+        <androidx.appcompat.widget.AppCompatTextView
+            android:id="@+id/tv_name"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:ellipsize="end"
+            android:fontFamily="@font/poppins_semibold"
+            android:includeFontPadding="false"
+            android:singleLine="true"
+            android:textColor="@color/color_FF1D2129"
+            android:textSize="36px"
+            app:layout_constrainedWidth="true"
+            app:layout_constraintEnd_toStartOf="@id/v_gender"
+            app:layout_constraintHorizontal_bias="0"
+            app:layout_constraintHorizontal_chainStyle="packed"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintTop_toTopOf="parent"
+            tools:text="Super Beautiful Girl Super Beautiful Girl Super Beautiful Girl" />
+
+        <com.adealink.weparty.module.profile.widget.GenderView
+            android:id="@+id/v_gender"
+            style="@style/CommonGenderView"
+            android:layout_marginEnd="48px"
+            app:layout_constraintBottom_toBottomOf="@id/tv_name"
+            app:layout_constraintEnd_toStartOf="@id/v_barrier_end"
+            app:layout_constraintStart_toEndOf="@id/tv_name"
+            app:layout_constraintTop_toTopOf="@id/tv_name" />
+
+        <androidx.constraintlayout.widget.Barrier
+            android:id="@+id/v_barrier_end"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            app:barrierDirection="start"
+            app:constraint_referenced_ids="iv_evaluate_star" />
+
+        <androidx.appcompat.widget.AppCompatImageView
+            android:id="@+id/iv_evaluate_star"
+            android:layout_width="36px"
+            android:layout_height="36px"
+            app:layout_constraintBottom_toBottomOf="@id/tv_name"
+            app:layout_constraintEnd_toStartOf="@id/tv_evaluate"
+            app:layout_constraintTop_toTopOf="@id/tv_name"
+            app:srcCompat="@drawable/common_evaluate_star_selected_ic" />
+
+        <androidx.appcompat.widget.AppCompatTextView
+            android:id="@+id/tv_evaluate"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:fontFamily="@font/poppins_semibold"
+            android:includeFontPadding="false"
+            android:textColor="@color/color_FF1D2129"
+            android:textSize="36px"
+            app:layout_constraintBottom_toBottomOf="@id/tv_name"
+            app:layout_constraintEnd_toEndOf="parent"
+            app:layout_constraintTop_toTopOf="@id/tv_name"
+            tools:text="4.2" />
+
+        <com.adealink.frame.image.view.NetworkImageView
+            android:id="@+id/iv_photo"
+            android:layout_width="0px"
+            android:layout_height="0px"
+            android:layout_marginTop="18px"
+            app:layout_constraintDimensionRatio="1:1"
+            app:layout_constraintEnd_toEndOf="parent"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintTop_toBottomOf="@id/tv_name"
+            app:roundedCornerRadius="40px" />
+
+        <androidx.appcompat.widget.AppCompatTextView
+            android:id="@+id/tv_location"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:background="@drawable/share_friend_photo_location_bg"
+            android:gravity="center"
+            android:includeFontPadding="false"
+            android:paddingStart="24px"
+            android:paddingEnd="40px"
+            android:textColor="@color/color_FF4E5969"
+            android:textSize="28px"
+            app:layout_constraintBottom_toBottomOf="@id/iv_photo"
+            app:layout_constraintStart_toStartOf="@id/iv_photo"
+            tools:text="Photototjo123ju123l123lk" />
+
+        <androidx.appcompat.widget.AppCompatTextView
+            android:id="@+id/tv_summary"
+            android:layout_width="0px"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="28px"
+            android:gravity="start"
+            android:includeFontPadding="false"
+            android:paddingStart="24px"
+            android:paddingEnd="40px"
+            android:textColor="@color/color_FF4E5969"
+            android:textSize="28px"
+            app:layout_constrainedHeight="true"
+            app:layout_constrainedWidth="true"
+            app:layout_constraintBottom_toBottomOf="parent"
+            app:layout_constraintEnd_toEndOf="@id/iv_photo"
+            app:layout_constraintStart_toStartOf="@id/iv_photo"
+            app:layout_constraintTop_toBottomOf="@id/iv_photo"
+            app:layout_constraintVertical_bias="0"
+            tools:text="Hello brother, multiple seasons of S, online,tiple seasons of S, online," />
+
+    </androidx.constraintlayout.widget.ConstraintLayout>
+
+    <androidx.constraintlayout.widget.ConstraintLayout
+        android:layout_width="686px"
+        android:layout_height="200px"
+        android:layout_marginTop="988px"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toTopOf="parent">
+
+        <androidx.appcompat.widget.AppCompatImageView
+            android:layout_width="86px"
+            android:layout_height="44px"
+            android:layout_marginStart="-20px"
+            android:layout_marginTop="-4px"
+            app:layout_constraintStart_toStartOf="@id/tv_game_title"
+            app:layout_constraintTop_toTopOf="@id/tv_game_title"
+            app:srcCompat="@drawable/share_poster_game_title_bg" />
+
+        <androidx.appcompat.widget.AppCompatTextView
+            android:id="@+id/tv_game_title"
+            android:layout_width="120px"
+            android:layout_height="wrap_content"
+            android:layout_marginStart="12px"
+            android:ellipsize="end"
+            android:fontFamily="@font/poppins_semibold"
+            android:gravity="start"
+            android:includeFontPadding="false"
+            android:text="@string/share_share_poster_game_title"
+            android:textColor="@color/color_FF1D2129"
+            android:textSize="28px"
+            app:layout_constrainedWidth="true"
+            app:layout_constraintBottom_toBottomOf="parent"
+            app:layout_constraintEnd_toEndOf="parent"
+            app:layout_constraintEnd_toStartOf="@id/v_game_1"
+            app:layout_constraintHorizontal_bias="0"
+            app:layout_constraintHorizontal_chainStyle="spread"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintTop_toTopOf="parent" />
+
+        <include
+            android:id="@+id/v_game_1"
+            layout="@layout/layout_share_poster_game_item"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            app:layout_constraintBottom_toBottomOf="parent"
+            app:layout_constraintEnd_toStartOf="@id/v_game_2"
+            app:layout_constraintStart_toEndOf="@id/tv_game_title"
+            app:layout_constraintTop_toTopOf="parent" />
+
+        <include
+            android:id="@+id/v_game_2"
+            layout="@layout/layout_share_poster_game_item"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            app:layout_constraintBottom_toBottomOf="parent"
+            app:layout_constraintEnd_toStartOf="@id/v_game_3"
+            app:layout_constraintStart_toEndOf="@id/v_game_1"
+            app:layout_constraintTop_toTopOf="parent" />
+
+        <include
+            android:id="@+id/v_game_3"
+            layout="@layout/layout_share_poster_game_item"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            app:layout_constraintBottom_toBottomOf="parent"
+            app:layout_constraintEnd_toEndOf="parent"
+            app:layout_constraintStart_toEndOf="@id/v_game_2"
+            app:layout_constraintTop_toTopOf="parent" />
+
+    </androidx.constraintlayout.widget.ConstraintLayout>
+
+    <androidx.constraintlayout.widget.ConstraintLayout
+        android:layout_width="match_parent"
+        android:layout_height="304px"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintStart_toStartOf="parent">
+
+        <androidx.appcompat.widget.AppCompatImageView
+            android:id="@+id/iv_logo"
+            android:layout_width="206px"
+            android:layout_height="60px"
+            app:layout_constraintBottom_toBottomOf="parent"
+            app:layout_constraintEnd_toStartOf="@id/iv_qr_code"
+            app:layout_constraintHorizontal_chainStyle="packed"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintTop_toTopOf="parent"
+            app:srcCompat="@drawable/common_app_logo_ic" />
+
+
+        <com.adealink.frame.image.view.NetworkImageView
+            android:id="@+id/iv_qr_code"
+            android:layout_width="196px"
+            android:layout_height="196px"
+            android:layout_marginStart="75px"
+            app:layout_constraintBottom_toBottomOf="parent"
+            app:layout_constraintEnd_toEndOf="parent"
+            app:layout_constraintStart_toEndOf="@id/iv_logo"
+            app:layout_constraintTop_toTopOf="parent"
+            app:roundedCornerRadius="24px" />
+
+    </androidx.constraintlayout.widget.ConstraintLayout>
+
+</androidx.constraintlayout.widget.ConstraintLayout>

+ 3 - 0
module/share/src/main/res/values/strings.xml

@@ -9,4 +9,7 @@
     <string name="share_common_special_code">特定码</string>
     <string name="share_friend_title">生成你的专属海报</string>
     <string name="share_share_poster">分享海报</string>
+    <string name="share_share_poster_game_title">扫码跟我一起玩</string>
+    <string name="share_save_poster_success">海报已保存到相册</string>
+    <string name="share_save_poster_fail">海报生成失败,请重试</string>
 </resources>