更新代码

This commit is contained in:
squallzhjch 2022-12-27 16:01:57 +08:00
parent 062bd2de0d
commit e4f8cd1949
36 changed files with 625 additions and 155 deletions

2
.idea/misc.xml generated
View File

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<project version="4"> <project version="4">
<component name="ExternalStorageConfigurationManager" enabled="true" /> <component name="ExternalStorageConfigurationManager" enabled="true" />
<component name="ProjectRootManager" version="2" languageLevel="JDK_1_8" default="true" project-jdk-name="Android Studio default JDK" project-jdk-type="JavaSDK"> <component name="ProjectRootManager" version="2" languageLevel="JDK_11" project-jdk-name="Android Studio default JDK" project-jdk-type="JavaSDK">
<output url="file://$PROJECT_DIR$/build/classes" /> <output url="file://$PROJECT_DIR$/build/classes" />
</component> </component>
<component name="ProjectType"> <component name="ProjectType">

View File

@ -6,11 +6,11 @@ apply plugin: 'kotlin-android'
apply plugin: 'kotlin-kapt' apply plugin: 'kotlin-kapt'
//apply plugin: 'realm-android' //apply plugin: 'realm-android'
android { android {
namespace 'com.navinfo.vivo' namespace 'com.navinfo.volvo'
compileSdk 32 compileSdk 32
defaultConfig { defaultConfig {
applicationId "com.navinfo.vivo" applicationId "com.navinfo.volvo"
minSdk 24 minSdk 24
targetSdk 32 targetSdk 32
versionCode 1 versionCode 1
@ -74,4 +74,6 @@ dependencies {
// implementation "android.arch.lifecycle:extensions:1.1.1" // implementation "android.arch.lifecycle:extensions:1.1.1"
// annotationProcessor "android.arch.lifecycle:compiler:1.1.1" // annotationProcessor "android.arch.lifecycle:compiler:1.1.1"
implementation 'com.tencent.wcdb:wcdb-android:1.1-19' implementation 'com.tencent.wcdb:wcdb-android:1.1-19'
implementation 'com.google.code.gson:gson:2.10'
implementation 'com.yanzhenjie.recyclerview:x:1.3.2'
} }

View File

@ -1,4 +1,4 @@
package com.navinfo.vivo package com.navinfo.volvo
import androidx.test.platform.app.InstrumentationRegistry import androidx.test.platform.app.InstrumentationRegistry
import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.ext.junit.runners.AndroidJUnit4
@ -19,6 +19,6 @@ class ExampleInstrumentedTest {
fun useAppContext() { fun useAppContext() {
// Context of the app under test. // Context of the app under test.
val appContext = InstrumentationRegistry.getInstrumentation().targetContext val appContext = InstrumentationRegistry.getInstrumentation().targetContext
assertEquals("com.navinfo.vivo", appContext.packageName) assertEquals("com.navinfo.volvo", appContext.packageName)
} }
} }

View File

@ -4,16 +4,17 @@
<application <application
android:allowBackup="true" android:allowBackup="true"
android:configChanges="locale"
android:dataExtractionRules="@xml/data_extraction_rules" android:dataExtractionRules="@xml/data_extraction_rules"
android:fullBackupContent="@xml/backup_rules" android:fullBackupContent="@xml/backup_rules"
android:icon="@mipmap/ic_launcher" android:icon="@mipmap/ic_launcher"
android:label="@string/app_name" android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round" android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true" android:supportsRtl="true"
android:theme="@style/Theme.NavinfoVivo" android:theme="@style/Theme.NavinfoVolvo"
tools:targetApi="31"> tools:targetApi="31">
<activity <activity
android:name=".MainActivity" android:name="com.navinfo.volvo.MainActivity"
android:exported="true" android:exported="true"
android:label="@string/app_name"> android:label="@string/app_name">
<intent-filter> <intent-filter>

View File

@ -1,4 +0,0 @@
package com.navinfo.vivo.db.dao.entity
class Attachment {
}

View File

@ -1,44 +0,0 @@
package com.navinfo.vivo.db.dao.entity
import androidx.room.Entity
import androidx.room.PrimaryKey
@Entity(tableName = "message")
class Message(
@PrimaryKey(autoGenerate = true)
var id: Long = 0,
/**
*标题
*/
var title: String,
/**
* 信息内容
*/
var message: String,
/**
* 操作时间
*/
var optionDate: String,
/**
* 发送时间
*/
var sendDate: String,
/**
* 信息状态
*/
var status: Int,
/**
* 发送者ID
*/
var fromId: String,
/**
* 接收者ID
*/
var toId: String,
/**
* 附件列表
*/
var attachment: MutableList<Attachment>
) {
}

View File

@ -1,42 +0,0 @@
package com.navinfo.vivo.ui.home
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.TextView
import androidx.fragment.app.Fragment
import androidx.lifecycle.ViewModelProvider
import com.navinfo.vivo.databinding.FragmentHomeBinding
class HomeFragment : Fragment() {
private var _binding: FragmentHomeBinding? = null
// This property is only valid between onCreateView and
// onDestroyView.
private val binding get() = _binding!!
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View {
val homeViewModel =
ViewModelProvider(this).get(HomeViewModel::class.java)
_binding = FragmentHomeBinding.inflate(inflater, container, false)
val root: View = binding.root
val textView: TextView = binding.textHome
homeViewModel.text.observe(viewLifecycleOwner) {
textView.text = it
}
return root
}
override fun onDestroyView() {
super.onDestroyView()
_binding = null
}
}

View File

@ -1,13 +0,0 @@
package com.navinfo.vivo.ui.home
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
class HomeViewModel : ViewModel() {
private val _text = MutableLiveData<String>().apply {
value = "This is home Fragment"
}
val text: LiveData<String> = _text
}

View File

@ -1,4 +1,4 @@
package com.navinfo.vivo package com.navinfo.volvo
import android.os.Bundle import android.os.Bundle
import com.google.android.material.bottomnavigation.BottomNavigationView import com.google.android.material.bottomnavigation.BottomNavigationView
@ -7,7 +7,8 @@ import androidx.navigation.findNavController
import androidx.navigation.ui.AppBarConfiguration import androidx.navigation.ui.AppBarConfiguration
import androidx.navigation.ui.setupActionBarWithNavController import androidx.navigation.ui.setupActionBarWithNavController
import androidx.navigation.ui.setupWithNavController import androidx.navigation.ui.setupWithNavController
import com.navinfo.vivo.databinding.ActivityMainBinding import com.navinfo.volvo.R
import com.navinfo.volvo.databinding.ActivityMainBinding
class MainActivity : AppCompatActivity() { class MainActivity : AppCompatActivity() {

View File

@ -1,4 +1,4 @@
package com.navinfo.vivo.db.dao; package com.navinfo.volvo.db.dao;
import android.content.Context; import android.content.Context;
@ -10,7 +10,9 @@ import androidx.room.RoomDatabase;
import androidx.sqlite.db.SupportSQLiteDatabase; import androidx.sqlite.db.SupportSQLiteDatabase;
import androidx.sqlite.db.SupportSQLiteOpenHelper; import androidx.sqlite.db.SupportSQLiteOpenHelper;
import com.navinfo.vivo.db.dao.entity.Message; import com.navinfo.volvo.db.dao.entity.Attachment;
import com.navinfo.volvo.db.dao.entity.Message;
import com.navinfo.volvo.db.dao.entity.User;
import com.tencent.wcdb.database.SQLiteCipherSpec; import com.tencent.wcdb.database.SQLiteCipherSpec;
import com.tencent.wcdb.database.SQLiteDatabase; import com.tencent.wcdb.database.SQLiteDatabase;
@ -23,7 +25,7 @@ import com.tencent.wcdb.repair.BackupKit;
import com.tencent.wcdb.repair.RecoverKit; import com.tencent.wcdb.repair.RecoverKit;
import com.tencent.wcdb.room.db.WCDBDatabase; import com.tencent.wcdb.room.db.WCDBDatabase;
@Database(entities = {Message.class}, version = 1, exportSchema = false) @Database(entities = {Message.class, Attachment.class, User.class}, version = 1, exportSchema = false)
public abstract class MapLifeDataBase extends RoomDatabase { public abstract class MapLifeDataBase extends RoomDatabase {
// marking the instance as volatile to ensure atomic access to the variable // marking the instance as volatile to ensure atomic access to the variable
/** /**

View File

@ -1,10 +1,10 @@
package com.navinfo.vivo.db.dao package com.navinfo.volvo.db.dao
import androidx.room.Dao import androidx.room.Dao
import androidx.room.Insert import androidx.room.Insert
import androidx.room.OnConflictStrategy import androidx.room.OnConflictStrategy
import androidx.room.Query import androidx.room.Query
import com.navinfo.vivo.db.dao.entity.Message import com.navinfo.volvo.db.dao.entity.Message
@Dao @Dao
interface MessageDao { interface MessageDao {

View File

@ -0,0 +1,41 @@
package com.navinfo.volvo.db.dao.entity
import androidx.room.Entity
import androidx.room.PrimaryKey
import androidx.room.TypeConverter
import com.google.gson.reflect.TypeToken
import com.navinfo.volvo.tools.GsonUtil
@Entity(tableName = "Attachment")
data class Attachment(
@PrimaryKey()
var id: String
)
class AttachmentConverters() {
@TypeConverter
fun stringToAttachment(value: String): Attachment {
val type = object : TypeToken<Attachment>() {
}.type
return GsonUtil.getInstance().fromJson(value, type)
}
@TypeConverter
fun attachmentToString(attachment: Attachment): String {
return GsonUtil.getInstance().toJson(attachment)
}
@TypeConverter
fun listToString(list: MutableList<Attachment>): String {
return GsonUtil.getInstance().toJson(list)
}
@TypeConverter
fun stringToList(value: String): MutableList<Attachment> {
val type = object : TypeToken<MutableList<Attachment>>() {
}.type
return GsonUtil.getInstance().fromJson(value, type)
}
}

View File

@ -0,0 +1,46 @@
package com.navinfo.volvo.db.dao.entity
import androidx.room.Entity
import androidx.room.PrimaryKey
import androidx.room.TypeConverters
@Entity(tableName = "message")
@TypeConverters(AttachmentConverters::class)
data class Message @JvmOverloads constructor(
@PrimaryKey(autoGenerate = true)
var id: Long = 0,
var netId: String = "",
/**
*标题
*/
var title: String = "",
/**
* 信息内容
*/
var message: String = "",
/**
* 操作时间
*/
var optionDate: String = "",
/**
* 发送时间
*/
var sendDate: String = "",
/**
* 信息状态
*/
var status: Int = 1,
/**
* 发送者ID
*/
var fromId: String = "",
/**
* 接收者ID
*/
var toId: String = "",
/**
* 附件列表
*/
var attachment: MutableList<Attachment> = mutableListOf()
)

View File

@ -1,13 +1,13 @@
package com.navinfo.vivo.db.dao.entity package com.navinfo.volvo.db.dao.entity
import androidx.room.Entity
import androidx.room.PrimaryKey import androidx.room.PrimaryKey
import java.net.IDN
class User( @Entity(tableName = "User")
data class User(
@PrimaryKey() @PrimaryKey()
val id:String, val id:String,
var name:String, var name:String,
var nickname:String, var nickname:String,
) { )
}

View File

@ -0,0 +1,44 @@
package com.navinfo.volvo.tools
import android.content.Context
class DisplayUtil {
companion object {
/**
* 获取屏幕宽度
*/
fun getScreenWidth(context: Context): Int {
return context.resources.displayMetrics.widthPixels
}
/**
* 获取屏幕高度
*/
fun getScreenHeight(context: Context): Int {
return context.resources.displayMetrics.heightPixels
}
/**
* 获取屏幕分辨率
*/
fun getScreenRatio(context: Context): String {
return getScreenHeight(context).toString() + "X" + getScreenWidth(context).toString()
}
/**
* dp转px
*/
fun dip2px(context: Context, dipValue: Float): Int {
val scale = context.resources.displayMetrics.density
return (dipValue * scale + 0.5f).toInt()
}
/**
* px转dp
*/
fun px2dip(context: Context, pxValue: Float): Int {
val scale = context.resources.displayMetrics.density
return (pxValue / scale + 0.5f).toInt()
}
}
}

View File

@ -0,0 +1,13 @@
package com.navinfo.volvo.tools
import com.google.gson.Gson
class GsonUtil {
companion object {
fun getInstance() = InstanceHelper.gson
}
object InstanceHelper {
val gson: Gson = Gson()
}
}

View File

@ -0,0 +1,54 @@
package com.navinfo.volvo.ui.adapter
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.ImageView
import android.widget.TextView
import androidx.recyclerview.widget.RecyclerView
import com.navinfo.volvo.R
import com.navinfo.volvo.db.dao.entity.Message
class MessageAdapter : RecyclerView.Adapter<MessageAdapter.MyViewHolder>() {
var itemList: MutableList<Message> = mutableListOf()
fun addItem(message: Message) {
itemList.add(message)
notifyItemInserted(itemList.size - 1)
}
fun setItem(messageList: MutableList<Message>){
itemList = messageList
notifyDataSetChanged()
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyViewHolder {
val view =
LayoutInflater.from(parent.context).inflate(R.layout.adapter_message, parent, false)
var viewHolder = MyViewHolder(view)
viewHolder.itemView.setOnClickListener {
}
return viewHolder
}
override fun onBindViewHolder(holder: MyViewHolder, position: Int) {
val message = itemList[position]
holder.toName.text = message.fromId
holder.messageText.text = message.message
holder.sendTime.text = message.sendDate
}
override fun getItemCount(): Int {
return itemList.size
}
inner class MyViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
var image: ImageView = itemView.findViewById(R.id.message_head_icon)
var toName: TextView = itemView.findViewById(R.id.message_to_username)
var sendTime: TextView = itemView.findViewById(R.id.message_send_time)
var status: TextView = itemView.findViewById(R.id.message_status)
var messageText: TextView = itemView.findViewById(R.id.message_text)
}
}

View File

@ -1,4 +1,4 @@
package com.navinfo.vivo.ui.dashboard package com.navinfo.volvo.ui.dashboard
import android.os.Bundle import android.os.Bundle
import android.view.LayoutInflater import android.view.LayoutInflater
@ -7,7 +7,7 @@ import android.view.ViewGroup
import android.widget.TextView import android.widget.TextView
import androidx.fragment.app.Fragment import androidx.fragment.app.Fragment
import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.ViewModelProvider
import com.navinfo.vivo.databinding.FragmentDashboardBinding import com.navinfo.volvo.databinding.FragmentDashboardBinding
class DashboardFragment : Fragment() { class DashboardFragment : Fragment() {

View File

@ -1,4 +1,4 @@
package com.navinfo.vivo.ui.dashboard package com.navinfo.volvo.ui.dashboard
import androidx.lifecycle.LiveData import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData import androidx.lifecycle.MutableLiveData

View File

@ -0,0 +1,92 @@
package com.navinfo.volvo.ui.home
import android.os.Bundle
import android.view.Display
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.Fragment
import androidx.lifecycle.Observer
import androidx.lifecycle.ViewModelProvider
import androidx.recyclerview.widget.DividerItemDecoration
import androidx.recyclerview.widget.LinearLayoutManager
import com.navinfo.volvo.R
import com.navinfo.volvo.databinding.FragmentHomeBinding
import com.navinfo.volvo.tools.DisplayUtil
import com.navinfo.volvo.ui.adapter.MessageAdapter
import com.yanzhenjie.recyclerview.*
import com.yanzhenjie.recyclerview.SwipeRecyclerView.LoadMoreListener
class HomeFragment : Fragment(), OnItemClickListener, OnItemMenuClickListener {
private var _binding: FragmentHomeBinding? = null
// This property is only valid between onCreateView and
// onDestroyView.
private val binding get() = _binding!!
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View {
val homeViewModel =
ViewModelProvider(this).get(HomeViewModel::class.java)
_binding = FragmentHomeBinding.inflate(inflater, container, false)
val root: View = binding.root
val recyclerview: SwipeRecyclerView = binding.homeMessageRecyclerview
recyclerview.adapter = null //先设置null否则会报错
//创建菜单选项
//注意:使用滑动菜单不能开启滑动删除,否则只有滑动删除没有滑动菜单
var mSwipeMenuCreator =
SwipeMenuCreator { _, rightMenu, position ->
//添加菜单自动添加至尾部
var deleteItem = SwipeMenuItem(context)
deleteItem.height = DisplayUtil.dip2px(context!!, 60f)
deleteItem.width = DisplayUtil.dip2px(context!!, 80f)
deleteItem.background = context!!.getDrawable(R.color.red)
deleteItem.text = context!!.getString(R.string.delete)
rightMenu.addMenuItem(deleteItem)
//分享
var shareItem = SwipeMenuItem(context)
shareItem.height = DisplayUtil.dip2px(context!!, 60f)
shareItem.width = DisplayUtil.dip2px(context!!, 80f)
shareItem.background = context!!.getDrawable(R.color.gray)
shareItem.text = context!!.getString(R.string.share)
shareItem.setTextColor(R.color.white)
rightMenu.addMenuItem(shareItem)
}
val layoutManager = LinearLayoutManager(context)
val adapter = MessageAdapter()
recyclerview.layoutManager = layoutManager
recyclerview.addItemDecoration(DividerItemDecoration(context, layoutManager.orientation))
recyclerview.setSwipeMenuCreator(mSwipeMenuCreator)
recyclerview.setOnItemClickListener(this)
recyclerview.useDefaultLoadMore()
recyclerview.setLoadMoreListener {
}
recyclerview.adapter = adapter
homeViewModel.getMessageList().observe(viewLifecycleOwner, Observer { contacts ->
adapter.setItem(contacts)
})
return root
}
override fun onDestroyView() {
super.onDestroyView()
_binding = null
}
override fun onItemClick(view: View?, adapterPosition: Int) {
}
override fun onItemClick(menuBridge: SwipeMenuBridge?, adapterPosition: Int) {
}
}

View File

@ -0,0 +1,34 @@
package com.navinfo.volvo.ui.home
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
import com.navinfo.volvo.db.dao.entity.Message
class HomeViewModel : ViewModel() {
private val messageList: LiveData<MutableList<Message>> =
MutableLiveData<MutableList<Message>>().apply {
value = mutableListOf<Message>()
value!!.add(Message())
value!!.add(Message())
value!!.add(Message())
value!!.add(Message())
value!!.add(Message())
value!!.add(Message())
value!!.add(Message())
value!!.add(Message())
value!!.add(Message())
value!!.add(Message())
value!!.add(Message())
value!!.add(Message())
value!!.add(Message())
value!!.add(Message())
value!!.add(Message())
value!!.add(Message())
}
fun getMessageList(): LiveData<MutableList<Message>> {
return messageList
}
}

View File

@ -1,4 +1,4 @@
package com.navinfo.vivo.ui.notifications package com.navinfo.volvo.ui.notifications
import android.os.Bundle import android.os.Bundle
import android.view.LayoutInflater import android.view.LayoutInflater
@ -7,7 +7,7 @@ import android.view.ViewGroup
import android.widget.TextView import android.widget.TextView
import androidx.fragment.app.Fragment import androidx.fragment.app.Fragment
import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.ViewModelProvider
import com.navinfo.vivo.databinding.FragmentNotificationsBinding import com.navinfo.volvo.databinding.FragmentNotificationsBinding
class NotificationsFragment : Fragment() { class NotificationsFragment : Fragment() {

View File

@ -1,4 +1,4 @@
package com.navinfo.vivo.ui.notifications package com.navinfo.volvo.ui.notifications
import androidx.lifecycle.LiveData import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData import androidx.lifecycle.MutableLiveData

View File

@ -0,0 +1,187 @@
package com.navinfo.volvo.ui.widget
import android.annotation.SuppressLint
import android.content.Context
import android.graphics.Rect
import android.util.AttributeSet
import android.view.*
import android.widget.Scroller
import androidx.core.view.forEach
import androidx.recyclerview.widget.RecyclerView
import java.lang.Math.abs
class SlideRecyclerView @JvmOverloads constructor(
context: Context,
attrs: AttributeSet? = null,
defStyleAttr: Int = 0
) : RecyclerView(context, attrs, defStyleAttr) {
//系统最小移动距离
private val mTouchSlop = ViewConfiguration.get(context).scaledTouchSlop
//最小有效速度
private val mMinVelocity = 600
//增加手势控制,双击快速完成侧滑
private var isDoubleClick = false
private var mGestureDetector: GestureDetector =
GestureDetector(context, object : GestureDetector.SimpleOnGestureListener() {
override fun onDoubleTap(e: MotionEvent?): Boolean {
e?.let { event ->
getSelectItem(event)
mItem?.let {
val deleteWith = it.getChildAt(it.childCount - 1).width
//触发移动至完全展开deleteWidth
if (it.scrollX == 0) {
mScroller.startScroll(0, 0, deleteWith, 0)
} else {
mScroller.startScroll(it.scrollX, 0, -it.scrollX, 0)
}
isDoubleClick = true
invalidate()
return true
}
}
//不进行拦截,只作为工具判断下双击
return false
}
})
//使用速度控制器,增加侧滑速度判定滑动成功,
//VelocityTracker 由native实现需要及时释放内存
private var mVelocityTracker: VelocityTracker? = null
//流畅滑动
private var mScroller = Scroller(context)
//当前选中item
private var mItem: ViewGroup? = null
//上次按下的横坐标
private var mLastX = 0f
//当前RecyclerView被上层ViewGroup分发到事件所有事件都会通过dispatchTouchEvent给到
override fun dispatchTouchEvent(ev: MotionEvent?): Boolean {
mGestureDetector.onTouchEvent(ev)
return super.dispatchTouchEvent(ev)
}
//viewGroup对子控件的事件拦截一旦拦截后续事件序列不会再调用onInterceptTouchEvent
override fun onInterceptTouchEvent(e: MotionEvent?): Boolean {
e?.let {
when (e.action) {
MotionEvent.ACTION_DOWN -> {
getSelectItem(e)
mLastX = e.x
}
MotionEvent.ACTION_MOVE -> {
//移动控件
return moveItem(e)
}
// MotionEvent.ACTION_UP -> {
// stopMove(e)
// }
}
}
return super.onInterceptTouchEvent(e)
}
@SuppressLint("ClickableViewAccessibility")
override fun onTouchEvent(e: MotionEvent?): Boolean {
e?.let {
when (e.action) {
MotionEvent.ACTION_MOVE -> {
moveItem(e)
mLastX = e.x
}
MotionEvent.ACTION_UP -> {
stopMove()
}
}
}
return super.onTouchEvent(e)
}
//活动结束
//判断一下结束的位置,补充或恢复位置
private fun stopMove() {
mItem?.let {
//如果移动过半,判定左划成功
val deleteWidth = it.getChildAt(it.childCount - 1).width
//如果整个移动过程速度大于600也判定滑动成功
//注意如果没有拦截ACTION_MOVE,mVelocityTracker是没有初始化的
var velocity = 0f
mVelocityTracker?.let { tracker ->
tracker.computeCurrentVelocity(1000)
velocity = tracker.xVelocity
}
//判断结束情况,移动过半或者向左速度很快都展开
if ((abs(it.scrollX) >= deleteWidth / 2f) || (velocity < -mMinVelocity)) {
//触发移动至完全展开
mScroller.startScroll(it.scrollX, 0, deleteWidth - it.scrollX, 0)
invalidate()
} else {
//如果移动未过半应恢复状态
mScroller.startScroll(it.scrollX, 0, -it.scrollX, 0)
invalidate()
}
}
//清除状态
mLastX = 0f
//mVeloctityTracker由native实现需要及时释放
mVelocityTracker?.apply {
clear()
recycle()
}
mVelocityTracker = null
}
//移动Item
//绝对值小于删除按钮长度随便移动,大于则不移动
@SuppressLint("Recycle")
private fun moveItem(e: MotionEvent): Boolean {
mItem?.let {
val dx = mLastX - e.x
//最小的移动距离应该舍弃onInterceptTouchEvent不拦截onTouchEvent内才更新mLastX
// if (abs(dx) > mTouchSlop) {
//检查mItem移动后应该在【-deleteLength0】内
val deleteWith = it.getChildAt(it.childCount - 1).width
if ((it.scrollX + dx) <= deleteWith && (it.scrollX + dx) >= 0) {
//触发移动
it.scrollBy(dx.toInt(), 0)
//触发速度计算
//这里Rectycle不存在问题一旦返回true就会拦截事件就会到达ACTION_UP去回收
mVelocityTracker = mVelocityTracker ?: VelocityTracker.obtain()
mVelocityTracker!!.addMovement(e)
return true
// }
}
}
return false
}
//获取点击位置
//通过点击的y坐标除以Item高度得出
private fun getSelectItem(e: MotionEvent) {
val frame = Rect()
mItem = null
forEach {
if (it.visibility != GONE) {
it.getHitRect(frame)
if (frame.contains(e.x.toInt(), e.y.toInt())) {
mItem = it as ViewGroup
}
}
}
}
//流畅地滑动
override fun computeScroll() {
if (mScroller.computeScrollOffset()) {
mItem?.scrollBy(mScroller.currX, mScroller.currY)
postInvalidate()
}
}
}

View File

@ -4,7 +4,7 @@
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"> >
<com.google.android.material.bottomnavigation.BottomNavigationView <com.google.android.material.bottomnavigation.BottomNavigationView
android:id="@+id/nav_view" android:id="@+id/nav_view"
@ -22,7 +22,7 @@
android:id="@+id/nav_host_fragment_activity_main" android:id="@+id/nav_host_fragment_activity_main"
android:name="androidx.navigation.fragment.NavHostFragment" android:name="androidx.navigation.fragment.NavHostFragment"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="0dp"
app:defaultNavHost="true" app:defaultNavHost="true"
app:layout_constraintBottom_toTopOf="@id/nav_view" app:layout_constraintBottom_toTopOf="@id/nav_view"
app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintLeft_toLeftOf="parent"

View File

@ -0,0 +1,54 @@
<?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="wrap_content">
<ImageView
android:id="@+id/message_head_icon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="8dp"
android:src="@mipmap/ic_launcher"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/message_to_username"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="8dp"
android:text="问候对象"
android:ellipsize="end"
android:textSize="16sp"
android:textStyle="bold"
app:layout_constraintLeft_toRightOf="@id/message_head_icon"
app:layout_constraintTop_toTopOf="@id/message_head_icon" />
<TextView
android:id="@+id/message_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="8dp"
android:text="信息内容"
app:layout_constraintBottom_toBottomOf="@id/message_head_icon"
app:layout_constraintLeft_toRightOf="@id/message_head_icon" />
<TextView
android:id="@+id/message_send_time"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginRight="8dp"
android:text="日期"
app:layout_constraintTop_toTopOf="@id/message_head_icon"
app:layout_constraintEnd_toEndOf="parent"
/>
<TextView
android:id="@+id/message_status"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="8dp"
android:text="状态"
app:layout_constraintBottom_toBottomOf="@id/message_head_icon"
app:layout_constraintEnd_toEndOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>

View File

@ -4,7 +4,7 @@
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
tools:context=".ui.dashboard.DashboardFragment"> tools:context="com.navinfo.volvo.ui.dashboard.DashboardFragment">
<TextView <TextView
android:id="@+id/text_dashboard" android:id="@+id/text_dashboard"

View File

@ -1,22 +1,12 @@
<?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" <com.yanzhenjie.recyclerview.SwipeRecyclerView
android:id="@+id/home_message_recyclerview"
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"
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
tools:context=".ui.home.HomeFragment"> tools:context=".ui.home.HomeFragment"
>
<TextView </com.yanzhenjie.recyclerview.SwipeRecyclerView>
android:id="@+id/text_home"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:layout_marginTop="8dp"
android:layout_marginEnd="8dp"
android:textAlignment="center"
android:textSize="20sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>

View File

@ -7,19 +7,19 @@
<fragment <fragment
android:id="@+id/navigation_home" android:id="@+id/navigation_home"
android:name="com.navinfo.vivo.ui.home.HomeFragment" android:name="com.navinfo.volvo.ui.home.HomeFragment"
android:label="@string/title_home" android:label="@string/title_home"
tools:layout="@layout/fragment_home" /> tools:layout="@layout/fragment_home" />
<fragment <fragment
android:id="@+id/navigation_dashboard" android:id="@+id/navigation_dashboard"
android:name="com.navinfo.vivo.ui.dashboard.DashboardFragment" android:name="com.navinfo.volvo.ui.dashboard.DashboardFragment"
android:label="@string/title_dashboard" android:label="@string/title_dashboard"
tools:layout="@layout/fragment_dashboard" /> tools:layout="@layout/fragment_dashboard" />
<fragment <fragment
android:id="@+id/navigation_notifications" android:id="@+id/navigation_notifications"
android:name="com.navinfo.vivo.ui.notifications.NotificationsFragment" android:name="com.navinfo.volvo.ui.notifications.NotificationsFragment"
android:label="@string/title_notifications" android:label="@string/title_notifications"
tools:layout="@layout/fragment_notifications" /> tools:layout="@layout/fragment_notifications" />
</navigation> </navigation>

View File

@ -1,6 +1,6 @@
<resources xmlns:tools="http://schemas.android.com/tools"> <resources xmlns:tools="http://schemas.android.com/tools">
<!-- Base application theme. --> <!-- Base application theme. -->
<style name="Theme.NavinfoVivo" parent="Theme.MaterialComponents.DayNight.DarkActionBar"> <style name="Theme.NavinfoVolvo" parent="Theme.MaterialComponents.DayNight.DarkActionBar">
<!-- Primary brand color. --> <!-- Primary brand color. -->
<item name="colorPrimary">@color/purple_200</item> <item name="colorPrimary">@color/purple_200</item>
<item name="colorPrimaryVariant">@color/purple_700</item> <item name="colorPrimaryVariant">@color/purple_700</item>

View File

@ -0,0 +1,8 @@
<resources>
<string name="app_name">NavinfoVolvo</string>
<string name="title_home">Home</string>
<string name="title_dashboard">Dashboard</string>
<string name="title_notifications">Notifications</string>
<string name="delete">删除</string>
<string name="share">分享</string>
</resources>

View File

@ -7,4 +7,6 @@
<color name="teal_700">#FF018786</color> <color name="teal_700">#FF018786</color>
<color name="black">#FF000000</color> <color name="black">#FF000000</color>
<color name="white">#FFFFFFFF</color> <color name="white">#FFFFFFFF</color>
<color name="red">#FFFF0000</color>
<color name="gray">#5E5E5E</color>
</resources> </resources>

View File

@ -1,6 +1,8 @@
<resources> <resources>
<string name="app_name">NavinfoVivo</string> <string name="app_name">NavinfoVolvo</string>
<string name="title_home">Home</string> <string name="title_home">Home</string>
<string name="title_dashboard">Dashboard</string> <string name="title_dashboard">Dashboard</string>
<string name="title_notifications">Notifications</string> <string name="title_notifications">Notifications</string>
<string name="delete">Del</string>
<string name="share">Share</string>
</resources> </resources>

View File

@ -1,6 +1,6 @@
<resources xmlns:tools="http://schemas.android.com/tools"> <resources xmlns:tools="http://schemas.android.com/tools">
<!-- Base application theme. --> <!-- Base application theme. -->
<style name="Theme.NavinfoVivo" parent="Theme.MaterialComponents.DayNight.DarkActionBar"> <style name="Theme.NavinfoVolvo" parent="Theme.MaterialComponents.DayNight.DarkActionBar">
<!-- Primary brand color. --> <!-- Primary brand color. -->
<item name="colorPrimary">@color/purple_500</item> <item name="colorPrimary">@color/purple_500</item>
<item name="colorPrimaryVariant">@color/purple_700</item> <item name="colorPrimaryVariant">@color/purple_700</item>

View File

@ -1,4 +1,4 @@
package com.navinfo.vivo package com.navinfo.volvo
import org.junit.Test import org.junit.Test

View File

@ -24,5 +24,5 @@ dependencyResolutionManagement {
mavenCentral() mavenCentral()
} }
} }
rootProject.name = "NavinfoVivo" rootProject.name = "NavinfoVolvo"
include ':app' include ':app'