Browse Source

[feat]键盘插件,实现登录布局和VIP布局

hezihao 8 months ago
parent
commit
d214b86790
22 changed files with 463 additions and 53 deletions
  1. 7 1
      plugins/keyboard_android/android/build.gradle
  2. BIN
      plugins/keyboard_android/android/src/main/assets/fonts/app_font.ttf
  3. 24 0
      plugins/keyboard_android/android/src/main/kotlin/com/atmob/keyboard_android/component/LoginComponent.kt
  4. 24 0
      plugins/keyboard_android/android/src/main/kotlin/com/atmob/keyboard_android/component/VipComponent.kt
  5. 28 0
      plugins/keyboard_android/android/src/main/kotlin/com/atmob/keyboard_android/component/base/BaseUIComponent.kt
  6. 34 0
      plugins/keyboard_android/android/src/main/kotlin/com/atmob/keyboard_android/component/base/IUIComponent.kt
  7. 77 0
      plugins/keyboard_android/android/src/main/kotlin/com/atmob/keyboard_android/widget/IconFontTextView.java
  8. 11 0
      plugins/keyboard_android/android/src/main/res/drawable/bg_gradient.xml
  9. 12 0
      plugins/keyboard_android/android/src/main/res/drawable/bg_gradient2.xml
  10. 7 0
      plugins/keyboard_android/android/src/main/res/drawable/bg_white_circle.xml
  11. 58 0
      plugins/keyboard_android/android/src/main/res/layout/component_login.xml
  12. 71 0
      plugins/keyboard_android/android/src/main/res/layout/component_vip.xml
  13. 64 52
      plugins/keyboard_android/android/src/main/res/layout/keyboard_layout.xml
  14. BIN
      plugins/keyboard_android/android/src/main/res/mipmap-xxxhdpi/bg_keyboard.webp
  15. BIN
      plugins/keyboard_android/android/src/main/res/mipmap-xxxhdpi/ic_app_icon.webp
  16. BIN
      plugins/keyboard_android/android/src/main/res/mipmap-xxxhdpi/ic_back_btn.webp
  17. BIN
      plugins/keyboard_android/android/src/main/res/mipmap-xxxhdpi/ic_pinyin_btn.webp
  18. BIN
      plugins/keyboard_android/android/src/main/res/mipmap-xxxhdpi/ic_vip_top.webp
  19. 23 0
      plugins/keyboard_android/android/src/main/res/values/colors.xml
  20. 5 0
      plugins/keyboard_android/android/src/main/res/values/dimens.xml
  21. 11 0
      plugins/keyboard_android/android/src/main/res/values/icon_font_text_view_attrs.xml
  22. 7 0
      plugins/keyboard_android/android/src/main/res/values/string.xml

+ 7 - 1
plugins/keyboard_android/android/build.gradle

@@ -64,7 +64,13 @@ android {
         testImplementation("org.jetbrains.kotlin:kotlin-test")
         testImplementation("org.mockito:mockito-core:5.0.0")
         compileOnly(files("$flutterSdk/bin/cache/artifacts/engine/android-arm/flutter.jar"))
-        implementation 'androidx.recyclerview:recyclerview:1.3.1'
+
+        // RecyclerView
+        implementation 'androidx.recyclerview:recyclerview:1.3.0'
+        // ConstraintLayout
+        implementation "androidx.constraintlayout:constraintlayout:2.1.4"
+        // Gson
+        implementation "com.google.code.gson:gson:2.10"
     }
 
     testOptions {

BIN
plugins/keyboard_android/android/src/main/assets/fonts/app_font.ttf


+ 24 - 0
plugins/keyboard_android/android/src/main/kotlin/com/atmob/keyboard_android/component/LoginComponent.kt

@@ -0,0 +1,24 @@
+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.base.BaseUIComponent
+
+/**
+ * 登录页
+ */
+class LoginComponent @JvmOverloads constructor(
+    context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0
+) : BaseUIComponent(context, attrs, defStyleAttr) {
+    override fun onInflateViewId(): Int {
+        return R.layout.component_login
+    }
+
+    override fun findView(view: View) {
+    }
+
+    override fun bindView(view: View) {
+    }
+}

+ 24 - 0
plugins/keyboard_android/android/src/main/kotlin/com/atmob/keyboard_android/component/VipComponent.kt

@@ -0,0 +1,24 @@
+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.base.BaseUIComponent
+
+/**
+ * Vip页
+ */
+class VipComponent @JvmOverloads constructor(
+    context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0
+) : BaseUIComponent(context, attrs, defStyleAttr) {
+    override fun onInflateViewId(): Int {
+        return R.layout.component_vip
+    }
+
+    override fun findView(view: View) {
+    }
+
+    override fun bindView(view: View) {
+    }
+}

+ 28 - 0
plugins/keyboard_android/android/src/main/kotlin/com/atmob/keyboard_android/component/base/BaseUIComponent.kt

@@ -0,0 +1,28 @@
+package com.atmob.keyboard_android.component.base
+
+import android.content.Context
+import android.util.AttributeSet
+import android.view.LayoutInflater
+import android.view.ViewGroup
+import android.widget.FrameLayout
+
+/**
+ * UI组件抽象类,定义生命周期方法
+ */
+abstract class BaseUIComponent @JvmOverloads constructor(
+    context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0
+) : FrameLayout(context, attrs, defStyleAttr), IUIComponent {
+    init {
+        val view = LayoutInflater.from(context).inflate(onInflateViewId(), this, true)
+        findView(view)
+        bindView(view)
+        setData()
+    }
+
+    override fun setData() {
+    }
+
+    override fun asView(): ViewGroup {
+        return this
+    }
+}

+ 34 - 0
plugins/keyboard_android/android/src/main/kotlin/com/atmob/keyboard_android/component/base/IUIComponent.kt

@@ -0,0 +1,34 @@
+package com.atmob.keyboard_android.component.base
+
+import android.view.View
+import android.view.ViewGroup
+
+/**
+ * UI组件接口,用于定义基础功能API
+ */
+interface IUIComponent {
+    /**
+     * 获取组件的视图布局
+     */
+    fun onInflateViewId(): Int
+
+    /**
+     * 查找控件
+     */
+    fun findView(view: View)
+
+    /**
+     * 绑定控件
+     */
+    fun bindView(view: View)
+
+    /**
+     * 设置数据
+     */
+    fun setData()
+
+    /**
+     * 将组件转换为View实例
+     */
+    fun asView(): ViewGroup
+}

+ 77 - 0
plugins/keyboard_android/android/src/main/kotlin/com/atmob/keyboard_android/widget/IconFontTextView.java

@@ -0,0 +1,77 @@
+package com.atmob.keyboard_android.widget;
+
+import android.content.Context;
+import android.content.res.TypedArray;
+import android.graphics.Typeface;
+import android.util.AttributeSet;
+import android.widget.TextView;
+
+import androidx.annotation.Nullable;
+
+import com.atmob.keyboard_android.R;
+
+
+/**
+ * 支持IconFont的TextView
+ */
+public class IconFontTextView extends TextView {
+    /**
+     * App图标
+     */
+    private static final int TYPEFACE_CODE_APP = 1;
+
+    private Typeface ttfTypeface = null;
+
+    public IconFontTextView(Context context) {
+        this(context, null);
+    }
+
+    public IconFontTextView(Context context, @Nullable AttributeSet attrs) {
+        this(context, attrs, 0);
+    }
+
+    public IconFontTextView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
+        super(context, attrs, defStyleAttr);
+        init(context, attrs, defStyleAttr, 0);
+    }
+
+    private void init(Context context, @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes) {
+        TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.IconFontTextView, defStyleAttr, defStyleRes);
+        int typefaceCode = typedArray.getInt(R.styleable.IconFontTextView_ift_typeface, TYPEFACE_CODE_APP);
+        int textStyle = typedArray.getInt(R.styleable.IconFontTextView_android_textStyle, Typeface.NORMAL);
+
+        //加载字体文件
+        Typeface baseTypeface;
+        if (typefaceCode == TYPEFACE_CODE_APP) {
+            baseTypeface = getTypeface(context, "fonts/app_font.ttf");
+        } else {
+            throw new IllegalArgumentException("字体非法");
+        }
+
+        // 合并用户设置的 textStyle,例如设置斜体
+        if (baseTypeface != null) {
+            Typeface styledTypeface = Typeface.create(baseTypeface, textStyle);
+            setTypeface(styledTypeface);
+        }
+
+        // 去掉padding,这样IconFont和普通字体容易对齐
+        setIncludeFontPadding(false);
+
+        typedArray.recycle();
+    }
+
+    public synchronized Typeface getTypeface(Context context, String path) {
+        if (ttfTypeface == null) {
+            try {
+                ttfTypeface = Typeface.createFromAsset(context.getAssets(), path);
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+        }
+        return ttfTypeface;
+    }
+
+    public synchronized void clearTypeface() {
+        ttfTypeface = null;
+    }
+}

+ 11 - 0
plugins/keyboard_android/android/src/main/res/drawable/bg_gradient.xml

@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android"
+    android:shape="rectangle">
+
+    <gradient
+        android:angle="180"
+        android:endColor="@color/text_color_brand"
+        android:startColor="@color/text_color_auxiliary1" />
+
+    <corners android:radius="24dp" />
+</shape>

+ 12 - 0
plugins/keyboard_android/android/src/main/res/drawable/bg_gradient2.xml

@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android"
+    android:shape="rectangle">
+
+    <gradient
+        android:angle="180"
+        android:centerColor="@color/text_color_auxiliary3"
+        android:endColor="@color/text_color_auxiliary2"
+        android:startColor="@color/text_color_auxiliary4" />
+
+    <corners android:radius="24dp" />
+</shape>

+ 7 - 0
plugins/keyboard_android/android/src/main/res/drawable/bg_white_circle.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="20dp" />
+</shape>

+ 58 - 0
plugins/keyboard_android/android/src/main/res/layout/component_login.xml

@@ -0,0 +1,58 @@
+<?xml version="1.0" encoding="utf-8"?>
+<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    android:layout_width="match_parent"
+    android:layout_height="@dimen/keyboard_height"
+    android:background="@mipmap/bg_keyboard">
+
+    <ImageView
+        android:id="@+id/back_btn"
+        android:layout_width="32dp"
+        android:layout_height="32dp"
+        android:layout_marginStart="12dp"
+        android:layout_marginTop="14dp"
+        android:src="@mipmap/ic_back_btn"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toTopOf="parent" />
+
+    <ImageView
+        android:id="@+id/app_icon"
+        android:layout_width="83dp"
+        android:layout_height="83dp"
+        android:layout_marginTop="24dp"
+        android:src="@mipmap/ic_app_icon"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toBottomOf="@+id/back_btn" />
+
+    <TextView
+        android:id="@+id/login_tip"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_marginTop="14dp"
+        android:text="@string/login_tip"
+        android:textColor="@color/text_color_primary"
+        android:textSize="20sp"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toBottomOf="@+id/app_icon" />
+
+    <TextView
+        android:layout_width="0dp"
+        android:layout_height="wrap_content"
+        android:layout_marginStart="30dp"
+        android:layout_marginTop="30dp"
+        android:layout_marginEnd="30dp"
+        android:layout_marginBottom="24dp"
+        android:background="@drawable/bg_gradient"
+        android:gravity="center"
+        android:paddingTop="16dp"
+        android:paddingBottom="16dp"
+        android:text="@string/go_login"
+        android:textColor="@color/text_color_white"
+        android:textSize="14sp"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toBottomOf="@+id/login_tip" />
+</androidx.constraintlayout.widget.ConstraintLayout>

+ 71 - 0
plugins/keyboard_android/android/src/main/res/layout/component_vip.xml

@@ -0,0 +1,71 @@
+<?xml version="1.0" encoding="utf-8"?>
+<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    android:layout_width="match_parent"
+    android:layout_height="@dimen/keyboard_height"
+    android:background="@mipmap/bg_keyboard">
+
+    <ImageView
+        android:id="@+id/back_btn"
+        android:layout_width="32dp"
+        android:layout_height="32dp"
+        android:layout_marginStart="12dp"
+        android:layout_marginTop="14dp"
+        android:src="@mipmap/ic_back_btn"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toTopOf="parent" />
+
+    <FrameLayout
+        android:id="@+id/vip_tip_layout"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_marginStart="40dp"
+        android:layout_marginEnd="35dp"
+        android:layout_marginBottom="33dp"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintStart_toStartOf="parent">
+
+        <ImageView
+            android:id="@+id/top_icon"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_marginStart="20dp"
+            android:src="@mipmap/ic_vip_top" />
+
+        <TextView
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_gravity="center_horizontal"
+            android:layout_marginTop="91dp"
+            android:background="@drawable/bg_white_circle"
+            android:gravity="center"
+            android:lineSpacingMultiplier="1.1"
+            android:paddingTop="21dp"
+            android:paddingBottom="57dp"
+            android:text="@string/vip_tip"
+            android:textColor="@color/text_color_primary"
+            android:textSize="14sp"
+            android:textStyle="bold" />
+    </FrameLayout>
+
+    <com.atmob.keyboard_android.widget.IconFontTextView
+        android:layout_width="0dp"
+        android:layout_height="wrap_content"
+        android:layout_marginStart="30dp"
+        android:layout_marginTop="154dp"
+        android:layout_marginEnd="30dp"
+        android:layout_marginBottom="24dp"
+        android:background="@drawable/bg_gradient2"
+        android:gravity="center"
+        android:paddingTop="9dp"
+        android:paddingBottom="10dp"
+        android:text="@string/go_vip"
+        android:textColor="@color/text_color_white"
+        android:textSize="24sp"
+        android:textStyle="italic"
+        app:ift_typeface="app"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintStart_toStartOf="parent" />
+</androidx.constraintlayout.widget.ConstraintLayout>

+ 64 - 52
plugins/keyboard_android/android/src/main/res/layout/keyboard_layout.xml

@@ -1,72 +1,84 @@
 <?xml version="1.0" encoding="utf-8"?>
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_width="match_parent"
-    android:layout_height="wrap_content"
-    android:background="@android:color/holo_green_light"
-    android:orientation="vertical"
-    android:padding="5dp">
+    android:layout_height="@dimen/keyboard_height">
 
-    <!-- 输入框 -->
-    <EditText
-        android:id="@+id/keyboard_input"
+    <com.atmob.keyboard_android.component.LoginComponent
         android:layout_width="match_parent"
-        android:layout_height="50dp"
-        android:cursorVisible="false"
-        android:focusable="false"
-        android:hint="复制过来的文本"
-        android:inputType="none"
-        android:longClickable="true"
-        android:textSize="18sp" />
+        android:layout_height="wrap_content" />
+
+    <com.atmob.keyboard_android.component.VipComponent
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content" />
 
-    <!-- 数字键盘 + 操作按钮 -->
     <LinearLayout
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
-        android:orientation="horizontal"
-        android:weightSum="4">
+        android:orientation="vertical"
+        android:padding="5dp">
 
-        <GridLayout
-            android:id="@+id/number_pad"
-            android:layout_width="0dp"
-            android:layout_height="wrap_content"
-            android:layout_weight="3"
-            android:columnCount="3"
-            android:padding="5dp"
-            android:rowCount="4">
+        <!-- 输入框 -->
+        <EditText
+            android:id="@+id/keyboard_input"
+            android:layout_width="match_parent"
+            android:layout_height="50dp"
+            android:cursorVisible="false"
+            android:focusable="false"
+            android:hint="复制过来的文本"
+            android:inputType="none"
+            android:longClickable="true"
+            android:textSize="18sp" />
 
-            <!-- 这里原有的静态按钮定义已全部删除 -->
-        </GridLayout>
-
-        <!-- 操作按钮 -->
+        <!-- 数字键盘 + 操作按钮 -->
         <LinearLayout
-            android:layout_width="0dp"
+            android:layout_width="match_parent"
             android:layout_height="wrap_content"
-            android:layout_weight="1"
-            android:orientation="vertical">
+            android:orientation="horizontal"
+            android:weightSum="4">
 
-            <Button
-                android:id="@+id/btn_paste"
-                android:layout_width="match_parent"
+            <GridLayout
+                android:id="@+id/number_pad"
+                android:layout_width="0dp"
                 android:layout_height="wrap_content"
-                android:text="粘贴" />
+                android:layout_weight="3"
+                android:columnCount="3"
+                android:padding="5dp"
+                android:rowCount="4">
 
-            <Button
-                android:id="@+id/btn_delete"
-                android:layout_width="match_parent"
-                android:layout_height="wrap_content"
-                android:text="删除" />
+                <!-- 这里原有的静态按钮定义已全部删除 -->
+            </GridLayout>
 
-            <Button
-                android:id="@+id/btn_clear"
-                android:layout_width="match_parent"
+            <!-- 操作按钮 -->
+            <LinearLayout
+                android:layout_width="0dp"
                 android:layout_height="wrap_content"
-                android:text="清空" />
+                android:layout_weight="1"
+                android:orientation="vertical">
 
-            <Button
-                android:id="@+id/btn_send"
-                android:layout_width="match_parent"
-                android:layout_height="wrap_content"
-                android:text="发送" />
+                <Button
+                    android:id="@+id/btn_paste"
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:text="粘贴" />
+
+                <Button
+                    android:id="@+id/btn_delete"
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:text="删除" />
+
+                <Button
+                    android:id="@+id/btn_clear"
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:text="清空" />
+
+                <Button
+                    android:id="@+id/btn_send"
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:text="发送" />
+            </LinearLayout>
         </LinearLayout>
     </LinearLayout>
-</LinearLayout>
+</FrameLayout>

BIN
plugins/keyboard_android/android/src/main/res/mipmap-xxxhdpi/bg_keyboard.webp


BIN
plugins/keyboard_android/android/src/main/res/mipmap-xxxhdpi/ic_app_icon.webp


BIN
plugins/keyboard_android/android/src/main/res/mipmap-xxxhdpi/ic_back_btn.webp


BIN
plugins/keyboard_android/android/src/main/res/mipmap-xxxhdpi/ic_pinyin_btn.webp


BIN
plugins/keyboard_android/android/src/main/res/mipmap-xxxhdpi/ic_vip_top.webp


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

@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+    <!-- 主要文字色彩 -->
+    <color name="text_color_primary">#CC000000</color>
+    <!-- 次要文字色彩 -->
+    <color name="text_color_secondary">#99000000</color>
+    <!-- 占位符文字色彩 -->
+    <color name="text_color_placeholder">#66000000</color>
+    <!-- 文字disabled态 -->
+    <color name="text_color_disabled">#42000000</color>
+    <!-- 文字反色色彩 -->
+    <color name="text_color_anti">#E7E7E7</color>
+    <!-- 文字白色 -->
+    <color name="text_color_white">#FFFFFF</color>
+    <!-- 主题色文字色彩 -->
+    <color name="text_color_brand">#7D46FC</color>
+    <!-- 辅助色文字色彩1 -->
+    <color name="text_color_auxiliary1">#BC87FF</color>
+    <!-- 辅助色文字色彩2 -->
+    <color name="text_color_auxiliary2">#F95FAC</color>
+    <color name="text_color_auxiliary3">#FD5E4D</color>
+    <color name="text_color_auxiliary4">#FB8A3C</color>
+</resources>

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

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+    <!-- 键盘高度 -->
+    <dimen name="keyboard_height">292dp</dimen>
+</resources>

+ 11 - 0
plugins/keyboard_android/android/src/main/res/values/icon_font_text_view_attrs.xml

@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+    <declare-styleable name="IconFontTextView">
+        <!-- 字体类型 -->
+        <attr name="ift_typeface" format="enum">
+            <enum name="app" value="1" />
+        </attr>
+        <!-- 添加系统 textStyle 属性,就可以让自定义View处理原始TextView上的属性 -->
+        <attr name="android:textStyle" />
+    </declare-styleable>
+</resources>

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

@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+    <string name="login_tip">请登录后使用</string>
+    <string name="go_login">去登录</string>
+    <string name="vip_tip">您的免费提问次数已用完\n可订阅会员解锁无线提问</string>
+    <string name="go_vip">¥0.1/天解锁</string>
+</resources>