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="@drawable/wc_base_bg">

        <include layout="@layout/wc_base_top_title"/>

        <androidx.appcompat.widget.AppCompatTextView
            android:id="@+id/qrcode_set_amount_tip"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/base_top_root_layout"
            android:layout_marginLeft="20dp"
            android:layout_marginTop="40dp"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="收款金额"
            android:textColor="@color/black"
            android:textSize="18sp"/>

        <androidx.appcompat.widget.AppCompatTextView
            android:id="@+id/rechange_balance_unit"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            app:layout_constraintStart_toStartOf="@+id/qrcode_set_amount_tip"
            app:layout_constraintTop_toBottomOf="@+id/qrcode_set_amount_tip"
            android:layout_marginTop="10dp"
            android:text="¥"
            android:textSize="30sp"
            android:textColor="@color/black"/>

        <androidx.appcompat.widget.AppCompatEditText
            android:id="@+id/qrcode_set_amount_balance"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintTop_toTopOf="@+id/rechange_balance_unit"
            android:layout_width="match_parent"
            android:layout_height="60dp"
            android:layout_marginLeft="50dp"
            android:layout_marginRight="20dp"
            android:text=""
            android:textSize="30sp"
            android:textColor="@color/black"/>

        <com.wn.wechatclientdemo.view.NumberKeyboardView
            android:id="@+id/num_keyboard_view"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            android:layout_width="match_parent"
            android:layout_height="320dp"/>

    </androidx.constraintlayout.widget.ConstraintLayout>
</layout>
/**
 * Author : wangning
 * Email : maoning20080809@163.com
 * Date : 2022/5/22 16:43
 * Description : 二维码设置金额
 */
class QRCodeSetAmountFragment : BaseDataBindingFragment<WcPaymentSetAmountBinding>(), MyDispatchTouchEventListener {

    override fun getLayoutRes() = R.layout.wc_payment_set_amount

    private var navController : NavController? = null

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)

        super.builder().setTitleContent(R.string.wc_base_top_set_amount)
        UIStatusUtils.setStatusBarColor(requireActivity(), BaseUtils.getColor(R.color.wc_base_bg))

        DispatchTouchEventUtils.registerDispatchTouchListener(this)
        navController = findNavController()
        qrcode_set_amount_balance.showSoftInputOnFocus = false
        num_keyboard_view.initEditText(qrcode_set_amount_balance)

        qrcode_set_amount_balance.setOnClickListener {
            num_keyboard_view.visibility = View.VISIBLE
        }

        num_keyboard_item_recharge.setOnClickListener {
            var result = qrcode_set_amount_balance.text.toString()
            if(TextUtils.isEmpty(result)){
                ToastUtils.makeText(requireActivity(), "请输入金额")
                return@setOnClickListener
            }
            navController?.previousBackStackEntry?.savedStateHandle?.set(CommonUtils.QRCommon.BALANCE, qrcode_set_amount_balance.text.toString().toFloat())
            //弹出的id为fragment,不能为action
            navController?.popBackStack(R.id.nav_qrcode_set_amount, true)
        }

    }

    override fun onDestroy() {
        super.onDestroy()
        UIStatusUtils.setStatusBarColor(requireActivity(), BaseUtils.getColor(R.color.color_FFD700))
        DispatchTouchEventUtils.unregisterDispatchTouchListener(this)
    }

    override fun dispatchTouchEvent(ev: MotionEvent) {
        if (ev.action == MotionEvent.ACTION_DOWN) {
            if (SoftInputUtils.isInput(qrcode_set_amount_balance, ev)) {
                num_keyboard_view?.visibility = View.GONE
            }
        }
    }

    override fun onResume() {
        super.onResume()

        qrcode_set_amount_balance.isFocusableInTouchMode = true
        qrcode_set_amount_balance.requestFocus()
        qrcode_set_amount_balance.setOnKeyListener { view, i, keyEvent ->
            if (i == KeyEvent.KEYCODE_BACK && keyEvent.getAction() == KeyEvent.ACTION_DOWN) {
                if(num_keyboard_view.visibility == View.VISIBLE){
                    hideNumKeyboardView()
                    true
                } else {
                    false
                }
            } else {
                false
            }
        }
    }

    private fun hideNumKeyboardView(){
        num_keyboard_view.visibility = View.GONE
    }

}

自定义数字键盘:

/**
 * Author : wangning
 * Email : maoning20080809@163.com
 * Date : 2022/5/21 14:58
 * Description : 自定义充值键盘
 */
class NumberKeyboardView : RelativeLayout , View.OnClickListener {

    constructor(context: Context) : this(context, null)
    constructor(context: Context, attributeSet: AttributeSet?) : this(context, attributeSet, 0)
    constructor(context: Context, attributeSet: AttributeSet?, defStyleAttr : Int) : super(context, attributeSet, defStyleAttr){
        initView()
    }

    private var view : View? = null
    private var viewList = arrayOfNulls<View>(13)
    private var inputEditText : EditText? = null
    private var result :String = ""

    fun initView() {
        view = LayoutInflater.from(WcApp.getContext()).inflate(R.layout.wc_number_keyboard_item, this, true)

        viewList = arrayOf(findView(R.id.num_keyboard_item_1),findView(R.id.num_keyboard_item_2),findView(R.id.num_keyboard_item_3),findView(R.id.num_keyboard_item_4),
            findView(R.id.num_keyboard_item_5),findView(R.id.num_keyboard_item_6),findView(R.id.num_keyboard_item_7),findView(R.id.num_keyboard_item_8),
            findView(R.id.num_keyboard_item_9),findView(R.id.num_keyboard_item_0),findView(R.id.delete),findView(R.id.num_keyboard_item_spot),findView(R.id.num_keyboard_item_recharge),)

        setListener()
    }

    private fun setListener(){
        for (item in viewList) {
            item?.setOnClickListener(this)
        }
    }

    override fun onClick(v: View) {
        when(v.id) {
            R.id.delete -> {
                if(result.length > 0){
                    result = result.substring(0, result.length - 1)
                    inputEditText?.setText(result)
                    inputEditText?.setSelection(result.length)
                }
            }
            R.id.num_keyboard_item_recharge -> {TagUtils.d("充值222")}
            else -> {
                var numberView = v as TextView
                result += numberView.text.toString()
                inputEditText?.setText(result)
                //光标放在最后
                inputEditText?.setSelection(result.length)
            }
        }
    }

    fun initEditText(inputET: EditText){
        inputEditText = inputET
    }

    //设置充值按钮的背景
    fun setRechargeBackground(resId : Int){
        num_keyboard_item_recharge.setBackgroundResource(resId)
    }

    fun setValue(resId: Int){
        num_keyboard_item_recharge.text = BaseUtils.getString(resId)
    }

    private fun findView(id : Int) : View {
        return view?.findViewById(id)!!
    }


}
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:tools="http://schemas.android.com/tools"
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">
<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="320dp"
    android:orientation="horizontal"
    android:background="#F8F8F8"
    tools:ignore="MissingDefaultResource">

        <LinearLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="3"
            android:orientation="vertical">

                <LinearLayout
                    android:layout_width="match_parent"
                    android:layout_height="75dp"
                    android:orientation="horizontal">

                        <androidx.appcompat.widget.AppCompatTextView
                            android:id="@+id/num_keyboard_item_1"
                            style="@style/NumKeyboard"
                            android:layout_weight="1"

                            android:text="1"/>
                        <androidx.appcompat.widget.AppCompatTextView
                            android:id="@+id/num_keyboard_item_2"
                            style="@style/NumKeyboard"
                            android:layout_weight="1"
                            android:text="2"/>
                        <androidx.appcompat.widget.AppCompatTextView
                            android:id="@+id/num_keyboard_item_3"
                            style="@style/NumKeyboard"
                            android:layout_weight="1"
                            android:text="3"/>
                </LinearLayout>

                <LinearLayout
                    android:layout_width="match_parent"
                    android:layout_height="75dp"
                    android:orientation="horizontal">
                        <androidx.appcompat.widget.AppCompatTextView
                            android:id="@+id/num_keyboard_item_4"
                            style="@style/NumKeyboard"
                            android:layout_weight="1"
                            android:text="4"/>

                        <androidx.appcompat.widget.AppCompatTextView
                            android:id="@+id/num_keyboard_item_5"
                            style="@style/NumKeyboard"
                            android:layout_weight="1"
                            android:text="5"/>

                        <androidx.appcompat.widget.AppCompatTextView
                            android:id="@+id/num_keyboard_item_6"
                            style="@style/NumKeyboard"
                            android:layout_weight="1"
                            android:text="6"/>
                </LinearLayout>

                <LinearLayout
                    android:layout_width="match_parent"
                    android:layout_height="75dp"
                    android:orientation="horizontal">
                        <androidx.appcompat.widget.AppCompatTextView
                            android:id="@+id/num_keyboard_item_7"
                            style="@style/NumKeyboard"
                            android:layout_weight="1"
                            android:text="7"/>

                        <androidx.appcompat.widget.AppCompatTextView
                            android:id="@+id/num_keyboard_item_8"
                            style="@style/NumKeyboard"
                            android:layout_weight="1"
                            android:text="8"/>

                        <androidx.appcompat.widget.AppCompatTextView
                            android:id="@+id/num_keyboard_item_9"
                            style="@style/NumKeyboard"
                            android:layout_weight="1"
                            android:text="9"/>
                </LinearLayout>

                <LinearLayout
                    android:layout_width="match_parent"
                    android:layout_height="75dp"
                    android:orientation="horizontal">
                        <androidx.appcompat.widget.AppCompatTextView
                            android:id="@+id/num_keyboard_item_0"
                            style="@style/NumKeyboard"
                            android:layout_weight="1"
                            android:text="0"/>

                        <androidx.appcompat.widget.AppCompatTextView
                            android:id="@+id/num_keyboard_item_spot"
                            style="@style/NumKeyboard"
                            android:layout_weight="2"
                            android:text="."/>
                </LinearLayout>
        </LinearLayout>

        <LinearLayout
            android:layout_weight="1"
            android:layout_width="50dp"
            android:layout_height="match_parent"
            android:orientation="vertical">

                <RelativeLayout
                    android:layout_width="match_parent"
                    android:layout_height="88dp"
                    android:layout_marginTop="12dp"
                    android:layout_marginLeft="8dp"
                    android:layout_marginRight="8dp"
                    android:layout_weight="1">

                        <androidx.appcompat.widget.AppCompatImageView
                            android:id="@+id/delete"
                            android:layout_width="54dp"
                            android:layout_height="54dp"
                            android:layout_centerInParent="true"
                            android:background="@drawable/wc_base_num_delete_selector"
                            android:padding="10dp"
                            android:src="@drawable/wc_recharge_delete" />
                </RelativeLayout>

                <RelativeLayout
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"
                    android:layout_marginTop="14dp"
                    android:layout_marginLeft="12dp"
                    android:layout_marginRight="12dp"
                    android:layout_marginBottom="20dp"
                    android:layout_weight="3">

                        <androidx.appcompat.widget.AppCompatTextView
                            android:id="@+id/num_keyboard_item_recharge"
                            android:layout_width="match_parent"
                            android:layout_height="match_parent"
                            android:background="@drawable/wc_base_green_selector"
                            android:gravity="center"
                            android:text="充值"
                            android:textColor="@color/white"
                            android:textSize="24sp"
                            android:textStyle="bold" />
                </RelativeLayout>

        </LinearLayout>


</LinearLayout>
</layout>

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐