Kotlin高仿微信-项目实践58篇详细讲解了各个功能点,包括:注册、登录、主页、单聊(文本、表情、语音、图片、小视频、视频通话、语音通话、红包、转账)、群聊、个人信息、朋友圈、支付服务、扫一扫、搜索好友、添加好友、开通VIP等众多功能。
Kotlin高仿微信-项目实践58篇,点击查看详情
效果图:
实现代码:
<?xml version="1.0" encoding="utf-8"?> <layout> <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_FFD700"> <include layout="@layout/wc_base_top_title" /> <androidx.constraintlayout.widget.ConstraintLayout android:id="@+id/qrcode_receive_layout" android:layout_width="match_parent" android:layout_height="400dp" android:layout_marginHorizontal="12dp" android:layout_marginVertical="20dp" android:background="#FFFFFF" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/base_top_root_layout"> <ImageView android:id="@+id/qrcode_receive_qrcode" android:layout_width="200dp" android:layout_height="200dp" android:layout_marginTop="12dp" android:src="@drawable/ic_launcher" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/qrcode_receive_balance" /> <LinearLayout android:id="@+id/qrcode_receive_from_divide" android:layout_width="match_parent" android:layout_height="0.5dp" android:layout_marginHorizontal="12dp" android:layout_marginTop="8dp" android:background="@color/gray" android:orientation="horizontal" android:visibility="gone" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/qrcode_receive_set_amount" /> <LinearLayout android:id="@+id/qrcode_receive_from_layout" android:layout_width="match_parent" android:layout_height="40dp" android:layout_marginHorizontal="12dp" android:layout_marginTop="12dp" android:orientation="horizontal" android:visibility="gone" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/qrcode_receive_set_amount"> <androidx.appcompat.widget.AppCompatImageView android:id="@+id/qrcode_receive_from_avatar" android:layout_width="30dp" android:layout_height="30dp" android:layout_gravity="center_vertical" android:src="@drawable/ic_launcher" /> <androidx.appcompat.widget.AppCompatTextView android:id="@+id/qrcode_receive_from_name" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:layout_marginLeft="12dp" android:text="名称" android:textColor="@color/black" /> <androidx.appcompat.widget.AppCompatTextView android:id="@+id/qrcode_receive_from_balance" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="center_vertical|right" android:layout_marginRight="12dp" android:gravity="right" android:text="金额" android:textColor="@color/gray" /> </LinearLayout> <TextView android:id="@+id/qrcode_receive_tip" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="10dp" android:text="二维码收款" android:textColor="#FFD700" android:textSize="16sp" android:textStyle="bold" app:layout_constraintBottom_toBottomOf="@+id/qrcode_receive_icon" app:layout_constraintStart_toEndOf="@+id/qrcode_receive_icon" app:layout_constraintTop_toTopOf="@+id/qrcode_receive_icon" /> <TextView android:id="@+id/qrcode_receive_add_friend_tip" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="12dp" android:text="无需加好友,扫收款码向我付钱" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/qrcode_receive_icon" /> <TextView android:id="@+id/qrcode_receive_balance" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="8dp" android:text="¥0.00" android:textColor="@color/black" android:textSize="24sp" android:textStyle="bold" android:visibility="gone" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/qrcode_receive_add_friend_tip" /> <androidx.appcompat.widget.AppCompatImageView android:id="@+id/qrcode_receive_icon" android:layout_width="40dp" android:layout_height="40dp" android:layout_marginLeft="10dp" android:layout_marginTop="12dp" android:src="@drawable/wc_qrcode_receive_icon" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="@+id/qrcode_receive_layout" /> <androidx.appcompat.widget.AppCompatTextView android:id="@+id/qrcode_receive_set_amount" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="20dp" android:text="设置金额" android:textColor="@color/black" android:textSize="14sp" app:layout_constraintStart_toStartOf="@+id/qrcode_receive_qrcode" app:layout_constraintTop_toBottomOf="@+id/qrcode_receive_qrcode" /> <androidx.appcompat.widget.AppCompatTextView android:id="@+id/qrcode_receive_save_qrcode" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="20dp" android:text="保存收款码" android:textColor="@color/black" android:textSize="14sp" app:layout_constraintEnd_toEndOf="@+id/qrcode_receive_qrcode" app:layout_constraintTop_toBottomOf="@+id/qrcode_receive_qrcode" /> </androidx.constraintlayout.widget.ConstraintLayout> <androidx.constraintlayout.widget.ConstraintLayout android:id="@+id/qrcode_receive_mask_layout" android:layout_width="match_parent" android:layout_height="360dp" android:layout_marginHorizontal="12dp" android:layout_marginVertical="20dp" android:background="#FFFFFF" android:visibility="gone" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/base_top_root_layout"> <androidx.appcompat.widget.AppCompatImageView android:id="@+id/qrcode_receive_mask_icon" app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toTopOf="parent" android:layout_marginTop="80dp" android:layout_width="50dp" android:layout_height="50dp" android:src="@drawable/ic_launcher"/> <androidx.appcompat.widget.AppCompatTextView android:id="@+id/qrcode_receive_mask_name" app:layout_constraintStart_toStartOf="@+id/qrcode_receive_mask_icon" app:layout_constraintEnd_toEndOf="@+id/qrcode_receive_mask_icon" app:layout_constraintTop_toBottomOf="@+id/qrcode_receive_mask_icon" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="10dp" android:text="名称" android:textSize="20sp" android:textColor="@color/black"/> <androidx.appcompat.widget.AppCompatTextView android:id="@+id/qrcode_receive_mask_balance" app:layout_constraintStart_toStartOf="@+id/qrcode_receive_mask_icon" app:layout_constraintEnd_toEndOf="@+id/qrcode_receive_mask_icon" app:layout_constraintTop_toBottomOf="@+id/qrcode_receive_mask_name" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="30dp" android:text="¥0.00" android:textSize="30sp" android:textColor="@color/black"/> </androidx.constraintlayout.widget.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout> </layout>
/** * Author : wangning * Email : maoning20080809@163.com * Date : 2022/5/22 16:12 * Description : 二维码收款 */ class QRCodeReceiveFragment : BaseDataBindingFragment<WcQrcodeReceiveBinding>() { private var resultBalance : Float = 0f override fun getLayoutRes() = R.layout.wc_qrcode_receive private var navController : NavController? = null override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) super.builder() .setTitleContent(R.string.wc_base_top_qrcode_payment) .setTitleColor(R.color.white) .setBack(R.drawable.wc_white_back) UIStatusUtils.setStatusBarColor(requireActivity(), BaseUtils.getColor(R.color.color_FFD700)) navController = findNavController() //设置金额页面点击返回接收的值 navController?.currentBackStackEntry?.savedStateHandle?.getLiveData<Float>(CommonUtils.QRCommon.BALANCE)?.observe(viewLifecycleOwner){ TagUtils.d("接收返回金额:${it}") resultBalance = it if(resultBalance > 0){ qrcode_receive_balance.visibility = View.VISIBLE refresh() } } qrcode_receive_set_amount.setOnClickListener { navController?.navigate(R.id.action_qrcode_set_amount) } refresh() if(!EventBus.getDefault().isRegistered(this)){ EventBus.getDefault().register(this) } } @Subscribe(threadMode = ThreadMode.MAIN) fun onMessageCallback(paymentBean: PaymentBean) { TagUtils.d("二维码扫描接收的值:${paymentBean.balance} , ${paymentBean.fromAccount} , ${paymentBean.toAccount}") qrcode_receive_from_layout.visibility = View.VISIBLE qrcode_receive_from_divide.visibility = View.VISIBLE if(paymentBean == null){ qrcode_receive_from_balance.text = "支付失败!" } else if(paymentBean.operator == CommonUtils.User.OPERATOR_PLUS){ qrcode_receive_from_balance.text = paymentBean.balance.toString() BaseUtils.showAvatar(paymentBean.fromAccount, qrcode_receive_from_avatar,qrcode_receive_from_name) processMask(paymentBean.fromAccount, paymentBean.balance) //暂停使用语言播放 /*CoroutineScope(Dispatchers.Main).launch { delay(2000) AudioUtils().processStart(paymentBean.balance.toInt()) }*/ } } //刷新页面 private fun refresh(){ qrcode_receive_balance.text = resultBalance.toString() var qrBalance = 0f //如果不输入金额, 默认传递0 if(resultBalance > 0){ qrBalance = resultBalance } CoroutineScope(Dispatchers.IO).launch { var account = DataStoreUtils.getAccount() var userBean = UserRepository.getUserByAccount(account) var filePath = CommonUtils.Base.getReallyImage(userBean.avatar) var content = CommonUtils.QRCommon.QR_RECEIVE_CODE + qrBalance + ":" + account CoroutineScope(Dispatchers.Main).launch { //在二维码中显示头像 GlideUtils.loadQRCode(qrcode_receive_qrcode, content, filePath) } } } //收款成功后,显示动画 private fun processMask(account : String, balace: Float){ qrcode_receive_mask_layout.visibility = View.VISIBLE qrcode_receive_mask_balance.text = CommonUtils.Base.getFormatBalanceUnit(balace) BaseUtils.showAvatar(account, qrcode_receive_mask_icon, qrcode_receive_mask_name) CoroutineScope(Dispatchers.Main).launch { delay(1000) val animationSet = AnimationSet(true) animationSet.setAnimationListener(object : Animation.AnimationListener{ override fun onAnimationEnd(p0: Animation?) { qrcode_receive_mask_layout.visibility = View.GONE } override fun onAnimationRepeat(p0: Animation?) { } override fun onAnimationStart(p0: Animation?) { } }) var scaleAnimation = ScaleAnimation(1f,0.0f,1f,0.0f, Animation.RELATIVE_TO_SELF,1f, Animation.RELATIVE_TO_SELF,1f) scaleAnimation.duration = 1500 animationSet.addAnimation(scaleAnimation) qrcode_receive_mask_layout.startAnimation(animationSet) } } override fun onDestroy() { super.onDestroy() EventBus.getDefault().unregister(this) UIStatusUtils.setStatusBarColor(requireActivity(), BaseUtils.getColor(R.color.color_48d17a)) } }