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))
    }
} 
 
 
                


![[附源码]计算机毕业设计springboot万佳商城管理系统](https://img-blog.csdnimg.cn/a3ef5aa99c894abeaf42fad8b9b4521a.png)


![[附源码]Python计算机毕业设计SSM考勤系统设计(程序+LW)](https://img-blog.csdnimg.cn/4370b90f5b9e443c83b6b888c99da9d0.png)




![[附源码]计算机毕业设计springboot校园便携系统](https://img-blog.csdnimg.cn/b94325aac09d4a8fa39be1c05f538040.png)



![[附源码]Python计算机毕业设计Django家庭医生签约服务管理系统](https://img-blog.csdnimg.cn/262c76fe08224ac78668aa6052de5da8.png)

![时序数据库-6-[IoTDB]的数据模式](https://img-blog.csdnimg.cn/12a4b91874974f63b44bbc179000fc55.png)
![[附源码]计算机毕业设计JAVA校园期刊网络投稿系统](https://img-blog.csdnimg.cn/c8d304ba0f1247fb80e236c77d4ad29f.png)
