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