home
parent
1857cdb0b8
commit
732932ec75
|
@ -1,6 +1,6 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
xmlns:tools="http://schemas.android.com/tools">
|
xmlns:tools="http://schemas.android.com/tools" >
|
||||||
|
|
||||||
<application
|
<application
|
||||||
android:allowBackup="true"
|
android:allowBackup="true"
|
||||||
|
@ -11,19 +11,20 @@
|
||||||
android:roundIcon="@mipmap/ic_launcher_round"
|
android:roundIcon="@mipmap/ic_launcher_round"
|
||||||
android:supportsRtl="true"
|
android:supportsRtl="true"
|
||||||
android:theme="@style/Theme.Android_ulsService"
|
android:theme="@style/Theme.Android_ulsService"
|
||||||
tools:targetApi="31">
|
tools:targetApi="31" >
|
||||||
|
|
||||||
<activity
|
<activity
|
||||||
android:name=".module.home.MainActivity"
|
android:name=".module.wecome.WecomeActivity"
|
||||||
android:exported="true"
|
android:exported="true" >
|
||||||
android:label="@string/app_name">
|
|
||||||
<intent-filter>
|
<intent-filter>
|
||||||
<action android:name="android.intent.action.MAIN" />
|
<action android:name="android.intent.action.MAIN" />
|
||||||
|
|
||||||
<category android:name="android.intent.category.LAUNCHER" />
|
<category android:name="android.intent.category.LAUNCHER" />
|
||||||
</intent-filter>
|
</intent-filter>
|
||||||
</activity>
|
</activity>
|
||||||
|
<activity
|
||||||
|
android:name=".module.home.MainActivity"
|
||||||
|
android:launchMode="singleTask">
|
||||||
|
</activity>
|
||||||
<activity
|
<activity
|
||||||
android:name=".module.test.FuncListActivity"
|
android:name=".module.test.FuncListActivity"
|
||||||
android:exported="false" />
|
android:exported="false" />
|
||||||
|
|
|
@ -19,18 +19,5 @@ class MainActivity : AppCompatActivity() {
|
||||||
|
|
||||||
binding = ActivityMainBinding.inflate(layoutInflater)
|
binding = ActivityMainBinding.inflate(layoutInflater)
|
||||||
setContentView(binding.root)
|
setContentView(binding.root)
|
||||||
|
|
||||||
val navView: BottomNavigationView = binding.navView
|
|
||||||
|
|
||||||
val navController = findNavController(R.id.nav_host_fragment_activity_main)
|
|
||||||
// Passing each menu ID as a set of Ids because each
|
|
||||||
// menu should be considered as top level destinations.
|
|
||||||
val appBarConfiguration = AppBarConfiguration(
|
|
||||||
setOf(
|
|
||||||
R.id.navigation_home, R.id.navigation_dashboard, R.id.navigation_notifications
|
|
||||||
)
|
|
||||||
)
|
|
||||||
setupActionBarWithNavController(navController, appBarConfiguration)
|
|
||||||
navView.setupWithNavController(navController)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -0,0 +1,28 @@
|
||||||
|
package com.uls.service.module.home.view
|
||||||
|
|
||||||
|
import android.content.Context
|
||||||
|
import android.graphics.Color
|
||||||
|
import android.graphics.drawable.GradientDrawable
|
||||||
|
import android.util.AttributeSet
|
||||||
|
import android.view.LayoutInflater
|
||||||
|
import android.widget.LinearLayout
|
||||||
|
import com.uls.service.databinding.HomeItemViewBinding
|
||||||
|
import com.util.extension.dp
|
||||||
|
import com.util.extension.roundCorner
|
||||||
|
|
||||||
|
/**
|
||||||
|
Created by yanzs on 2023/11/14
|
||||||
|
*/
|
||||||
|
class HomeItemView @JvmOverloads constructor(
|
||||||
|
context: Context, attrs: AttributeSet? = null
|
||||||
|
) : LinearLayout(context, attrs) {
|
||||||
|
private var binding = HomeItemViewBinding.inflate(LayoutInflater.from(context), this, true)
|
||||||
|
|
||||||
|
init {
|
||||||
|
roundCorner(30.dp)
|
||||||
|
background = GradientDrawable(
|
||||||
|
GradientDrawable.Orientation.LEFT_RIGHT,
|
||||||
|
intArrayOf(Color.parseColor("#ff36C1C8"), Color.parseColor("#ff37D1D9"))
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,25 @@
|
||||||
|
package com.uls.service.module.wecome
|
||||||
|
|
||||||
|
import android.annotation.SuppressLint
|
||||||
|
import android.content.Intent
|
||||||
|
import androidx.appcompat.app.AppCompatActivity
|
||||||
|
import android.os.Bundle
|
||||||
|
import com.uls.service.R
|
||||||
|
import com.uls.service.module.home.MainActivity
|
||||||
|
import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers
|
||||||
|
import io.reactivex.rxjava3.core.Flowable
|
||||||
|
import java.util.concurrent.TimeUnit
|
||||||
|
|
||||||
|
class WecomeActivity : AppCompatActivity() {
|
||||||
|
@SuppressLint("CheckResult")
|
||||||
|
override fun onCreate(savedInstanceState: Bundle?) {
|
||||||
|
super.onCreate(savedInstanceState)
|
||||||
|
setContentView(R.layout.activity_wecome)
|
||||||
|
Flowable.timer(300,TimeUnit.MILLISECONDS)
|
||||||
|
.observeOn(AndroidSchedulers.mainThread())
|
||||||
|
.subscribe {
|
||||||
|
finish()
|
||||||
|
startActivity(Intent(this,MainActivity::class.java))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,33 +1,24 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
android:id="@+id/container"
|
android:id="@+id/container"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="match_parent"
|
android:layout_height="match_parent"
|
||||||
android:paddingTop="?attr/actionBarSize">
|
android:orientation="horizontal">
|
||||||
|
<LinearLayout
|
||||||
<com.google.android.material.bottomnavigation.BottomNavigationView
|
|
||||||
android:id="@+id/nav_view"
|
|
||||||
android:layout_width="0dp"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_marginStart="0dp"
|
|
||||||
android:layout_marginEnd="0dp"
|
|
||||||
android:background="?android:attr/windowBackground"
|
|
||||||
app:layout_constraintBottom_toBottomOf="parent"
|
|
||||||
app:layout_constraintLeft_toLeftOf="parent"
|
|
||||||
app:layout_constraintRight_toRightOf="parent"
|
|
||||||
app:menu="@menu/bottom_nav_menu" />
|
|
||||||
|
|
||||||
<fragment
|
|
||||||
android:id="@+id/nav_host_fragment_activity_main"
|
|
||||||
android:name="androidx.navigation.fragment.NavHostFragment"
|
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="match_parent"
|
android:layout_height="match_parent"
|
||||||
app:defaultNavHost="true"
|
android:orientation="horizontal"
|
||||||
app:layout_constraintBottom_toTopOf="@id/nav_view"
|
>
|
||||||
app:layout_constraintLeft_toLeftOf="parent"
|
|
||||||
app:layout_constraintRight_toRightOf="parent"
|
|
||||||
app:layout_constraintTop_toTopOf="parent"
|
|
||||||
app:navGraph="@navigation/mobile_navigation" />
|
|
||||||
|
|
||||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
<androidx.appcompat.widget.LinearLayoutCompat
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:orientation="vertical"
|
||||||
|
>
|
||||||
|
|
||||||
|
</androidx.appcompat.widget.LinearLayoutCompat>
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
|
</LinearLayout>
|
|
@ -0,0 +1,33 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<androidx.appcompat.widget.LinearLayoutCompat
|
||||||
|
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="vertical"
|
||||||
|
android:gravity="center"
|
||||||
|
tools:context=".module.wecome.WecomeActivity">
|
||||||
|
<RelativeLayout
|
||||||
|
android:layout_width="466dp"
|
||||||
|
android:layout_height="466dp">
|
||||||
|
<ImageView
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:src="@mipmap/wecom_logo"
|
||||||
|
/>
|
||||||
|
<TextView
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:textColor="#ff3D3D3D"
|
||||||
|
android:textSize="80sp"
|
||||||
|
android:text="尤岚氏机器人"
|
||||||
|
android:layout_centerHorizontal="true"
|
||||||
|
android:layout_alignParentBottom="true"
|
||||||
|
/>
|
||||||
|
</RelativeLayout>
|
||||||
|
<ImageView
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:src="@mipmap/wecom_logo_subtitle"
|
||||||
|
/>
|
||||||
|
</androidx.appcompat.widget.LinearLayoutCompat>
|
|
@ -0,0 +1,37 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:orientation="horizontal"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:background="#36C1C8"
|
||||||
|
android:padding="12dp">
|
||||||
|
|
||||||
|
<ImageView
|
||||||
|
android:layout_width="90dp"
|
||||||
|
android:layout_height="90dp"/>
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:layout_width="0dp"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:orientation="vertical"
|
||||||
|
android:layout_weight="1">
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/tv_title"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:text="家庭医生"
|
||||||
|
android:textColor="#FFFFFF"
|
||||||
|
android:textSize="38sp"
|
||||||
|
/>
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/tv_subtitle"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:textSize="26sp"
|
||||||
|
android:textColor="#FFFFFF"
|
||||||
|
android:text="专家坐诊,线上咨询"
|
||||||
|
/>
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
|
</LinearLayout>
|
Binary file not shown.
After Width: | Height: | Size: 232 KiB |
Binary file not shown.
After Width: | Height: | Size: 21 KiB |
Binary file not shown.
After Width: | Height: | Size: 22 KiB |
|
@ -12,5 +12,6 @@
|
||||||
<!-- Status bar color. -->
|
<!-- Status bar color. -->
|
||||||
<item name="android:statusBarColor">?attr/colorPrimaryVariant</item>
|
<item name="android:statusBarColor">?attr/colorPrimaryVariant</item>
|
||||||
<!-- Customize your theme here. -->
|
<!-- Customize your theme here. -->
|
||||||
|
<item name="android:screenOrientation">landscape</item>
|
||||||
</style>
|
</style>
|
||||||
</resources>
|
</resources>
|
|
@ -32,7 +32,7 @@ android {
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
|
|
||||||
api project(":uikit")
|
api project(":util")
|
||||||
api androidxLibs.bundles.androidx
|
api androidxLibs.bundles.androidx
|
||||||
api googleLibs.material
|
api googleLibs.material
|
||||||
|
|
||||||
|
|
|
@ -39,5 +39,6 @@ dependencies {
|
||||||
api 'com.squareup.retrofit2:adapter-rxjava3:2.9.0'
|
api 'com.squareup.retrofit2:adapter-rxjava3:2.9.0'
|
||||||
api 'com.squareup.retrofit2:converter-gson:2.9.0'
|
api 'com.squareup.retrofit2:converter-gson:2.9.0'
|
||||||
api 'com.squareup.okhttp3:okhttp:4.2.2'
|
api 'com.squareup.okhttp3:okhttp:4.2.2'
|
||||||
|
api 'com.ljx.rxlife3:rxlife-rxjava:3.0.0'
|
||||||
|
|
||||||
}
|
}
|
|
@ -0,0 +1,29 @@
|
||||||
|
package com.util.extension
|
||||||
|
|
||||||
|
import android.content.res.Resources
|
||||||
|
|
||||||
|
|
||||||
|
// see https://github.com/nitrico/kema/blob/master/kema/src/main/java/com/github/nitrico/kema/Conversions.kt
|
||||||
|
|
||||||
|
// dp to pixels
|
||||||
|
val Int.dp: Int get() = (this * Resources.getSystem().displayMetrics.density + 0.5f).toInt()
|
||||||
|
|
||||||
|
// float dp to pixels
|
||||||
|
val Float.dp: Float get() = (this * Resources.getSystem().displayMetrics.density + 0.5f)
|
||||||
|
|
||||||
|
val Int.sp: Int get() = (this * Resources.getSystem().displayMetrics.scaledDensity + 0.5f).toInt()
|
||||||
|
|
||||||
|
val Float.sp: Float get() = (this * Resources.getSystem().displayMetrics.scaledDensity + 0.5f)
|
||||||
|
|
||||||
|
|
||||||
|
// integer to float
|
||||||
|
val Int.f: Float get() = toFloat()
|
||||||
|
|
||||||
|
// integer to double
|
||||||
|
val Int.d: Double get() = toDouble()
|
||||||
|
|
||||||
|
// float to integer
|
||||||
|
val Float.i: Int get() = toInt()
|
||||||
|
|
||||||
|
// double to integer
|
||||||
|
val Double.i: Int get() = toInt()
|
|
@ -0,0 +1,155 @@
|
||||||
|
package com.util.extension
|
||||||
|
|
||||||
|
|
||||||
|
import android.graphics.Outline
|
||||||
|
import android.os.Handler
|
||||||
|
import android.os.Looper
|
||||||
|
import android.text.Editable
|
||||||
|
import android.text.TextWatcher
|
||||||
|
import android.view.View
|
||||||
|
import android.view.ViewOutlineProvider
|
||||||
|
import android.widget.EditText
|
||||||
|
import android.widget.TextView
|
||||||
|
import kotlin.math.abs
|
||||||
|
|
||||||
|
|
||||||
|
fun View.visible() {
|
||||||
|
visibility = View.VISIBLE
|
||||||
|
}
|
||||||
|
|
||||||
|
fun View.invisible() {
|
||||||
|
visibility = View.INVISIBLE
|
||||||
|
}
|
||||||
|
|
||||||
|
fun View.gone() {
|
||||||
|
visibility = View.GONE
|
||||||
|
}
|
||||||
|
|
||||||
|
fun View.setVisible(isVisible: Boolean) {
|
||||||
|
visibility = if (isVisible) {
|
||||||
|
View.VISIBLE
|
||||||
|
} else {
|
||||||
|
View.GONE
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 设置防抖动的点击事件
|
||||||
|
*
|
||||||
|
* @param intervalInMillis 防抖动阈值,默认800ms
|
||||||
|
*/
|
||||||
|
fun View.setOnThrottledClickListener(
|
||||||
|
intervalInMillis: Long = 800L,
|
||||||
|
action: (View) -> Unit
|
||||||
|
) {
|
||||||
|
setOnClickListener(
|
||||||
|
object : View.OnClickListener {
|
||||||
|
private var lastClickedTimeInMillis: Long = 0
|
||||||
|
|
||||||
|
override fun onClick(v: View) {
|
||||||
|
if (abs(System.currentTimeMillis() - lastClickedTimeInMillis) >= intervalInMillis) {
|
||||||
|
lastClickedTimeInMillis = System.currentTimeMillis()
|
||||||
|
action.invoke(v)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 用于让类继承,在onClick方法中统一用view.id区分
|
||||||
|
*/
|
||||||
|
fun View.setOnThrottledClickListener(
|
||||||
|
onThrottledClickListener: OnThrottledClickListener,
|
||||||
|
intervalInMillis: Long = 800L
|
||||||
|
) {
|
||||||
|
setOnClickListener(
|
||||||
|
object : View.OnClickListener {
|
||||||
|
private var lastClickedTimeInMillis: Long = 0
|
||||||
|
|
||||||
|
override fun onClick(v: View) {
|
||||||
|
if (abs(System.currentTimeMillis() - lastClickedTimeInMillis) >= intervalInMillis) {
|
||||||
|
onThrottledClickListener.onClick(v)
|
||||||
|
lastClickedTimeInMillis = System.currentTimeMillis()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun TextView.setOnDebouncedAfterTextChanged(
|
||||||
|
intervalInMillis: Long = 200L,
|
||||||
|
onAfterChanged: (text: Editable?) -> Unit
|
||||||
|
) {
|
||||||
|
this.addTextChangedListener(object : TextWatcher {
|
||||||
|
val handler = Handler(Looper.getMainLooper())
|
||||||
|
var runnable: Runnable? = null
|
||||||
|
override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {
|
||||||
|
runnable?.let {
|
||||||
|
handler.removeCallbacks(it)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun afterTextChanged(s: Editable?) {
|
||||||
|
runnable = Runnable {
|
||||||
|
onAfterChanged(s)
|
||||||
|
}.also {
|
||||||
|
handler.postDelayed(it, intervalInMillis)
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
var EditText.trimText: String?
|
||||||
|
set(value) {
|
||||||
|
this.setText(value)//设置的数据不处理
|
||||||
|
}
|
||||||
|
get() {
|
||||||
|
return this.text.toString().trim()
|
||||||
|
}
|
||||||
|
|
||||||
|
interface OnThrottledClickListener {
|
||||||
|
fun onClick(v: View)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
fun View.roundCorner(
|
||||||
|
round: Int
|
||||||
|
) {
|
||||||
|
outlineProvider = object : ViewOutlineProvider() {
|
||||||
|
override fun getOutline(view: View, outline: Outline) {
|
||||||
|
outline.setRoundRect(0, 0, view.width, view.height, round.toFloat())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
clipToOutline = true
|
||||||
|
}
|
||||||
|
|
||||||
|
fun View.roundTopCorner(
|
||||||
|
round: Int
|
||||||
|
) {
|
||||||
|
outlineProvider = object : ViewOutlineProvider() {
|
||||||
|
override fun getOutline(view: View, outline: Outline) {
|
||||||
|
outline.setRoundRect(0, 0, view.width, view.height + round, round.toFloat())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
clipToOutline = true
|
||||||
|
}
|
||||||
|
fun View.roundBottomCorner(
|
||||||
|
radius: Int
|
||||||
|
) {
|
||||||
|
outlineProvider = object : ViewOutlineProvider() {
|
||||||
|
override fun getOutline(view: View, outline: Outline) {
|
||||||
|
outline.setRoundRect(0, -radius, view.width, view.height, radius.toFloat())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
clipToOutline = true
|
||||||
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue