Activity基类

Teamhelper Community2024-03-19 09:00:00

快速使用

创建一个新的Activity继承自GlassBaseActivity,其中GlassBaseActivity继承时需要传入当前ActivityDataBinding泛型类型和ViewModel类型,这样GlassBaseActivity的子类实例化时会根据类型信息通过反射自动创建DataBindingViewModel实例。以下是一个简易的代码示例。

class MainActivity : GlassBaseActivity<ActivityMainBinding, EmptyViewModel>() {

    override fun initParams() {

    }

    override fun initData() {

    }

    override fun initView() {
      	// v为ActivityMainBinding:ViewDataBinding的实例
        v.btnConfirm.setInstruct(InstructSingle("que ding", "确定", "confirm"))
        v.btnConfirm.setOnClickListener {
            toast("confirm")
        }
        v.btnConfirm.focus()
    }

    override fun registerObserve() {

    }
}
<?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"
        tools:context=".MainActivity">

        <com.mst.basics.slide.widget.v2.GlassButton
            android:id="@+id/btn_confirm"
            app:sign="1"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintBottom_toBottomOf="parent"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="确定" />

    </androidx.constraintlayout.widget.ConstraintLayout>
</layout>

GlassBaseActivity基类结构

GlassBaseActivity继承自BaseActivity,并实现了ISlideEventListener接口。它的主要结构如下:

GlassBaseActivity

├── Fields
│   ├── hashCode: Int
│   ├── instructManager: InstructManager
│   ├── slideEventManager: SlideEventManager
│   ├── slideEventViewManager: SlideEventViewManager.Builder
│   ├── glassLoadingDialog: GlassLoadingDialog?
│   └── downloadDialog: GlassDownloadDialog?

├── Methods
│   ├── setInstruct(instructSingle: InstructSingle): Unit
│   ├── focus(): Unit
│   ├── setFocusView(view: ISlideEventViewListener): Unit
│   ├── beforeInitLayout(): Unit
│   ├── afterInitLayout(): Unit
│   ├── onResume(): Unit
│   ├── onKeyUp(keyCode: Int, event: KeyEvent): Boolean
│   ├── onKeyDown(keyCode: Int, event: KeyEvent): Boolean
│   ├── dispatchTouchEvent(event: MotionEvent): Boolean
│   ├── onSuperKeyTrigger(): Unit
│   ├── get slideEvenMode: Int
│   ├── setSlideEventMode(slideEventMode: Int): Unit
│   ├── showLoading(title: String): Unit
│   ├── dismissLoading(): Unit
│   ├── showDownload(): Unit
│   ├── setDownloadProgress(progress: Int): Unit
│   ├── dismissDownload(): Unit
│   ├── onEnter(): Unit
│   ├── onBack(): Unit
│   ├── onForward(): Unit
│   ├── onBackward(): Unit
│   ├── onForwardMove(): Unit
│   ├── onBackwardMove(): Unit
│   ├── onPause(): Unit
│   ├── onBackHome(): Unit
│   └── onDestroy(): Unit

└── Interfaces
│   └── ISlideEventListener

└── Parent
    └── BaseActivity
      └── androidx.appcompat.app.AppCompatActivity

下面是每个部分的功能描述:

  1. Fields: 类的字段,包括hashCode、指令管理器、滑动事件管理器、滑动事件视图管理器、加载对话框和下载对话框。

  2. Methods: 类的方法,包括设置指令、焦点、初始化布局前后的操作、生命周期事件处理(如onResumeonPauseonDestroy)、键盘和触摸事件处理、对话框的显示和隐藏、滑动事件的处理等。

  3. Interfaces: GlassBaseActivity实现了ISlideEventListener接口,便于开发者做事件监听的扩展。

获取当前的DataBinding实例

GlassBaseActivity的子类中您可以通过v获取当前页面的DataBinding实例。

protected lateinit var v: DataBinding

获取当前的ViewModel实例

GlassBaseActivity的子类中您可以通过vm获取当前页面的ViewModel实例。

protected lateinit var vm: ViewModel

EmptyViewModel

当开发者编写一些不需要ViewModel的简单页面时,可以在声明类的时候传入EmptyViewModel作为空ViewModel。例如:

class MainActivity : GlassBaseActivity<ActivityMainBinding, EmptyViewModel>() { }

快速获取Context

开发者可以通过mContext字段获取当前页面的Context,当然你也可以通过Kotlin语法下的baseContext获取Context,对应Java语法下的getBaseContext()

protected lateinit var mContext: AppCompatActivity

快速获取Logcat TAG

开发者可以通过TAG字段获取当前ActivityjavaClass.simpleName作为Logcat的日志标签

protected val TAG: String = this.javaClass.simpleName

快速打印堆栈调用

开发者可以通过调用logElogWlogD快速打印logcat日志,并可选传入depth打印指定深度的堆栈信息,方便Lambda函数日志打印和Kotlin高阶函数日志打印。

fun logE(log: Any, depth: Int = 1)

fun logW(log: Any, depth: Int = 1)

fun logD(log: Any, depth: Int = 1)

Logcat扩展函数

我们也为Kotlin开发者提供了此类扩展函数,方便对任意对象做Logcat日志打印。

fun Any.logE(tag: String = "") {
    Log.e(TAG.format(tag), this.toString())
}

fun Any.logW(tag: String = "") ...

fun Any.logI(tag: String = "") ...

fun Any.logV(tag: String = "") ...

fun Any.logD(tag: String = "") ...

关闭当前页面

开发者可以通过finish函数结束当前页面,并可指定传入延迟关闭参数。

open fun finish(millisecond: Int = 0)

监听用户触发的各类操作交互

详见交互逻辑/监听手势操作

全屏显示内置对话框

  • 显示加载对话框
fun showLoading(title: String)
  • 取消加载对话框
fun dismissLoading()
  • 显示下载对话框
fun showDownload()
  • 设置下载对话框进度
fun setDownloadProgress(progress: Int)
  • 取消下载对话框
fun dismissDownload()

在初始化布局前设置window相关属性

开发者可以通过重写beforeInitLayout方法,在GlassPage初始化布局前设置window相关flag。如下例如全屏等:

override fun beforeInitLayout() {
    super.beforeInitLayout()
    window.decorView.systemUiVisibility =
        View.SYSTEM_UI_FLAG_LAYOUT_STABLE or View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
    val lp = window.attributes
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
        lp.layoutInDisplayCutoutMode =
            WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES
    }
    window.attributes = lp
    window.setFlags(
        WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN
    );
}

切换滑动/滚动模式

开发者可以通过setSlideEventMode切换重用当前触摸板或旋钮原先的前滑后滑事件,使之切换为前滑距离后滑距离,同时用户若进行前滑或后滑操作,则会持续在GlassPage中的onForwardMoveonBackwardMove回调,开发者可以基于此特性实现前后滑动变焦或缩放等人机交互,改善XR眼镜操作体验。

/**
 * 切换滑块 滑动模式
 *
 * @param slideEventMode [com.mst.basics.slide.event.SlideEvent.Mode]
 */
protected fun setSlideEventMode(slideEventMode: Int) {
    slideEventManager.slideEventMode = slideEventMode
}
public interface SlideEvent {

    interface Mode {
        /**
         * 前滑或者后滑(默认)
         */
        int FORWARD_OR_BACKWARD = 1;
        /**
         * 前滑距离或者后滑距离
         */
        int FORWARD_DISTANCE_OR_BACKWARD_DISTANCE = 2;
    }
}

页面级超级按键

在Activity中重写onSuperKeyTrigger方法可以捕捉到用户进行触摸板长按旋钮长按的事件,我们推荐开发者将此长按事件作为页面内最重要操作的触发逻辑,如页面内导航指示的Tips或高优先级菜单项等,我们称之为超级按键

override fun onSuperKeyTrigger() {
    super.onSuperKeyTrigger()
}

跳转页面

开发者可以通过jumpPage方法便捷的完成页面跳转并携带参数的操作,等效于startActivityIntent传递操作。

open fun jumpPage(activity: Class<*>)

open fun jumpPage(activity: Class<*>, map: LinkedHashMap<String, String>)
Last Updated 4/15/2024, 10:24:57 AM