From a895ef58396939abd792d1cc2fe6594efa4ffda7 Mon Sep 17 00:00:00 2001
From: zhujie <leon.zhu@cloudroam.com.cn>
Date: 星期三, 26 三月 2025 17:56:14 +0800
Subject: [PATCH] 邀请有礼页面
---
app/src/main/java/com/example/firstapp/entity/InvitationRecord.kt | 6
app/src/main/java/com/example/firstapp/ui/notifications/NotificationsFragment.kt | 4
app/src/main/res/drawable/rounded_corner_image.xml | 5
app/src/main/res/layout/activity_invitation_main.xml | 235 +++++++++++++++++++++++++++++
app/src/main/AndroidManifest.xml | 3
app/src/main/res/drawable/gift_one.png | 0
app/src/main/res/layout/activity_invitation_success.xml | 21 ++
app/src/main/java/com/example/firstapp/adapter/InvitationAdapter.kt | 36 ++++
app/src/main/java/com/example/firstapp/ui/invitation/InvitationActivity.kt | 102 ++++++++++++
app/src/main/java/com/example/firstapp/ui/invitation/LineByLineSmoothScroller.kt | 13 +
app/src/main/res/drawable/avatar.png | 0
11 files changed, 424 insertions(+), 1 deletions(-)
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index f471d9e..ddf2f77 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -111,6 +111,9 @@
android:name=".activity.ContentDetailActivity"
android:theme="@style/Theme.ContentDetail"
android:exported="false" />
+ <activity
+ android:name=".ui.invitation.InvitationActivity"
+ android:exported="false"/>
</application>
diff --git a/app/src/main/java/com/example/firstapp/adapter/InvitationAdapter.kt b/app/src/main/java/com/example/firstapp/adapter/InvitationAdapter.kt
new file mode 100644
index 0000000..b045175
--- /dev/null
+++ b/app/src/main/java/com/example/firstapp/adapter/InvitationAdapter.kt
@@ -0,0 +1,36 @@
+package com.example.firstapp.adapter
+
+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
+
+class InvitationAdapter : RecyclerView.Adapter<InvitationAdapter.ViewHolder>() {
+
+ private var records = emptyList<InvitationRecord>()
+
+ 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)
+ .inflate(R.layout.activity_invitation_success, parent, false)
+ return ViewHolder(view)
+ }
+
+ override fun onBindViewHolder(holder: ViewHolder, position: Int) {
+ val record = records[position]
+ holder.message.text = "${record.userName}邀请好友,${record.reward}"
+ }
+
+ override fun getItemCount() = records.size
+
+ fun submitList(newList: List<InvitationRecord>) {
+ records = newList
+ notifyDataSetChanged()
+ }
+}
\ 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
new file mode 100644
index 0000000..938bac5
--- /dev/null
+++ b/app/src/main/java/com/example/firstapp/entity/InvitationRecord.kt
@@ -0,0 +1,6 @@
+package com.example.firstapp.entity
+
+data class InvitationRecord(
+ val userName: String,
+ val reward: 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
new file mode 100644
index 0000000..51fc5fc
--- /dev/null
+++ b/app/src/main/java/com/example/firstapp/ui/invitation/InvitationActivity.kt
@@ -0,0 +1,102 @@
+package com.example.firstapp.ui.invitation
+
+import android.os.Bundle
+import android.os.Handler
+import android.os.Looper
+import android.util.DisplayMetrics
+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.entity.InvitationRecord
+import java.text.SimpleDateFormat
+import java.util.Locale
+import java.util.concurrent.Executors
+
+class InvitationActivity : AppCompatActivity() {
+
+ private lateinit var recyclerView: RecyclerView
+ private lateinit var adapter: InvitationAdapter
+ private var currentPosition = 0
+ private val handler = Handler(Looper.getMainLooper())
+ private lateinit var scrollRunnable: Runnable
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ setContentView(R.layout.activity_invitation_main)
+
+ setupRecyclerView()
+ loadData()
+ setupAutoScroll()
+ }
+
+ private fun setupRecyclerView() {
+ recyclerView = findViewById(R.id.invitationsuccessRecyclerView)
+ recyclerView.layoutManager = LinearLayoutManager(this).apply {
+ stackFromEnd = false // 从顶部开始布局
+ }
+ adapter = InvitationAdapter()
+ recyclerView.adapter = adapter
+ }
+
+ 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
+
+ override fun calculateSpeedPerPixel(displayMetrics: DisplayMetrics): Float {
+ return 100f / displayMetrics.densityDpi // 控制滚动速度
+ }
+ }
+ smoothScroller.targetPosition = position
+ layoutManager.startSmoothScroll(smoothScroller)
+ }
+
+ private fun startAutoScroll() {
+ handler.postDelayed(scrollRunnable, 2000)
+ }
+
+ private fun stopAutoScroll() {
+ handler.removeCallbacks(scrollRunnable)
+ }
+
+ override fun onPause() {
+ super.onPause()
+ stopAutoScroll()
+ }
+
+ override fun onResume() {
+ super.onResume()
+ startAutoScroll()
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/example/firstapp/ui/invitation/LineByLineSmoothScroller.kt b/app/src/main/java/com/example/firstapp/ui/invitation/LineByLineSmoothScroller.kt
new file mode 100644
index 0000000..d339a03
--- /dev/null
+++ b/app/src/main/java/com/example/firstapp/ui/invitation/LineByLineSmoothScroller.kt
@@ -0,0 +1,13 @@
+import android.content.Context
+import android.util.DisplayMetrics
+import androidx.recyclerview.widget.LinearSmoothScroller
+
+class LineByLineSmoothScroller(context: Context) : LinearSmoothScroller(context) {
+ override fun calculateSpeedPerPixel(displayMetrics: DisplayMetrics): Float {
+ return 100f / displayMetrics.densityDpi // 控制滚动速度
+ }
+
+ override fun getVerticalSnapPreference(): Int {
+ return SNAP_TO_START // 从顶部开始对齐
+ }
+}
\ No newline at end of file
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 455a039..892a16a 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
@@ -19,6 +19,7 @@
import com.example.firstapp.activity.ContentDetailActivity
import com.example.firstapp.database.service.RetrofitClient
import com.example.firstapp.databinding.FragmentNotificationsBinding
+import com.example.firstapp.ui.invitation.InvitationActivity
import com.example.firstapp.ui.reminderOther.ReminderOtherAddActivity2
import com.example.firstapp.ui.reminderOther.ReminderSettingsFragmentOther
import kotlinx.coroutines.launch
@@ -124,7 +125,8 @@
// 分享给好友
binding.shareToFriends.setOnClickListener {
- shareToWechat()
+ val intent = Intent(requireActivity(), InvitationActivity::class.java)
+ startActivity(intent)
}
// 隐私协议
diff --git a/app/src/main/res/drawable/avatar.png b/app/src/main/res/drawable/avatar.png
new file mode 100644
index 0000000..04a43e1
--- /dev/null
+++ b/app/src/main/res/drawable/avatar.png
Binary files differ
diff --git a/app/src/main/res/drawable/gift_one.png b/app/src/main/res/drawable/gift_one.png
new file mode 100644
index 0000000..d6bd848
--- /dev/null
+++ b/app/src/main/res/drawable/gift_one.png
Binary files differ
diff --git a/app/src/main/res/drawable/rounded_corner_image.xml b/app/src/main/res/drawable/rounded_corner_image.xml
new file mode 100644
index 0000000..0f52b53
--- /dev/null
+++ b/app/src/main/res/drawable/rounded_corner_image.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android">
+ <solid android:color="@android:color/transparent" />
+ <corners android:radius="10dp" />
+</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
new file mode 100644
index 0000000..cdc5a91
--- /dev/null
+++ b/app/src/main/res/layout/activity_invitation_main.xml
@@ -0,0 +1,235 @@
+<?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="match_parent"
+ android:orientation="vertical"
+ android:background="#F0F0F0">
+
+ <!-- 标题栏 -->
+ <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>
+
+ <!-- 邀请按钮区域 -->
+ <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_height="wrap_content"
+ android:text="我的邀请记录"
+ android:textSize="16sp"
+ android:paddingBottom="8dp"
+ android:textColor="#333333"/>
+
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="horizontal"
+ android:paddingBottom="8dp">
+
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="Hnnnnne"
+ android:textSize="16sp"
+ android:paddingEnd="8dp"
+ android:textColor="#333333"/>
+
+ <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>
+
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="horizontal">
+
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="Hnnnnne"
+ android:textSize="16sp"
+ android:paddingEnd="8dp"
+ android:textColor="#333333"/>
+
+ <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"/>
+ </LinearLayout>
+ </LinearLayout>
+
+</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
new file mode 100644
index 0000000..7a235b4
--- /dev/null
+++ b/app/src/main/res/layout/activity_invitation_success.xml
@@ -0,0 +1,21 @@
+<?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:orientation="horizontal"
+ android:paddingVertical="16dp">
+
+ <ImageView
+ android:id="@+id/avatar"
+ android:layout_width="40dp"
+ android:layout_height="40dp"
+ android:src="@drawable/avatar"/>
+
+ <TextView
+ android:id="@+id/message"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:textSize="16sp"
+ android:paddingStart="8dp"
+ android:textColor="#333333"/>
+</LinearLayout>
\ No newline at end of file
--
Gitblit v1.9.3