From db2e408f6c2eddc363ed76e0f5fd1e59a02aa175 Mon Sep 17 00:00:00 2001 From: zhujie <leon.zhu@cloudroam.com.cn> Date: 星期四, 03 四月 2025 09:12:37 +0800 Subject: [PATCH] 邀请有礼 --- app/src/main/java/com/example/firstapp/entity/InvitationRecord.kt | 3 app/src/main/res/drawable/table_border.xml | 7 app/src/main/res/values/strings.xml | 3 app/src/main/res/layout/activity_invitation_main.xml | 446 ++++++++++++++------------- app/src/main/res/layout/activity_invitation_success.xml | 24 app/src/main/res/layout/activity_invitation_record.xml | 35 ++ app/src/main/java/com/example/firstapp/adapter/InvitationRecordAdapter.kt | 39 ++ app/src/main/java/com/example/firstapp/ui/invitation/InvitationActivity.kt | 334 +++++++++++++++++--- app/src/main/res/drawable/cell_border.xml | 15 app/src/main/java/com/example/firstapp/ui/notifications/NotificationsFragment.kt | 6 app/src/main/java/com/example/firstapp/adapter/InvitationAdapter.kt | 33 +- app/build.gradle | 4 app/src/main/res/drawable/bg_gradient.xml | 8 13 files changed, 658 insertions(+), 299 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 3257afb..88aea3e 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -285,5 +285,9 @@ implementation 'com.google.android.material:material:1.4.0' + implementation 'de.hdodenhof:circleimageview:3.1.0' + + implementation 'com.github.castorflex:SmoothProgressBar:1.1.0' + } \ No newline at end of file diff --git a/app/src/main/java/com/example/firstapp/adapter/InvitationAdapter.kt b/app/src/main/java/com/example/firstapp/adapter/InvitationAdapter.kt index b045175..02c3744 100644 --- a/app/src/main/java/com/example/firstapp/adapter/InvitationAdapter.kt +++ b/app/src/main/java/com/example/firstapp/adapter/InvitationAdapter.kt @@ -1,5 +1,7 @@ package com.example.firstapp.adapter +import android.content.Context +import android.text.TextUtils import android.view.LayoutInflater import android.view.View import android.view.ViewGroup @@ -7,30 +9,29 @@ import androidx.recyclerview.widget.RecyclerView import com.example.firstapp.R import com.example.firstapp.entity.InvitationRecord +import com.example.firstapp.utils.Log -class InvitationAdapter : RecyclerView.Adapter<InvitationAdapter.ViewHolder>() { - private var records = emptyList<InvitationRecord>() +class InvitationAdapter( + private val context: Context, + private val data: List<InvitationRecord>, +) : RecyclerView.Adapter<InvitationAdapter.InvitationViewHolder>() { - class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { - val message: TextView = itemView.findViewById(R.id.message) - } - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { - val view = LayoutInflater.from(parent.context) + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): InvitationViewHolder { + val view = LayoutInflater.from(context) .inflate(R.layout.activity_invitation_success, parent, false) - return ViewHolder(view) - } - override fun onBindViewHolder(holder: ViewHolder, position: Int) { - val record = records[position] + return InvitationViewHolder(view) + } + override fun onBindViewHolder(holder: InvitationViewHolder, position: Int) { + val record = data[position % data.size] // 使用取模实现循环 holder.message.text = "${record.userName}邀请好友,${record.reward}" + } - override fun getItemCount() = records.size + override fun getItemCount() = if (data.isEmpty()) 0 else Int.MAX_VALUE - fun submitList(newList: List<InvitationRecord>) { - records = newList - notifyDataSetChanged() + class InvitationViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + val message: TextView = itemView.findViewById(R.id.message) } } \ No newline at end of file diff --git a/app/src/main/java/com/example/firstapp/adapter/InvitationRecordAdapter.kt b/app/src/main/java/com/example/firstapp/adapter/InvitationRecordAdapter.kt new file mode 100644 index 0000000..1d8e5f1 --- /dev/null +++ b/app/src/main/java/com/example/firstapp/adapter/InvitationRecordAdapter.kt @@ -0,0 +1,39 @@ +package com.example.firstapp.adapter + +import android.content.Context +import android.text.TextUtils +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.example.firstapp.R +import com.example.firstapp.entity.InvitationRecord +import com.example.firstapp.utils.Log + + +class InvitationRecordAdapter( + private val context: Context, + private val data: List<InvitationRecord>, +) : RecyclerView.Adapter<InvitationRecordAdapter.InvitationRecordViewHolder>() { + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): InvitationRecordViewHolder { + val view = LayoutInflater.from(context) + .inflate(R.layout.activity_invitation_record, parent, false) + + return InvitationRecordViewHolder(view) + } + override fun onBindViewHolder(holder: InvitationRecordViewHolder, position: Int) { + val record = data[position % data.size] // 使用取模实现循环 + holder.recordmessage.text = "${record.userName}" + holder.recordstatus.text = "${record.status}" + + } + + override fun getItemCount() = if (data.isEmpty()) 0 else Int.MAX_VALUE + + class InvitationRecordViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + val recordmessage: TextView = itemView.findViewById(R.id.recordmessage) + val recordstatus: TextView = itemView.findViewById(R.id.recordstatus) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/firstapp/entity/InvitationRecord.kt b/app/src/main/java/com/example/firstapp/entity/InvitationRecord.kt index 938bac5..d131854 100644 --- a/app/src/main/java/com/example/firstapp/entity/InvitationRecord.kt +++ b/app/src/main/java/com/example/firstapp/entity/InvitationRecord.kt @@ -2,5 +2,6 @@ data class InvitationRecord( val userName: String, - val reward: String + val reward: String, + val status: String ) \ No newline at end of file diff --git a/app/src/main/java/com/example/firstapp/ui/invitation/InvitationActivity.kt b/app/src/main/java/com/example/firstapp/ui/invitation/InvitationActivity.kt index 51fc5fc..55d957f 100644 --- a/app/src/main/java/com/example/firstapp/ui/invitation/InvitationActivity.kt +++ b/app/src/main/java/com/example/firstapp/ui/invitation/InvitationActivity.kt @@ -1,98 +1,318 @@ package com.example.firstapp.ui.invitation +import android.content.Context import android.os.Bundle import android.os.Handler import android.os.Looper -import android.util.DisplayMetrics +import android.text.Html +import android.util.TypedValue +import android.view.View +import android.widget.TextView import androidx.appcompat.app.AppCompatActivity import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.LinearSmoothScroller import androidx.recyclerview.widget.RecyclerView import com.example.firstapp.R import com.example.firstapp.adapter.InvitationAdapter +import com.example.firstapp.adapter.InvitationRecordAdapter import com.example.firstapp.entity.InvitationRecord -import java.text.SimpleDateFormat -import java.util.Locale -import java.util.concurrent.Executors +import kotlin.math.abs class InvitationActivity : AppCompatActivity() { - private lateinit var recyclerView: RecyclerView + private lateinit var recyclerSuccessView: RecyclerView + private lateinit var recyclerRecordView: RecyclerView private lateinit var adapter: InvitationAdapter - private var currentPosition = 0 + private lateinit var recordadapter: InvitationRecordAdapter + private val data = mutableListOf<InvitationRecord>() + private val recorddata = mutableListOf<InvitationRecord>() private val handler = Handler(Looper.getMainLooper()) - private lateinit var scrollRunnable: Runnable + private val scrollInterval = 3000L + private var currentScrollPosition = 0 + private var currentRecordScrollPosition = 0 + private var itemHeight = 0 // 动态存储item高度 override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_invitation_main) - setupRecyclerView() + // 初始化视图 + initViews() + + //初始化Adapter + initSuccessAdapter() + + initRecorddapter() + + //加载数据 loadData() - setupAutoScroll() - } - private fun setupRecyclerView() { - recyclerView = findViewById(R.id.invitationsuccessRecyclerView) - recyclerView.layoutManager = LinearLayoutManager(this).apply { - stackFromEnd = false // 从顶部开始布局 - } - adapter = InvitationAdapter() - recyclerView.adapter = adapter - } + loadRecordData() - private fun loadData() { - val mockData = listOf( - InvitationRecord("H****e", "获得了3天会员"), - InvitationRecord("U****r", "获得了7天会员"), - InvitationRecord("A****e", "获得了免广告特权"), - InvitationRecord("B****d", "获得了3天会员"), - InvitationRecord("C****o", "获得了7天会员") - ) - adapter.submitList(mockData) - } - - private fun setupAutoScroll() { - scrollRunnable = object : Runnable { - override fun run() { - if (currentPosition < adapter.itemCount - 1) { - currentPosition++ - smoothScrollToPosition(currentPosition) - } else { - // 滚动到底部后回到顶部 - currentPosition = 0 - recyclerView.scrollToPosition(0) - } - handler.postDelayed(this, 2000) - } - } + //启动轮播 startAutoScroll() } - private fun smoothScrollToPosition(position: Int) { - val layoutManager = recyclerView.layoutManager as LinearLayoutManager - val smoothScroller = object : LinearSmoothScroller(this) { - override fun getVerticalSnapPreference(): Int = SNAP_TO_START + private fun initViews() { + findViewById<TextView>(R.id.tv_notic).apply { + text = Html.fromHtml(getString(R.string.invite_reward_text), Html.FROM_HTML_MODE_LEGACY) + } + recyclerSuccessView = findViewById(R.id.invitationsuccessRecyclerView) + addSuccessListener() - override fun calculateSpeedPerPixel(displayMetrics: DisplayMetrics): Float { - return 100f / displayMetrics.densityDpi // 控制滚动速度 + recyclerRecordView = findViewById(R.id.invitationrecordRecyclerView) + addRecordListener() + } + + private fun addSuccessListener(){ + recyclerSuccessView.viewTreeObserver.addOnGlobalLayoutListener { + if (recyclerSuccessView.childCount > 0) { + // 计算预期高度(60dp转px) + val expectedHeight = dpToPx(60f) + if(itemHeight!= expectedHeight){ + // 修正所有item的高度 + for (i in 0 until recyclerSuccessView.childCount) { + recyclerSuccessView.getChildAt(i).layoutParams.height = expectedHeight + } + // 请求重新布局 + recyclerSuccessView.requestLayout() + itemHeight = expectedHeight + } } } - smoothScroller.targetPosition = position - layoutManager.startSmoothScroll(smoothScroller) + recyclerSuccessView.layoutManager = object : LinearLayoutManager(this@InvitationActivity) { + override fun onMeasure( + recycler: RecyclerView.Recycler, state: RecyclerView.State, + widthSpec: Int, heightSpec: Int + ) { + if (itemHeight > 0) { + // 使用实际测量的高度 + setMeasuredDimension( + View.resolveSize(widthSpec, width), + itemHeight + ) + } else { + // 默认高度60dp + val defaultHeight = TypedValue.applyDimension( + TypedValue.COMPLEX_UNIT_DIP, 60f, + resources.displayMetrics + ).toInt() + setMeasuredDimension( + View.resolveSize(widthSpec, width), + defaultHeight + ) + } + } + } + } + + private fun addRecordListener(){ + recyclerRecordView.viewTreeObserver.addOnGlobalLayoutListener { + if (recyclerSuccessView.childCount > 0) { + // 计算预期高度(60dp转px) + val expectedHeight = dpToPx(60f) + if(itemHeight!= expectedHeight){ + // 修正所有item的高度 + for (i in 0 until recyclerSuccessView.childCount) { + recyclerSuccessView.getChildAt(i).layoutParams.height = expectedHeight + } + // 请求重新布局 + recyclerSuccessView.requestLayout() + itemHeight = expectedHeight + } + } + } + recyclerRecordView.layoutManager = object : LinearLayoutManager(this@InvitationActivity) { + override fun onMeasure( + recycler: RecyclerView.Recycler, state: RecyclerView.State, + widthSpec: Int, heightSpec: Int + ) { + if (itemHeight > 0) { + // 使用实际测量的高度 + setMeasuredDimension( + View.resolveSize(widthSpec, width), + itemHeight + ) + } else { + // 默认高度60dp + val defaultHeight = TypedValue.applyDimension( + TypedValue.COMPLEX_UNIT_DIP, 60f, + resources.displayMetrics + ).toInt() + setMeasuredDimension( + View.resolveSize(widthSpec, width), + defaultHeight + ) + } + } + } + } + + private fun initSuccessAdapter() { + adapter = InvitationAdapter(this, data).apply { + registerAdapterDataObserver(object : RecyclerView.AdapterDataObserver() { + override fun onItemRangeInserted(positionStart: Int, itemCount: Int) { + // 数据插入时检查高度 + recyclerSuccessView.post { + if (recyclerSuccessView.childCount > 0) { + itemHeight = recyclerSuccessView.getChildAt(0).height + } + } + } + }) + } + recyclerSuccessView.adapter = adapter + } + + private fun initRecorddapter() { + recordadapter = InvitationRecordAdapter(this, recorddata).apply { + registerAdapterDataObserver(object : RecyclerView.AdapterDataObserver() { + override fun onItemRangeInserted(positionStart: Int, itemCount: Int) { + // 数据插入时检查高度 + recyclerRecordView.post { + if (recyclerRecordView.childCount > 0) { + itemHeight = recyclerRecordView.getChildAt(0).height + } + } + } + }) + } + recyclerRecordView.adapter = recordadapter + } + + private fun loadData() { + data.clear() + data.addAll( + listOf( + InvitationRecord("H****e", "获得了1天会员","已注册"), + InvitationRecord("U****r", "获得了2天会员","已注册"), + InvitationRecord("A****e", "获得了免广告特权","已注册"), + InvitationRecord("B****e", "获得了3天会员","已注册"), + InvitationRecord("C****o", "获得了4天会员","已注册") + ) + ) + adapter.notifyDataSetChanged() + } + + private fun loadRecordData() { + recorddata.clear() + recorddata.addAll( + listOf( + InvitationRecord("M****e", "","未注册"), + InvitationRecord("Q****r", "","已注册"), + InvitationRecord("W****e", "","未注册"), + InvitationRecord("E****e", "","未注册"), + InvitationRecord("R****o", "","已注册") + ) + ) + recordadapter.notifyDataSetChanged() + } + + private val scrollRunnable = object : Runnable { + override fun run() { + if (data.isEmpty() || itemHeight <= 0) { + handler.postDelayed(this, scrollInterval) + return + } + + // 使用取模运算确保位置在有效范围内 + currentScrollPosition++ + currentRecordScrollPosition++ + + // 创建自定义平滑滚动器 + val smoothScroller = object : LinearSmoothScroller(this@InvitationActivity) { + override fun getVerticalSnapPreference(): Int = SNAP_TO_START + + override fun calculateDyToMakeVisible(view: View, snapPreference: Int): Int { + // 计算需要滚动的距离,确保完整显示下一个item + val top = view.top + val height = view.height + return when { + snapPreference == SNAP_TO_START -> -top + snapPreference == SNAP_TO_END -> -(top - (recyclerSuccessView.height - height)) + else -> -(top - (recyclerSuccessView.height / 2 - height / 2)) + } + } + + override fun calculateTimeForScrolling(dx: Int): Int { + // 根据滚动距离动态计算时间,保持匀速 + return maxOf((500f * abs(dx) / itemHeight).toInt(), 200) + } + }.apply { + targetPosition = currentScrollPosition + } + + val smoothRecordScroller = object : LinearSmoothScroller(this@InvitationActivity) { + override fun getVerticalSnapPreference(): Int = SNAP_TO_START + + override fun calculateDyToMakeVisible(view: View, snapPreference: Int): Int { + // 计算需要滚动的距离,确保完整显示下一个item + val top = view.top + val height = view.height + return when { + snapPreference == SNAP_TO_START -> -top + snapPreference == SNAP_TO_END -> -(top - (recyclerRecordView.height - height)) + else -> -(top - (recyclerRecordView.height / 2 - height / 2)) + } + } + + override fun calculateTimeForScrolling(dx: Int): Int { + // 根据滚动距离动态计算时间,保持匀速 + return maxOf((500f * abs(dx) / itemHeight).toInt(), 200) + } + }.apply { + targetPosition = currentRecordScrollPosition + } + + // 启动平滑滚动 + recyclerSuccessView.layoutManager?.startSmoothScroll(smoothScroller) + + recyclerRecordView.layoutManager?.startSmoothScroll(smoothRecordScroller) + + // 更智能的边界检测 + (recyclerSuccessView.layoutManager as? LinearLayoutManager)?.let { lm -> + val lastVisible = lm.findLastVisibleItemPosition() + val totalItems = adapter.itemCount + + // 当接近"虚拟列表"末尾时,跳转到中间位置 + if (lastVisible >= totalItems - 3) { + val jumpPosition = (totalItems / 2) * (Int.MAX_VALUE / totalItems) + currentScrollPosition = jumpPosition + recyclerSuccessView.scrollToPosition(jumpPosition) + } + } + + (recyclerRecordView.layoutManager as? LinearLayoutManager)?.let { lm -> + val lastVisible = lm.findLastVisibleItemPosition() + val totalItems = recordadapter.itemCount + + // 当接近"虚拟列表"末尾时,跳转到中间位置 + if (lastVisible >= totalItems - 3) { + val jumpPosition = (totalItems / 2) * (Int.MAX_VALUE / totalItems) + currentRecordScrollPosition = jumpPosition + recyclerRecordView.scrollToPosition(jumpPosition) + } + } + + handler.postDelayed(this, scrollInterval) + } + } + + private fun pxToDp(px: Int, context: Context): Int { + return (px / (context.resources.displayMetrics.density)).toInt() + } + private fun dpToPx(dp: Float): Int { + return (dp * resources.displayMetrics.density).toInt() } private fun startAutoScroll() { - handler.postDelayed(scrollRunnable, 2000) - } - - private fun stopAutoScroll() { - handler.removeCallbacks(scrollRunnable) + handler.removeCallbacks(scrollRunnable) // 先移除之前的回调 + handler.postDelayed(scrollRunnable, scrollInterval) } override fun onPause() { + handler.removeCallbacks(scrollRunnable) super.onPause() - stopAutoScroll() } override fun onResume() { diff --git a/app/src/main/java/com/example/firstapp/ui/notifications/NotificationsFragment.kt b/app/src/main/java/com/example/firstapp/ui/notifications/NotificationsFragment.kt index 4d79729..38a6f08 100644 --- a/app/src/main/java/com/example/firstapp/ui/notifications/NotificationsFragment.kt +++ b/app/src/main/java/com/example/firstapp/ui/notifications/NotificationsFragment.kt @@ -31,7 +31,9 @@ import com.google.android.material.snackbar.Snackbar import kotlinx.coroutines.launch import com.bumptech.glide.Glide +import com.example.firstapp.MainActivity import com.example.firstapp.database.response.UserInfo +import com.example.firstapp.ui.invitation.InvitationActivity class NotificationsFragment : Fragment() { @@ -176,7 +178,9 @@ // 好友邀请 binding.layoutInvite.setOnClickListener { - shareToWechat() + // 跳转到邀请活动页面 + val intent = Intent(requireActivity(), InvitationActivity::class.java) + startActivity(intent) } // AI助手 diff --git a/app/src/main/res/drawable/bg_gradient.xml b/app/src/main/res/drawable/bg_gradient.xml new file mode 100644 index 0000000..c5b2beb --- /dev/null +++ b/app/src/main/res/drawable/bg_gradient.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8"?> +<shape xmlns:android="http://schemas.android.com/apk/res/android"> + <gradient + android:startColor="#000000" + android:endColor="#888888" + android:angle="270" + android:type="linear"/> +</shape> \ No newline at end of file diff --git a/app/src/main/res/drawable/cell_border.xml b/app/src/main/res/drawable/cell_border.xml new file mode 100644 index 0000000..186300c --- /dev/null +++ b/app/src/main/res/drawable/cell_border.xml @@ -0,0 +1,15 @@ +<?xml version="1.0" encoding="utf-8"?> +<layer-list xmlns:android="http://schemas.android.com/apk/res/android"> + <item> + <shape> + <solid android:color="#CCCCCC" /> + <size android:height="1dp" /> + </shape> + </item> + <item android:right="1dp"> + <shape> + <solid android:color="#CCCCCC" /> + <size android:width="1dp" /> + </shape> + </item> +</layer-list> \ No newline at end of file diff --git a/app/src/main/res/drawable/table_border.xml b/app/src/main/res/drawable/table_border.xml new file mode 100644 index 0000000..af40445 --- /dev/null +++ b/app/src/main/res/drawable/table_border.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8"?> +<shape xmlns:android="http://schemas.android.com/apk/res/android"> + <stroke + android:width="1dp" + android:color="#CCCCCC" /> + <solid android:color="#FFFFFF" /> +</shape> \ No newline at end of file diff --git a/app/src/main/res/layout/activity_invitation_main.xml b/app/src/main/res/layout/activity_invitation_main.xml index cdc5a91..e92d712 100644 --- a/app/src/main/res/layout/activity_invitation_main.xml +++ b/app/src/main/res/layout/activity_invitation_main.xml @@ -1,235 +1,253 @@ <?xml version="1.0" encoding="utf-8"?> -<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" +<ScrollView xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent" - android:orientation="vertical" - android:background="#F0F0F0"> + android:background="#F0F0F0" + android:fillViewport="true"> - <!-- 标题栏 --> - <TextView - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:text="邀请有礼" - android:textSize="20sp" - android:gravity="center" - android:padding="16dp" - android:textColor="#333333"/> - - <!-- 横幅广告区域 --> - <ImageView - android:layout_width="match_parent" - android:layout_height="200dp" - android:src="@drawable/gift_one" - android:scaleType="fitXY" - android:layout_marginBottom="16dp" - android:background="@drawable/rounded_corner_image" - android:padding="1dp" /> - - <!-- 邀请成功提示区域 --> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" - android:orientation="vertical" - android:background="#FFFFFF" - android:layout_marginBottom="16dp"> - <androidx.recyclerview.widget.RecyclerView - android:id="@+id/invitationsuccessRecyclerView" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:maxHeight="100dp" - android:paddingStart="16dp" - android:paddingEnd="16dp" - android:paddingBottom="16dp" - android:clipToPadding="false" - android:overScrollMode="never"/> - </LinearLayout> + android:orientation="vertical"> - <!-- 邀请按钮区域 --> - <Button - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:text="立即邀请好友" - android:backgroundTint="#FF0000" - android:textColor="#FFFFFF" - android:padding="16dp" - android:textSize="16sp" - android:layout_marginBottom="16dp"/> - - <!-- 邀请任务表格区域 --> - <TableLayout - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:padding="16dp" - android:background="#FFFFFF" - android:layout_marginBottom="16dp"> - - <TableRow> - <TextView - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:text="邀请人数" - android:textSize="16sp" - android:padding="8dp" - android:textColor="#333333"/> - - <TextView - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:text="邀请奖励" - android:textSize="16sp" - android:padding="8dp" - android:textColor="#333333"/> - - <TextView - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:text="被邀请人奖励" - android:textSize="16sp" - android:padding="8dp" - android:textColor="#333333"/> - </TableRow> - - <TableRow> - <TextView - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:text="1人" - android:textSize="16sp" - android:padding="8dp" - android:textColor="#333333"/> - - <TextView - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:text="3天会员" - android:textSize="16sp" - android:padding="8dp" - android:textColor="#333333"/> - - <TextView - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:text="1天会员" - android:textSize="16sp" - android:padding="8dp" - android:textColor="#333333"/> - </TableRow> - - <TableRow> - <TextView - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:text="3人" - android:textSize="16sp" - android:padding="8dp" - android:textColor="#333333"/> - - <TextView - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:text="免广告特权 (7天)" - android:textSize="16sp" - android:padding="8dp" - android:textColor="#333333"/> - - <TextView - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:text="1天会员" - android:textSize="16sp" - android:padding="8dp" - android:textColor="#333333"/> - </TableRow> - - <TableRow> - <TextView - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:text="5人" - android:textSize="16sp" - android:padding="8dp" - android:textColor="#333333"/> - - <TextView - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:text="7天会员" - android:textSize="16sp" - android:padding="8dp" - android:textColor="#333333"/> - - <TextView - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:text="1天会员" - android:textSize="16sp" - android:padding="8dp" - android:textColor="#333333"/> - </TableRow> - </TableLayout> - - <!-- 邀请记录区域 --> - <LinearLayout - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:orientation="vertical" - android:padding="16dp" - android:background="#FFFFFF"> - + <!-- 标题栏 --> <TextView - android:layout_width="wrap_content" + android:layout_width="match_parent" android:layout_height="wrap_content" - android:text="我的邀请记录" - android:textSize="16sp" - android:paddingBottom="8dp" - android:textColor="#333333"/> + android:gravity="center" + android:padding="16dp" + android:text="邀请有礼" + android:textColor="#333333" + android:textSize="13sp" /> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" - android:orientation="horizontal" - android:paddingBottom="8dp"> + android:background="@drawable/bg_gradient" + android:orientation="vertical"> - <TextView - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:text="Hnnnnne" - android:textSize="16sp" - android:paddingEnd="8dp" - android:textColor="#333333"/> + <LinearLayout + android:layout_width="match_parent" + android:layout_height="match_parent" + android:layout_marginHorizontal="11dp" + android:orientation="vertical"> - <Button - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:text="待注册" - android:background="#CCCCCC" - android:textColor="#000000" - android:padding="8dp" - android:textSize="14sp"/> - </LinearLayout> + <!-- 提示烂 --> + <TextView + android:id="@+id/tv_notic" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:gravity="center" + android:padding="16dp" + android:textColor="#FFFFFF" + android:textSize="15sp" /> - <LinearLayout - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:orientation="horizontal"> + <!-- 横幅广告区域 --> + <androidx.cardview.widget.CardView + android:layout_width="match_parent" + android:layout_height="160dp" + android:layout_marginBottom="16dp" + app:cardCornerRadius="13dp" + app:cardPreventCornerOverlap="true"> - <TextView - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:text="Hnnnnne" - android:textSize="16sp" - android:paddingEnd="8dp" - android:textColor="#333333"/> + <ImageView + android:layout_width="match_parent" + android:layout_height="match_parent" + android:scaleType="centerCrop" + android:src="@drawable/gift_one" /> + </androidx.cardview.widget.CardView> - <Button - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:text="已注册" - android:background="#008800" - android:textColor="#FFFFFF" - android:padding="8dp" - android:textSize="14sp"/> + <!-- 邀请成功提示区域 --> + <androidx.cardview.widget.CardView + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_marginBottom="20dp" + app:cardCornerRadius="8dp"> + + <androidx.recyclerview.widget.RecyclerView + android:id="@+id/invitationsuccessRecyclerView" + android:layout_width="match_parent" + android:layout_height="60dp" + android:nestedScrollingEnabled="false" + android:overScrollMode="never" /> + </androidx.cardview.widget.CardView> + + <!-- 邀请按钮区域 --> + <Button + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_marginBottom="26dp" + android:backgroundTint="#FF0000" + android:insetTop="0dp" + android:insetBottom="0dp" + android:padding="12dp" + android:text="立即邀请好友" + android:textColor="#FFFFFF" + android:textSize="16sp" + app:cornerRadius="10dp" /> + + <!-- 邀请任务表格区域 --> + <androidx.cardview.widget.CardView + android:layout_width="match_parent" + android:layout_height="match_parent" + android:layout_marginBottom="3dp" + app:cardCornerRadius="6dp" + app:cardPreventCornerOverlap="true"> + + <TableLayout + android:id="@+id/tableLayout" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:background="@drawable/table_border" + android:shrinkColumns="*" + android:stretchColumns="*"> + + <TableRow> + + <TextView + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:padding="6dp" + android:text="邀请人数" + android:textAlignment="center" + android:textColor="#333333" + android:textSize="12sp" /> + + <TextView + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:padding="6dp" + android:text="邀请奖励" + android:textAlignment="center" + android:textColor="#333333" + android:textSize="12sp" /> + + <TextView + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:padding="6dp" + android:text="被邀请人奖励" + android:textAlignment="center" + android:textColor="#333333" + android:textSize="12sp" /> + </TableRow> + + <TableRow> + + <TextView + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:padding="6dp" + android:text="1人" + android:textAlignment="center" + android:textColor="#333333" + android:textSize="12sp" /> + + <TextView + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:padding="6dp" + android:text="3天会员" + android:textAlignment="center" + android:textColor="#333333" + android:textSize="12sp" /> + + <TextView + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:padding="6dp" + android:text="1天会员" + android:textAlignment="center" + android:textColor="#333333" + android:textSize="12sp" /> + </TableRow> + + <TableRow> + + <TextView + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:padding="6dp" + android:text="3人" + android:textAlignment="center" + android:textColor="#333333" + android:textSize="12sp" /> + + <TextView + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:padding="6dp" + android:text="免广告特权 (7天)" + android:textAlignment="center" + android:textColor="#333333" + android:textSize="12sp" /> + + <TextView + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:padding="6dp" + android:text="1天会员" + android:textAlignment="center" + android:textColor="#333333" + android:textSize="12sp" /> + </TableRow> + + <TableRow> + + <TextView + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:padding="6dp" + android:text="5人" + android:textAlignment="center" + android:textColor="#333333" + android:textSize="12sp" /> + + <TextView + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:padding="6dp" + android:text="7天会员" + android:textAlignment="center" + android:textColor="#333333" + android:textSize="12sp" /> + + <TextView + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:padding="6dp" + android:text="1天会员" + android:textAlignment="center" + android:textColor="#333333" + android:textSize="12sp" /> + </TableRow> + </TableLayout> + + + </androidx.cardview.widget.CardView> + + <!-- 邀请记录区域 --> + <androidx.cardview.widget.CardView + android:layout_width="match_parent" + android:layout_height="match_parent" + android:layout_marginBottom="20dp" + app:cardCornerRadius="6dp" + app:cardPreventCornerOverlap="true"> + <androidx.recyclerview.widget.RecyclerView + android:id="@+id/invitationrecordRecyclerView" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:nestedScrollingEnabled="false" + android:overScrollMode="never" /> + </androidx.cardview.widget.CardView> + + <!-- 添加一个权重为1的View,用于填充剩余空间 --> + <View + android:layout_width="match_parent" + android:layout_height="0dp" + android:layout_weight="1" /> + </LinearLayout> </LinearLayout> </LinearLayout> - -</LinearLayout> \ No newline at end of file +</ScrollView> \ No newline at end of file diff --git a/app/src/main/res/layout/activity_invitation_record.xml b/app/src/main/res/layout/activity_invitation_record.xml new file mode 100644 index 0000000..dff7571 --- /dev/null +++ b/app/src/main/res/layout/activity_invitation_record.xml @@ -0,0 +1,35 @@ +<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" + android:layout_width="match_parent" + android:layout_height="60dp" + android:minHeight="60dp" + android:gravity="center_vertical" + android:orientation="horizontal" + android:padding="8dp"> + + <de.hdodenhof.circleimageview.CircleImageView + android:id="@+id/avatar" + android:layout_width="40dp" + android:layout_height="40dp" + android:src="@drawable/avatar" + android:paddingLeft="10dp" /> + + <TextView + android:id="@+id/recordmessage" + android:layout_width="260dp" + android:layout_height="60dp" + android:layout_marginStart="12dp" + android:paddingTop="20dp" + android:textAlignment="center" + android:textColor="#333333" + android:textSize="14sp" /> + + <TextView + android:id="@+id/recordstatus" + android:layout_width="match_parent" + android:layout_height="60dp" + android:layout_marginStart="12dp" + android:textColor="#333333" + android:textAlignment="center" + android:paddingTop="20dp" + android:textSize="14sp" /> +</LinearLayout> \ No newline at end of file diff --git a/app/src/main/res/layout/activity_invitation_success.xml b/app/src/main/res/layout/activity_invitation_success.xml index 7a235b4..d939b17 100644 --- a/app/src/main/res/layout/activity_invitation_success.xml +++ b/app/src/main/res/layout/activity_invitation_success.xml @@ -1,21 +1,25 @@ -<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" - android:layout_height="wrap_content" + android:layout_height="60dp" + android:minHeight="60dp" + android:gravity="center_vertical" android:orientation="horizontal" - android:paddingVertical="16dp"> + android:padding="8dp"> - <ImageView + <de.hdodenhof.circleimageview.CircleImageView android:id="@+id/avatar" android:layout_width="40dp" android:layout_height="40dp" - android:src="@drawable/avatar"/> + android:src="@drawable/avatar" + android:paddingLeft="10dp" /> <TextView android:id="@+id/message" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:textSize="16sp" - android:paddingStart="8dp" - android:textColor="#333333"/> + android:layout_width="match_parent" + android:layout_height="60dp" + android:layout_marginStart="12dp" + android:textColor="#333333" + android:textAlignment="center" + android:paddingTop="20dp" + android:textSize="14sp" /> </LinearLayout> \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index f507e55..d4e14b0 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -91,5 +91,8 @@ vestibulum. Fusce dictum libero quis erat maximus, vitae volutpat diam dignissim. </string> + <string name="invite_reward_text"><![CDATA[ + 每邀请1位新用户<font color="#FF0000"><b><i><u>可得</u></i></b></font> +]]></string> </resources> \ No newline at end of file -- Gitblit v1.9.3