From d71492aa678f463846e0f6e51739bf0b3bcd54f2 Mon Sep 17 00:00:00 2001 From: aibingbing Date: Wed, 18 Sep 2024 19:19:21 +0800 Subject: [PATCH] =?UTF-8?q?[6.7.0][=E5=B7=A5=E5=85=B7=E7=AE=B1]=20feat:=20?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=B7=A5=E5=85=B7=E7=AE=B1Tab=20=E5=8F=8A?= =?UTF-8?q?=E7=9B=B8=E5=85=B3view=20;?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/function/hmi/bone/BoneTabLayout.kt | 7 +- .../function/hmi/bone/tab/ToolKitTabView.kt | 66 ++++++++++++++++++ .../function/hmi/bone/toolkit/ToolKitBean.kt | 5 ++ .../bone/toolkit/ToolKitDefaultItemView.kt | 39 +++++++++++ .../hmi/bone/toolkit/ToolKitListAdapter.kt | 45 ++++++++++++ .../icon_toolkit_item_tiaoshi.png | Bin 0 -> 17863 bytes .../src/main/res/layout/view_bone_tab.xml | 10 +++ .../main/res/layout/view_tool_kit_item.xml | 5 ++ .../res/layout/view_tool_kit_item_default.xml | 34 +++++++++ .../src/main/res/layout/view_tool_kit_tab.xml | 42 +++++++++++ .../src/main/res/values/strings.xml | 1 + .../mogo/view/GridSpacingItemDecoration.java | 43 ++++++++++++ 12 files changed, 292 insertions(+), 5 deletions(-) create mode 100644 core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/bone/tab/ToolKitTabView.kt create mode 100644 core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/bone/toolkit/ToolKitBean.kt create mode 100644 core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/bone/toolkit/ToolKitDefaultItemView.kt create mode 100644 core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/bone/toolkit/ToolKitListAdapter.kt create mode 100644 core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_toolkit_item_tiaoshi.png create mode 100644 core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_tool_kit_item.xml create mode 100644 core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_tool_kit_item_default.xml create mode 100644 core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_tool_kit_tab.xml create mode 100644 core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/mogo/view/GridSpacingItemDecoration.java diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/bone/BoneTabLayout.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/bone/BoneTabLayout.kt index e5d0a1d665..86ce78be1c 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/bone/BoneTabLayout.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/bone/BoneTabLayout.kt @@ -14,6 +14,7 @@ import kotlinx.android.synthetic.main.view_bone_tab.view.tabSwitchCarInfo import kotlinx.android.synthetic.main.view_bone_tab.view.tabSwitchMore import kotlinx.android.synthetic.main.view_bone_tab.view.tabSwitchMsgBox import kotlinx.android.synthetic.main.view_bone_tab.view.tabSwitchReport +import kotlinx.android.synthetic.main.view_bone_tab.view.toolKitTabView import kotlin.properties.Delegates class BoneTabLayout @JvmOverloads constructor( @@ -129,11 +130,7 @@ class BoneTabLayout @JvmOverloads constructor( TabType.MORE_INFO -> { tabSwitchMore.switchTab(check) - if (check) { - - } else { - - } + toolKitTabView.visibility = if (check) VISIBLE else GONE } else -> {} diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/bone/tab/ToolKitTabView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/bone/tab/ToolKitTabView.kt new file mode 100644 index 0000000000..d77de2039f --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/bone/tab/ToolKitTabView.kt @@ -0,0 +1,66 @@ +package com.mogo.eagle.core.function.hmi.bone.tab + +import android.content.Context +import android.util.AttributeSet +import android.view.LayoutInflater +import androidx.constraintlayout.widget.ConstraintLayout +import androidx.recyclerview.widget.GridLayoutManager +import com.mogo.eagle.core.function.hmi.R +import com.mogo.eagle.core.function.hmi.bone.toolkit.ToolKitBean +import com.mogo.eagle.core.function.hmi.bone.toolkit.ToolKitDefaultItemView +import com.mogo.eagle.core.function.hmi.bone.toolkit.ToolKitListAdapter +import com.mogo.eagle.core.utilcode.mogo.view.GridSpacingItemDecoration +import kotlinx.android.synthetic.main.view_tool_kit_tab.view.recyclerView +import me.jessyan.autosize.utils.AutoSizeUtils +import java.lang.ref.WeakReference + +class ToolKitTabView @JvmOverloads constructor( + context: Context, + attrs: AttributeSet? = null, + defStyleAttr: Int = 0 +) : ConstraintLayout(context, attrs, defStyleAttr) { + + companion object { + private const val TAG = "ToolKitTabView" + } + + val toolKitList = ArrayList()?.also { + List(20) { index -> + it += ToolKitBean( + ToolKitDefaultItemView(context).apply { + setData("标题标题标题标题标题$index", R.drawable.icon_toolkit_item_tiaoshi) + } + ) + } + } + + + init { + LayoutInflater.from(context).inflate(R.layout.view_tool_kit_tab, this, true) + initView() + } + + override fun onAttachedToWindow() { + super.onAttachedToWindow() + } + + override fun onDetachedFromWindow() { + super.onDetachedFromWindow() + } + + private fun initView() { + // 设置布局管理器为GridLayoutManager,每行3列 + recyclerView.layoutManager = GridLayoutManager(context, 3) + // 设置适配器 + recyclerView.adapter = ToolKitListAdapter(toolKitList) + recyclerView.addItemDecoration( + GridSpacingItemDecoration( + 3, + AutoSizeUtils.dp2px(context, 10f), + AutoSizeUtils.dp2px(context, 57f), + false + ) + ) + } + +} \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/bone/toolkit/ToolKitBean.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/bone/toolkit/ToolKitBean.kt new file mode 100644 index 0000000000..06190bf1e6 --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/bone/toolkit/ToolKitBean.kt @@ -0,0 +1,5 @@ +package com.mogo.eagle.core.function.hmi.bone.toolkit + +import android.view.View + +data class ToolKitBean(val itemView: View) diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/bone/toolkit/ToolKitDefaultItemView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/bone/toolkit/ToolKitDefaultItemView.kt new file mode 100644 index 0000000000..2d10ec4ff6 --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/bone/toolkit/ToolKitDefaultItemView.kt @@ -0,0 +1,39 @@ +package com.mogo.eagle.core.function.hmi.bone.toolkit + +import android.content.Context +import android.util.AttributeSet +import android.view.LayoutInflater +import androidx.constraintlayout.widget.ConstraintLayout +import androidx.core.content.ContextCompat +import com.mogo.eagle.core.function.hmi.R +import com.mogo.eagle.core.function.main.MainMoGoApplication +import kotlinx.android.synthetic.main.view_tool_kit_item_default.view.btnImageView +import kotlinx.android.synthetic.main.view_tool_kit_item_default.view.tvTitleView + +/** + * 默认的item view, 上下机构,上面是按钮icon图片,下面是 title标题 + */ +class ToolKitDefaultItemView @JvmOverloads constructor( + context: Context, + attrs: AttributeSet? = null, + defStyleAttr: Int = 0 +) : ConstraintLayout(context, attrs, defStyleAttr) { + + companion object { + private const val TAG = "ToolKitDefaultItemView" + } + + init { + LayoutInflater.from(context).inflate(R.layout.view_tool_kit_item_default, this, true) + } + + fun setData(title: String, iconDrawable: Int) { + tvTitleView.text = title + btnImageView.setImageDrawable( + ContextCompat.getDrawable( + MainMoGoApplication.getApp(), + iconDrawable + ) + ) + } +} \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/bone/toolkit/ToolKitListAdapter.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/bone/toolkit/ToolKitListAdapter.kt new file mode 100644 index 0000000000..952cc863f6 --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/bone/toolkit/ToolKitListAdapter.kt @@ -0,0 +1,45 @@ +package com.mogo.eagle.core.function.hmi.bone.toolkit + +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.FrameLayout +import androidx.recyclerview.widget.RecyclerView +import com.mogo.eagle.core.function.hmi.R + +class ToolKitListAdapter(private val items: List) : + RecyclerView.Adapter() { + + class ToolKitListViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + var containerView: FrameLayout = itemView.findViewById(R.id.container) + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { + val itemView = LayoutInflater.from(parent.context) + .inflate(R.layout.view_tool_kit_item, parent, false) + return ToolKitListViewHolder(itemView) + } + + override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { + when (holder) { + is ToolKitListViewHolder -> { + holder.containerView.removeAllViews() + val data = items[position] as ToolKitBean + kotlin.runCatching { + data?.itemView?.also { + if (it.parent != null) { + (it.parent as ViewGroup).removeView(it) + } + holder.containerView.addView(it) + } + } + } + } + } + + override fun getItemCount() = items.size + + override fun onViewRecycled(holder: RecyclerView.ViewHolder) { + super.onViewRecycled(holder) + } +} \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_toolkit_item_tiaoshi.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_toolkit_item_tiaoshi.png new file mode 100644 index 0000000000000000000000000000000000000000..bc30561b480efb3dbf996cf9e1ac107dcfaf2bca GIT binary patch literal 17863 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 + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_tool_kit_item_default.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_tool_kit_item_default.xml new file mode 100644 index 0000000000..41ec5a6614 --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_tool_kit_item_default.xml @@ -0,0 +1,34 @@ + + + + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_tool_kit_tab.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_tool_kit_tab.xml new file mode 100644 index 0000000000..639e155f8c --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_tool_kit_tab.xml @@ -0,0 +1,42 @@ + + + + + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/values/strings.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/values/strings.xml index c1aa415cc0..85ef34f995 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/res/values/strings.xml +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/values/strings.xml @@ -3,6 +3,7 @@ 查看 我的车辆 + 更多内容 登陆信息 退出 车辆绑定 diff --git a/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/mogo/view/GridSpacingItemDecoration.java b/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/mogo/view/GridSpacingItemDecoration.java new file mode 100644 index 0000000000..e69e2e4d17 --- /dev/null +++ b/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/mogo/view/GridSpacingItemDecoration.java @@ -0,0 +1,43 @@ +package com.mogo.eagle.core.utilcode.mogo.view; + +import android.graphics.Rect; +import android.view.View; + +import androidx.recyclerview.widget.RecyclerView; + +public class GridSpacingItemDecoration extends RecyclerView.ItemDecoration { + + private int spanCount; + private int horizontalSpacing; // 水平间距 + private int verticalSpacing; // 垂直间距 + private boolean includeEdge; + + public GridSpacingItemDecoration(int spanCount, int horizontalSpacing, int verticalSpacing, boolean includeEdge) { + this.spanCount = spanCount; + this.horizontalSpacing = horizontalSpacing; + this.verticalSpacing = verticalSpacing; + this.includeEdge = includeEdge; + } + + @Override + public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) { + int position = parent.getChildAdapterPosition(view); // item position + int column = position % spanCount; // item column + + if (includeEdge) { + outRect.left = horizontalSpacing - column * horizontalSpacing / spanCount; + outRect.right = (column + 1) * horizontalSpacing / spanCount; + + if (position < spanCount) { // top edge + outRect.top = verticalSpacing; + } + outRect.bottom = verticalSpacing; // item bottom + } else { + outRect.left = column * horizontalSpacing / spanCount; + outRect.right = horizontalSpacing - (column + 1) * horizontalSpacing / spanCount; + if (position >= spanCount) { + outRect.top = verticalSpacing; // item top + } + } + } +}