Переглянути джерело

[feat]键盘插件,实现键盘列表和TabBar

hezihao 1 рік тому
батько
коміт
70dba08afa
22 змінених файлів з 739 додано та 11 видалено
  1. 2 0
      plugins/keyboard_android/android/build.gradle
  2. 117 0
      plugins/keyboard_android/android/src/main/kotlin/com/atmob/keyboard_android/component/AiKeyboardComponent.kt
  3. 100 0
      plugins/keyboard_android/android/src/main/kotlin/com/atmob/keyboard_android/component/AiKeyboardContentComponent.kt
  4. 48 0
      plugins/keyboard_android/android/src/main/kotlin/com/atmob/keyboard_android/component/adapter/AiKeyboardPagerAdapter.kt
  5. 40 0
      plugins/keyboard_android/android/src/main/kotlin/com/atmob/keyboard_android/component/item/AiKeyboardKeyViewBinder.kt
  6. 11 0
      plugins/keyboard_android/android/src/main/kotlin/com/atmob/keyboard_android/model/AiKeyboardKeyModel.kt
  7. 44 0
      plugins/keyboard_android/android/src/main/kotlin/com/atmob/keyboard_android/widget/NoSwipeViewPager.java
  8. 226 0
      plugins/keyboard_android/android/src/main/kotlin/com/atmob/keyboard_android/widget/indicator/TabPagerTitleView.java
  9. 7 0
      plugins/keyboard_android/android/src/main/res/drawable/bg_ai_keyboard_key.xml
  10. 7 0
      plugins/keyboard_android/android/src/main/res/drawable/bg_tab_indicator.xml
  11. 33 0
      plugins/keyboard_android/android/src/main/res/layout/component_ai_keyboard.xml
  12. 42 0
      plugins/keyboard_android/android/src/main/res/layout/component_ai_keyboard_content.xml
  13. 17 8
      plugins/keyboard_android/android/src/main/res/layout/component_key_board_container.xml
  14. 18 0
      plugins/keyboard_android/android/src/main/res/layout/item_ai_keyboard_key.xml
  15. 6 3
      plugins/keyboard_android/android/src/main/res/layout/keyboard_layout.xml
  16. 4 0
      plugins/keyboard_android/android/src/main/res/layout/pager_ai_keyboard_content.xml
  17. BIN
      plugins/keyboard_android/android/src/main/res/mipmap-xxxhdpi/bg_action_btn_1.png
  18. BIN
      plugins/keyboard_android/android/src/main/res/mipmap-xxxhdpi/bg_action_btn_2.png
  19. 2 0
      plugins/keyboard_android/android/src/main/res/values/colors.xml
  20. 2 0
      plugins/keyboard_android/android/src/main/res/values/dimens.xml
  21. 3 0
      plugins/keyboard_android/android/src/main/res/values/string.xml
  22. 10 0
      plugins/keyboard_android/android/src/main/res/values/styles.xml

+ 2 - 0
plugins/keyboard_android/android/build.gradle

@@ -93,6 +93,8 @@ android {
         implementation "com.github.bumptech.glide:glide:$glide_version"
         implementation "jp.wasabeef:glide-transformations:4.3.0"
         implementation "com.github.zjupure:webpdecoder:2.1.${glide_version}"
+        // MagicIndicator ViewPager指示器
+        implementation 'com.github.hackware1993:MagicIndicator:1.7.0'
     }
 
     testOptions {

+ 117 - 0
plugins/keyboard_android/android/src/main/kotlin/com/atmob/keyboard_android/component/AiKeyboardComponent.kt

@@ -0,0 +1,117 @@
+package com.atmob.keyboard_android.component
+
+import android.content.Context
+import android.util.AttributeSet
+import android.view.View
+import com.atmob.keyboard_android.R
+import com.atmob.keyboard_android.component.adapter.AiKeyboardPagerAdapter
+import com.atmob.keyboard_android.component.base.BaseUIComponent
+import com.atmob.keyboard_android.widget.NoSwipeViewPager
+import com.atmob.keyboard_android.widget.indicator.TabPagerTitleView
+import com.blankj.utilcode.util.ConvertUtils
+import net.lucode.hackware.magicindicator.MagicIndicator
+import net.lucode.hackware.magicindicator.ViewPagerHelper
+import net.lucode.hackware.magicindicator.buildins.UIUtil
+import net.lucode.hackware.magicindicator.buildins.commonnavigator.CommonNavigator
+import net.lucode.hackware.magicindicator.buildins.commonnavigator.abs.CommonNavigatorAdapter
+import net.lucode.hackware.magicindicator.buildins.commonnavigator.abs.IPagerIndicator
+import net.lucode.hackware.magicindicator.buildins.commonnavigator.abs.IPagerTitleView
+import net.lucode.hackware.magicindicator.buildins.commonnavigator.indicators.LinePagerIndicator
+
+/**
+ * AI键盘组件
+ */
+class AiKeyboardComponent @JvmOverloads constructor(
+    context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0
+) : BaseUIComponent(context, attrs, defStyleAttr) {
+    private lateinit var vMagicIndicator: MagicIndicator
+    private lateinit var vViewPager: NoSwipeViewPager
+
+    /**
+     * Tab列表
+     */
+    private lateinit var mTabList: List<String>
+
+    override fun onInflateViewId(): Int {
+        return R.layout.component_ai_keyboard
+    }
+
+    override fun findView(view: View) {
+        vMagicIndicator = view.findViewById(R.id.magic_indicator)
+        vViewPager = view.findViewById(R.id.view_pager)
+    }
+
+    override fun bindView(view: View) {
+        mTabList = listOf(
+            "发起聊天",
+            "邀约话术",
+            "如何告白",
+            "关系升温"
+        )
+
+        // 配置指示器
+        vMagicIndicator.setNavigator(CommonNavigator(context).apply {
+            scrollPivotX = 0.35f
+            setAdapter(object : CommonNavigatorAdapter() {
+                override fun getCount(): Int {
+                    return mTabList.size
+                }
+
+                override fun getTitleView(context: Context, index: Int): IPagerTitleView {
+                    val titleView = object : TabPagerTitleView(context) {
+                        override fun onSelected(index: Int, totalCount: Int) {
+                            super.onSelected(index, totalCount)
+                            // 选中Tab,设置为粗体
+                            setBoldStyle(true)
+                        }
+
+                        override fun onDeselected(index: Int, totalCount: Int) {
+                            super.onDeselected(index, totalCount)
+                            // 不选中Tab,设置为普通体
+                            setBoldStyle(false)
+                        }
+                    }
+                    // Tab文字
+                    titleView.setText(mTabList[index])
+                    // Tab未选中时的字体颜色
+                    titleView.setTextColor(context.resources.getColor(R.color.text_color_secondary))
+                    // Tab选中时的字体颜色
+                    titleView.setClipColor(context.resources.getColor(R.color.text_color_primary))
+                    // 字体大小
+                    titleView.textSize = ConvertUtils.dp2px(12f).toFloat()
+                    // 设置padding,让文字距离背景有一定间距
+                    val paddingHorizontal = ConvertUtils.dp2px(18f)
+                    titleView.setPadding(paddingHorizontal, 0, paddingHorizontal, 0)
+                    // 点击Tab,切换页面
+                    titleView.setOnClickListener(object : OnClickListener {
+                        override fun onClick(v: View?) {
+                            vViewPager.setCurrentItem(index, false)
+                        }
+                    })
+                    return titleView
+                }
+
+                override fun getIndicator(context: Context): IPagerIndicator {
+                    val indicator = LinePagerIndicator(context)
+                    val navigatorHeight =
+                        context.resources.getDimension(R.dimen.common_navigator_height)
+                    val borderWidth = UIUtil.dip2px(context, 1.0).toFloat()
+                    val lineHeight = navigatorHeight - 2 * borderWidth
+                    indicator.lineHeight = lineHeight
+                    indicator.roundRadius = lineHeight / 2
+                    indicator.yOffset = borderWidth
+                    // 指示器的背景颜色
+                    indicator.setColors(context.resources.getColor(R.color.bg_tab_indicator_selected))
+                    return indicator
+                }
+            })
+        })
+
+        // 配置ViewPager
+        vViewPager.setSwipeEnabled(false)
+        vViewPager.adapter = AiKeyboardPagerAdapter(mTabList)
+
+        // 绑定ViewPager和MagicIndicator
+        ViewPagerHelper.bind(vMagicIndicator, vViewPager)
+    }
+}

+ 100 - 0
plugins/keyboard_android/android/src/main/kotlin/com/atmob/keyboard_android/component/AiKeyboardContentComponent.kt

@@ -0,0 +1,100 @@
+package com.atmob.keyboard_android.component
+
+import android.annotation.SuppressLint
+import android.content.Context
+import android.util.AttributeSet
+import android.view.View
+import androidx.recyclerview.widget.GridLayoutManager
+import androidx.recyclerview.widget.RecyclerView
+import com.atmob.keyboard_android.R
+import com.atmob.keyboard_android.component.base.BaseUIComponent
+import com.atmob.keyboard_android.component.item.AiKeyboardKeyViewBinder
+import com.atmob.keyboard_android.ext.click
+import com.atmob.keyboard_android.model.AiKeyboardKeyModel
+import com.atmob.keyboard_android.util.recyclerview.GridDivider
+import com.blankj.utilcode.util.ConvertUtils
+import me.drakeet.multitype.Items
+import me.drakeet.multitype.MultiTypeAdapter
+
+/**
+ * AI键盘内容组件
+ */
+class AiKeyboardContentComponent @JvmOverloads constructor(
+    context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0
+) : BaseUIComponent(context, attrs, defStyleAttr) {
+    private lateinit var vKeyList: RecyclerView
+    private lateinit var vDeleteBtn: View
+    private lateinit var vClearBtn: View
+    private lateinit var vSendBtn: View
+
+    private lateinit var mListItems: Items
+    private lateinit var mListAdapter: MultiTypeAdapter
+
+    override fun onInflateViewId(): Int {
+        return R.layout.component_ai_keyboard_content
+    }
+
+    override fun findView(view: View) {
+        vKeyList = view.findViewById(R.id.key_list)
+        vDeleteBtn = view.findViewById(R.id.delete_btn)
+        vClearBtn = view.findViewById(R.id.clear_btn)
+        vSendBtn = view.findViewById(R.id.send_btn)
+    }
+
+    override fun bindView(view: View) {
+        setupKeyList()
+        setupActionBtn()
+        setData()
+    }
+
+    /**
+     * 设置列表
+     */
+    private fun setupKeyList() {
+        // 列数
+        val spanCount = 3
+        vKeyList.apply {
+            mListItems = Items()
+            mListAdapter = MultiTypeAdapter(mListItems).apply {
+                register(AiKeyboardKeyModel::class.java, AiKeyboardKeyViewBinder {
+                    // 点击键盘按键
+                })
+            }
+            layoutManager = GridLayoutManager(context, spanCount)
+            adapter = mListAdapter
+            // 分割线
+            addItemDecoration(GridDivider(spanCount, ConvertUtils.dp2px(6f)))
+        }
+    }
+
+    /**
+     * 设置操作按钮
+     */
+    private fun setupActionBtn() {
+        vDeleteBtn.click {
+        }
+        vClearBtn.click {
+        }
+        vSendBtn.click {
+        }
+    }
+
+    /**
+     * 填充数据
+     */
+    @SuppressLint("NotifyDataSetChanged")
+    private fun setData() {
+        mListItems.apply {
+            add(AiKeyboardKeyModel("暧昧推拉"))
+            add(AiKeyboardKeyModel("欲拒还迎"))
+            add(AiKeyboardKeyModel("哄女友"))
+            add(AiKeyboardKeyModel("暧昧推拉"))
+            add(AiKeyboardKeyModel("甜蜜暴击"))
+            add(AiKeyboardKeyModel("暧昧推拉"))
+            add(AiKeyboardKeyModel("彩虹屁专家"))
+            add(AiKeyboardKeyModel("恋爱脑"))
+            add(AiKeyboardKeyModel("调皮回复"))
+        }
+        mListAdapter.notifyDataSetChanged()
+    }
+}

+ 48 - 0
plugins/keyboard_android/android/src/main/kotlin/com/atmob/keyboard_android/component/adapter/AiKeyboardPagerAdapter.kt

@@ -0,0 +1,48 @@
+package com.atmob.keyboard_android.component.adapter
+
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import android.widget.TextView
+import androidx.viewpager.widget.PagerAdapter
+import com.atmob.keyboard_android.R
+
+/**
+ * AI键盘Tab的adapter
+ */
+class AiKeyboardPagerAdapter(private val mDataList: List<String>) : PagerAdapter() {
+    override fun getCount(): Int {
+        return mDataList.size
+    }
+
+    override fun isViewFromObject(view: View, `object`: Any): Boolean {
+        return view === `object`
+    }
+
+    override fun instantiateItem(container: ViewGroup, position: Int): Any {
+        // 创建每一页的键盘
+        val context = container.context
+        val contentView = LayoutInflater.from(context)
+            .inflate(R.layout.pager_ai_keyboard_content, container, false)
+        container.addView(contentView)
+        return contentView
+    }
+
+    override fun destroyItem(container: ViewGroup, position: Int, `object`: Any) {
+        container.removeView(`object` as View?)
+    }
+
+    override fun getItemPosition(`object`: Any): Int {
+        val textView = `object` as TextView
+        val text = textView.getText().toString()
+        val index = mDataList.indexOf(text)
+        if (index >= 0) {
+            return index
+        }
+        return POSITION_NONE
+    }
+
+    override fun getPageTitle(position: Int): CharSequence? {
+        return mDataList[position]
+    }
+}

+ 40 - 0
plugins/keyboard_android/android/src/main/kotlin/com/atmob/keyboard_android/component/item/AiKeyboardKeyViewBinder.kt

@@ -0,0 +1,40 @@
+package com.atmob.keyboard_android.component.item
+
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import android.widget.TextView
+import androidx.recyclerview.widget.RecyclerView
+import com.atmob.keyboard_android.R
+import com.atmob.keyboard_android.ext.click
+import com.atmob.keyboard_android.model.AiKeyboardKeyModel
+import me.drakeet.multitype.ItemViewBinder
+
+/**
+ * AI键盘按键条目
+ */
+class AiKeyboardKeyViewBinder(
+    private val onItemClick: (item: AiKeyboardKeyModel) -> Unit
+) :
+    ItemViewBinder<AiKeyboardKeyModel, AiKeyboardKeyViewBinder.InnerViewHolder>() {
+    override fun onCreateViewHolder(
+        inflater: LayoutInflater,
+        parent: ViewGroup
+    ): InnerViewHolder {
+        return InnerViewHolder(inflater.inflate(R.layout.item_ai_keyboard_key, parent, false))
+    }
+
+    override fun onBindViewHolder(
+        holder: InnerViewHolder,
+        item: AiKeyboardKeyModel
+    ) {
+        holder.vKeyText.text = item.text
+        holder.vKeyText.click {
+            onItemClick.invoke(item)
+        }
+    }
+
+    inner class InnerViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
+        val vKeyText: TextView = itemView.findViewById(R.id.key_text)
+    }
+}

+ 11 - 0
plugins/keyboard_android/android/src/main/kotlin/com/atmob/keyboard_android/model/AiKeyboardKeyModel.kt

@@ -0,0 +1,11 @@
+package com.atmob.keyboard_android.model
+
+import java.io.Serializable
+
+/**
+ * AI键盘-按钮模型
+ */
+data class AiKeyboardKeyModel(
+    // 文字
+    val text: String
+) : Serializable

+ 44 - 0
plugins/keyboard_android/android/src/main/kotlin/com/atmob/keyboard_android/widget/NoSwipeViewPager.java

@@ -0,0 +1,44 @@
+package com.atmob.keyboard_android.widget;
+
+import android.annotation.SuppressLint;
+import android.content.Context;
+import android.util.AttributeSet;
+import android.view.MotionEvent;
+
+import androidx.viewpager.widget.ViewPager;
+
+/**
+ * 支持禁止滑动的ViewPager
+ */
+public class NoSwipeViewPager extends ViewPager {
+    /**
+     * 是否允许滑动,默认为支持
+     */
+    private boolean isSwipeEnabled = true;
+
+    public NoSwipeViewPager(Context context) {
+        super(context);
+    }
+
+    public NoSwipeViewPager(Context context, AttributeSet attrs) {
+        super(context, attrs);
+    }
+
+    @Override
+    public boolean onInterceptTouchEvent(MotionEvent event) {
+        return isSwipeEnabled && super.onInterceptTouchEvent(event);
+    }
+
+    @SuppressLint("ClickableViewAccessibility")
+    @Override
+    public boolean onTouchEvent(MotionEvent event) {
+        return isSwipeEnabled && super.onTouchEvent(event);
+    }
+
+    /**
+     * 设置是否可以滑动
+     */
+    public void setSwipeEnabled(boolean enabled) {
+        isSwipeEnabled = enabled;
+    }
+}

+ 226 - 0
plugins/keyboard_android/android/src/main/kotlin/com/atmob/keyboard_android/widget/indicator/TabPagerTitleView.java

@@ -0,0 +1,226 @@
+package com.atmob.keyboard_android.widget.indicator;
+
+import android.content.Context;
+import android.graphics.Canvas;
+import android.graphics.Paint;
+import android.graphics.Rect;
+import android.graphics.Typeface;
+import android.view.View;
+
+import net.lucode.hackware.magicindicator.buildins.UIUtil;
+import net.lucode.hackware.magicindicator.buildins.commonnavigator.abs.IMeasurablePagerTitleView;
+
+/**
+ * 修改自ClipPagerTitleView,增加了设置粗体的功能和方法
+ */
+public class TabPagerTitleView extends View implements IMeasurablePagerTitleView {
+    private String mText;
+    private int mTextColor;
+    private int mClipColor;
+    private boolean mLeftToRight;
+    private float mClipPercent;
+    // 新增:粗体状态标记
+    private boolean mIsBold = false;
+    // 新增:原始字体缓存
+    private Typeface mOriginalTypeface;
+
+    private Paint mPaint;
+    private final Rect mTextBounds = new Rect();
+
+    public TabPagerTitleView(Context context) {
+        super(context);
+        init(context);
+    }
+
+    private void init(Context context) {
+        int textSize = UIUtil.dip2px(context, 16);
+        mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
+        mPaint.setTextSize(textSize);
+        // 保存初始字体
+        mOriginalTypeface = mPaint.getTypeface();
+        int padding = UIUtil.dip2px(context, 10);
+        setPadding(padding, 0, padding, 0);
+    }
+
+    /**
+     * 新增:粗体切换方法
+     *
+     * @param isBold 是否粗体
+     */
+    public void setBoldStyle(boolean isBold) {
+        mIsBold = isBold;
+        updateTypeface();
+        requestLayout();
+        invalidate();
+    }
+
+    private void updateTypeface() {
+        Typeface newTypeface = Typeface.create(mOriginalTypeface,
+                mIsBold ? Typeface.BOLD : Typeface.NORMAL
+        );
+        mPaint.setTypeface(newTypeface);
+    }
+
+    @Override
+    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
+        measureTextBounds();
+        setMeasuredDimension(measureWidth(widthMeasureSpec), measureHeight(heightMeasureSpec));
+    }
+
+    private int measureWidth(int widthMeasureSpec) {
+        int mode = MeasureSpec.getMode(widthMeasureSpec);
+        int size = MeasureSpec.getSize(widthMeasureSpec);
+        int result = size;
+        switch (mode) {
+            case MeasureSpec.AT_MOST:
+                int width = mTextBounds.width() + getPaddingLeft() + getPaddingRight();
+                result = Math.min(width, size);
+                break;
+            case MeasureSpec.UNSPECIFIED:
+                result = mTextBounds.width() + getPaddingLeft() + getPaddingRight();
+                break;
+            default:
+                break;
+        }
+        return result;
+    }
+
+    private int measureHeight(int heightMeasureSpec) {
+        int mode = MeasureSpec.getMode(heightMeasureSpec);
+        int size = MeasureSpec.getSize(heightMeasureSpec);
+        int result = size;
+        switch (mode) {
+            case MeasureSpec.AT_MOST:
+                int height = mTextBounds.height() + getPaddingTop() + getPaddingBottom();
+                result = Math.min(height, size);
+                break;
+            case MeasureSpec.UNSPECIFIED:
+                result = mTextBounds.height() + getPaddingTop() + getPaddingBottom();
+                break;
+            default:
+                break;
+        }
+        return result;
+    }
+
+    @Override
+    protected void onDraw(Canvas canvas) {
+        int x = (getWidth() - mTextBounds.width()) / 2;
+        Paint.FontMetrics fontMetrics = mPaint.getFontMetrics();
+        int y = (int) ((getHeight() - fontMetrics.bottom - fontMetrics.top) / 2);
+
+        // 画底层
+        mPaint.setColor(mTextColor);
+        canvas.drawText(mText, x, y, mPaint);
+
+        // 画clip层
+        canvas.save();
+        if (mLeftToRight) {
+            canvas.clipRect(0, 0, getWidth() * mClipPercent, getHeight());
+        } else {
+            canvas.clipRect(getWidth() * (1 - mClipPercent), 0, getWidth(), getHeight());
+        }
+        mPaint.setColor(mClipColor);
+        canvas.drawText(mText, x, y, mPaint);
+        canvas.restore();
+    }
+
+    @Override
+    public void onSelected(int index, int totalCount) {
+        // 原有实现保持不变
+    }
+
+    @Override
+    public void onDeselected(int index, int totalCount) {
+        // 原有实现保持不变
+    }
+
+    @Override
+    public void onLeave(int index, int totalCount, float leavePercent, boolean leftToRight) {
+        mLeftToRight = !leftToRight;
+        mClipPercent = 1.0f - leavePercent;
+        invalidate();
+    }
+
+    @Override
+    public void onEnter(int index, int totalCount, float enterPercent, boolean leftToRight) {
+        mLeftToRight = leftToRight;
+        mClipPercent = enterPercent;
+        invalidate();
+    }
+
+    private void measureTextBounds() {
+        mPaint.getTextBounds(mText, 0, mText == null ? 0 : mText.length(), mTextBounds);
+    }
+
+    public String getText() {
+        return mText;
+    }
+
+    public void setText(String text) {
+        mText = text;
+        requestLayout();
+    }
+
+    public float getTextSize() {
+        return mPaint.getTextSize();
+    }
+
+    public void setTextSize(float textSize) {
+        mPaint.setTextSize(textSize);
+        updateTypeface();  // 修改:保持粗体状态
+        requestLayout();
+        invalidate();
+    }
+
+    public int getTextColor() {
+        return mTextColor;
+    }
+
+    public void setTextColor(int textColor) {
+        mTextColor = textColor;
+        invalidate();
+    }
+
+    public int getClipColor() {
+        return mClipColor;
+    }
+
+    public void setClipColor(int clipColor) {
+        mClipColor = clipColor;
+        invalidate();
+    }
+
+    @Override
+    public int getContentLeft() {
+        int contentWidth = mTextBounds.width();
+        return getLeft() + getWidth() / 2 - contentWidth / 2;
+    }
+
+    @Override
+    public int getContentTop() {
+        Paint.FontMetrics metrics = mPaint.getFontMetrics();
+        float contentHeight = metrics.bottom - metrics.top;
+        return (int) (getHeight() / 2 - contentHeight / 2);
+    }
+
+    @Override
+    public int getContentRight() {
+        int contentWidth = mTextBounds.width();
+        return getLeft() + getWidth() / 2 + contentWidth / 2;
+    }
+
+    @Override
+    public int getContentBottom() {
+        Paint.FontMetrics metrics = mPaint.getFontMetrics();
+        float contentHeight = metrics.bottom - metrics.top;
+        return (int) (getHeight() / 2 + contentHeight / 2);
+    }
+
+    /**
+     * 新增:获取当前粗体状态
+     */
+    public boolean isBold() {
+        return mIsBold;
+    }
+}

+ 7 - 0
plugins/keyboard_android/android/src/main/res/drawable/bg_ai_keyboard_key.xml

@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android"
+    android:shape="rectangle">
+
+    <solid android:color="@color/text_color_white" />
+    <corners android:radius="9dp" />
+</shape>

+ 7 - 0
plugins/keyboard_android/android/src/main/res/drawable/bg_tab_indicator.xml

@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android"
+    android:shape="rectangle">
+
+    <solid android:color="@color/text_color_white" />
+    <corners android:radius="21dp" />
+</shape>

+ 33 - 0
plugins/keyboard_android/android/src/main/res/layout/component_ai_keyboard.xml

@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_width="match_parent"
+    android:layout_height="@dimen/keyboard_content_height"
+    android:orientation="vertical"
+    tools:background="@mipmap/bg_keyboard">
+
+    <FrameLayout
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_gravity="center_horizontal"
+        android:layout_marginTop="14dp"
+        android:layout_marginBottom="14dp"
+        android:background="@drawable/bg_tab_indicator"
+        android:padding="2dp"
+        android:paddingStart="1dp"
+        android:paddingEnd="1dp">
+
+        <net.lucode.hackware.magicindicator.MagicIndicator
+            android:id="@+id/magic_indicator"
+            android:layout_width="wrap_content"
+            android:layout_height="@dimen/common_navigator_height"
+            android:layout_gravity="center" />
+    </FrameLayout>
+
+    <com.atmob.keyboard_android.widget.NoSwipeViewPager
+        android:id="@+id/view_pager"
+        android:layout_width="match_parent"
+        android:layout_height="0dp"
+        android:layout_weight="1"
+        tools:background="@android:color/holo_blue_dark" />
+</LinearLayout>

+ 42 - 0
plugins/keyboard_android/android/src/main/res/layout/component_ai_keyboard_content.xml

@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:orientation="horizontal">
+
+    <androidx.recyclerview.widget.RecyclerView
+        android:id="@+id/key_list"
+        android:layout_width="0dp"
+        android:layout_height="wrap_content"
+        android:layout_marginStart="10dp"
+        android:layout_weight="1"
+        tools:background="@android:color/holo_blue_dark"
+        tools:layout_height="150dp" />
+
+    <LinearLayout
+        android:id="@+id/action_btn_layout"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_marginStart="6dp"
+        android:layout_marginEnd="10dp"
+        android:orientation="vertical">
+
+        <TextView
+            android:id="@+id/delete_btn"
+            style="@style/keyboard_action_btn"
+            android:text="@string/delete" />
+
+        <TextView
+            android:id="@+id/clear_btn"
+            style="@style/keyboard_action_btn"
+            android:layout_marginTop="6dp"
+            android:layout_marginBottom="6dp"
+            android:text="@string/clear" />
+
+        <TextView
+            android:id="@+id/send_btn"
+            style="@style/keyboard_action_btn"
+            android:text="@string/send" />
+    </LinearLayout>
+</LinearLayout>

+ 17 - 8
plugins/keyboard_android/android/src/main/res/layout/component_key_board_container.xml

@@ -11,14 +11,23 @@
         android:layout_height="wrap_content"
         android:layout_marginTop="16dp" />
 
-    <!-- 拼音键盘 -->
-
-    <!-- AI键盘 -->
-
-    <!-- 键盘选择页 -->
-    <com.atmob.keyboard_android.component.KeyboardSelectComponent
-        android:id="@+id/keyboard_select_component"
+    <FrameLayout
         android:layout_width="match_parent"
         android:layout_height="0dp"
-        android:layout_weight="1" />
+        android:layout_weight="1">
+
+        <!-- 拼音键盘 -->
+
+        <!-- AI键盘 -->
+        <com.atmob.keyboard_android.component.AiKeyboardComponent
+            android:layout_width="match_parent"
+            android:layout_height="match_parent" />
+
+        <!-- 键盘选择页 -->
+        <com.atmob.keyboard_android.component.KeyboardSelectComponent
+            android:id="@+id/keyboard_select_component"
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:visibility="gone" />
+    </FrameLayout>
 </LinearLayout>

+ 18 - 0
plugins/keyboard_android/android/src/main/res/layout/item_ai_keyboard_key.xml

@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8"?>
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    tools:background="@android:color/holo_blue_dark">
+
+    <TextView
+        android:id="@+id/key_text"
+        android:layout_width="88dp"
+        android:layout_height="46dp"
+        android:layout_gravity="center"
+        android:background="@drawable/bg_ai_keyboard_key"
+        android:gravity="center"
+        android:textColor="@color/text_color_primary"
+        android:textSize="14sp"
+        tools:text="哄女友" />
+</FrameLayout>

+ 6 - 3
plugins/keyboard_android/android/src/main/res/layout/keyboard_layout.xml

@@ -7,17 +7,20 @@
     <!-- 登录组件 -->
     <com.atmob.keyboard_android.component.LoginComponent
         android:layout_width="match_parent"
-        android:layout_height="wrap_content" />
+        android:layout_height="wrap_content"
+        android:visibility="gone" />
 
     <!-- VIP组件 -->
     <com.atmob.keyboard_android.component.VipComponent
         android:layout_width="match_parent"
-        android:layout_height="wrap_content" />
+        android:layout_height="wrap_content"
+        android:visibility="gone" />
 
     <!-- 设置组件 -->
     <com.atmob.keyboard_android.component.SettingComponent
         android:layout_width="match_parent"
-        android:layout_height="wrap_content" />
+        android:layout_height="wrap_content"
+        android:visibility="gone" />
 
     <!-- 键盘组件 -->
     <com.atmob.keyboard_android.component.KeyBoardContainerComponent

+ 4 - 0
plugins/keyboard_android/android/src/main/res/layout/pager_ai_keyboard_content.xml

@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<com.atmob.keyboard_android.component.AiKeyboardContentComponent xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent" />

BIN
plugins/keyboard_android/android/src/main/res/mipmap-xxxhdpi/bg_action_btn_1.png


BIN
plugins/keyboard_android/android/src/main/res/mipmap-xxxhdpi/bg_action_btn_2.png


+ 2 - 0
plugins/keyboard_android/android/src/main/res/values/colors.xml

@@ -24,4 +24,6 @@
     <color name="bg_quick_switch_checked">#DDCFFD</color>
     <!-- 模式切换,未选中颜色 -->
     <color name="bg_quick_switch_normal">#FFFFFF</color>
+    <!-- Tab指示器,选中时的背景颜色 -->
+    <color name="bg_tab_indicator_selected">#DDCFFD</color>
 </resources>

+ 2 - 0
plugins/keyboard_android/android/src/main/res/values/dimens.xml

@@ -4,4 +4,6 @@
     <dimen name="keyboard_height">292dp</dimen>
     <!-- 内容高度,不包含工具栏 -->
     <dimen name="keyboard_content_height">242dp</dimen>
+    <!-- ViewPager指示器的高度 -->
+    <dimen name="common_navigator_height">32dp</dimen>
 </resources>

+ 3 - 0
plugins/keyboard_android/android/src/main/res/values/string.xml

@@ -12,4 +12,7 @@
     <string name="mode_open_remarks">开场白</string>
     <string name="common_keyboard">通用键盘</string>
     <string name="save">保存</string>
+    <string name="delete">删除</string>
+    <string name="clear">清空</string>
+    <string name="send">发送</string>
 </resources>

+ 10 - 0
plugins/keyboard_android/android/src/main/res/values/styles.xml

@@ -45,4 +45,14 @@
         <item name="android:textSize">13sp</item>
         <item name="android:textStyle">bold</item>
     </style>
+
+    <style name="keyboard_action_btn">
+        <item name="android:layout_width">58dp</item>
+        <item name="android:layout_height">46dp</item>
+        <item name="android:background">@mipmap/bg_action_btn_1</item>
+        <item name="android:gravity">center</item>
+        <item name="android:textColor">@color/text_color_primary</item>
+        <item name="android:textSize">12sp</item>
+        <item name="android:textStyle">bold</item>
+    </style>
 </resources>