[清扫车]清扫车当前任务选择菜单布局处理

This commit is contained in:
bxb
2023-01-30 11:39:57 +08:00
parent 21a7e59b82
commit ff750e7d00
19 changed files with 224 additions and 111 deletions

View File

@@ -0,0 +1,10 @@
package com.mogo.och.sweeper.constant
/**
* 当前任务操作菜单
*/
enum class TaskMenuTypeEnum(val code: Int) {
JUMP_OVER_TASK( 1),//跳过任务
END_TASK( 2),//结束任务
CANCEL_TASK( 3);//取消
}

View File

@@ -24,8 +24,8 @@ import com.mogo.map.uicontroller.IMogoMapUIController;
import com.mogo.map.uicontroller.VisualAngleMode;
import com.mogo.och.sweeper.R;
import com.mogo.och.sweeper.ui.SweeperOperatePanelView;
import com.mogo.och.sweeper.ui.popwindow.MenuPopWindow;
import com.mogo.och.sweeper.view.SweeperCurrentTaskInfoView;
import com.mogo.och.sweeper.view.SweeperTaskMenuView;
import com.mogo.och.sweeper.view.SweeperTrafficDataView;
import com.mogo.och.sweeper.view.SweeperWorkModeView;
@@ -60,8 +60,6 @@ public abstract class BaseSweeperTabFragment<V extends IView, P extends Presente
private SweeperWorkModeView mClWorkMode;
//清扫车模式选择面板
private SweeperOperatePanelView mOperatePanel;
//当前任务操作菜单
private SweeperTaskMenuView mTaskMenu;
//当前任务面板
private SweeperCurrentTaskInfoView mCurrentTaskView;
//人工驾驶地图Fragment
@@ -91,7 +89,6 @@ public abstract class BaseSweeperTabFragment<V extends IView, P extends Presente
mSwitchMapModeImage = findViewById(R.id.sweeper_switch_model_icon);
mClWorkMode = findViewById(R.id.sweeper_cl_work_mode);
mOperatePanel = findViewById(R.id.module_mogo_och_sweeper_operate_panel);
mTaskMenu = findViewById(R.id.sweeper_task_menu);
mCurrentTaskView = findViewById(R.id.sweeper_current_task_view);
mSettingBtn = findViewById(R.id.module_mogo_och_setting_layout);
mBadcaseBtn = findViewById(R.id.module_mogo_och_badcase_rl);
@@ -143,37 +140,32 @@ public abstract class BaseSweeperTabFragment<V extends IView, P extends Presente
private void initListener() {
MogoMapListenerHandler.Companion.getMogoMapListenerHandler().registerHostMapListener(TAG, this);
//清扫模式选择面板打开关闭处理
mClWorkMode.setOnClickListener(v -> {
if (mOperatePanel.getVisibility() == View.VISIBLE) {
mOperatePanel.setVisibility(View.GONE);
} else {
mOperatePanel.setVisibility(View.VISIBLE);
}
});
//任务操作菜单打开关闭处理
mCurrentTaskView.getIvMore().setOnClickListener(v -> {
if (mTaskMenu.getVisibility() == View.VISIBLE) {
mTaskMenu.setVisibility(View.GONE);
} else {
mTaskMenu.setVisibility(View.VISIBLE);
}
});
}
/**
* 任务列表面板
* 任务列表面板隐藏或显示
*
* @return
*/
public void setTaskListPanelView(boolean isShow) {
public void setShowTaskListPanelView(boolean isShow) {
if (isShow) {
panelView.setVisibility(View.VISIBLE);
} else {
panelView.setVisibility(View.GONE);
}
}
/**
* 当前任务面板隐藏或显示
*
* @return
*/
public void setShowCurrentTaskPanelView(boolean isShow) {
if (isShow) {
mCurrentTaskView.setVisibility(View.VISIBLE);
} else {
mCurrentTaskView.setVisibility(View.GONE);
}
}
/**
* 清扫模式展示面板
*
@@ -191,16 +183,6 @@ public abstract class BaseSweeperTabFragment<V extends IView, P extends Presente
public SweeperCurrentTaskInfoView getCurrentTaskPanelView() {
return mCurrentTaskView;
}
/**
* 获取菜单view
*
* @return
*/
public View getTaskMenuView() {
return mTaskMenu;
}
/**
* 清扫车任务列表面板view在{@link #initViews()}时候添加到container中
*

View File

@@ -2,18 +2,24 @@ package com.mogo.och.sweeper.fragment
import android.view.View
import androidx.recyclerview.widget.LinearLayoutManager
import com.mogo.eagle.core.utilcode.util.ToastUtils
import com.mogo.och.sweeper.R
import com.mogo.och.sweeper.bean.TaskInfoBean
import com.mogo.och.sweeper.constant.TaskMenuTypeEnum
import com.mogo.och.sweeper.presenter.SweeperPresenter
import com.mogo.och.sweeper.ui.adapter.TaskListAdapter
import com.mogo.och.sweeper.ui.popwindow.MenuPopWindow
import kotlinx.android.synthetic.main.fragment_och_sweeper.*
import kotlinx.android.synthetic.main.sweeper_task_menu.*
/**
* 清扫车主界面
*/
class SweeperFragment : BaseSweeperTabFragment<SweeperFragment?, SweeperPresenter?>() {
class SweeperFragment : BaseSweeperTabFragment<SweeperFragment?, SweeperPresenter?>(),MenuPopWindow.OnMenuItemOnClickListener {
private var mAdapter: TaskListAdapter? = null
//当前任务操作菜单
private var mTaskMenuPopWindow: MenuPopWindow? = null
//
private var mPosition:Int=-1
private val mutableList: MutableList<TaskInfoBean> by lazy { mutableListOf() }
override fun getTagName(): String {
return "SweepersFragment"
@@ -37,6 +43,7 @@ class SweeperFragment : BaseSweeperTabFragment<SweeperFragment?, SweeperPresente
rvTaskList?.layoutManager = linearLayoutManager
rvTaskList?.adapter = mAdapter
mAdapter?.setOnTaskItemClickListener(onTaskItemClickListener)
mTaskMenuPopWindow= context?.let { MenuPopWindow(it,this) }
initListener()
}
@@ -82,20 +89,47 @@ class SweeperFragment : BaseSweeperTabFragment<SweeperFragment?, SweeperPresente
* 设置各种监听事件
*/
private fun initListener() {
tvTaskFinish.setOnClickListener {
setTaskListPanelView(true)
taskMenuView.visibility = View.GONE
}
tvTaskConfirm.setOnClickListener {
setTaskListPanelView(false)
currentTaskPanelView.visibility = View.VISIBLE
setShowTaskListPanelView(false)
setShowCurrentTaskPanelView(true)
currentTaskPanelView.setData(mutableList,mPosition)
}
//清扫模式选择面板打开关闭处理
workModePanelView.setOnClickListener { v: View? ->
}
//任务操作菜单打开关闭处理
currentTaskPanelView.getIvMore().setOnClickListener { v: View? ->
if (mTaskMenuPopWindow?.isShowing!=true) {
mTaskMenuPopWindow?.showAsDropDown(
workModePanelView,
resources.getDimension(R.dimen.dp_580).toInt(),
resources.getDimension(R.dimen.dp_36).toInt()
)
} else {
mTaskMenuPopWindow?.dismiss()
}
}
}
private val onTaskItemClickListener = object : TaskListAdapter.TaskItemClickListener {
override fun onItemClick(position: Int) {
mAdapter?.selectPosition(position)
mPosition=position
tvTaskConfirm.isSelected=true
}
}
override fun onMenuItemClick(itemType: TaskMenuTypeEnum) {
when(itemType.code){
TaskMenuTypeEnum.JUMP_OVER_TASK.code->{
setShowTaskListPanelView(true)
setShowCurrentTaskPanelView(false)
}
TaskMenuTypeEnum.END_TASK.code->{
setShowTaskListPanelView(true)
setShowCurrentTaskPanelView(false)
}
}
}
}

View File

@@ -0,0 +1,91 @@
package com.mogo.och.sweeper.ui.popwindow
import android.content.Context
import android.graphics.Color
import android.graphics.drawable.ColorDrawable
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup.LayoutParams
import android.widget.PopupWindow
import android.widget.TextView
import com.mogo.och.sweeper.R
import com.mogo.och.sweeper.constant.TaskMenuTypeEnum
/**
* 当前任务操作菜单栏
*/
class MenuPopWindow : PopupWindow, View.OnClickListener {
private var mTvJumpOverTask: TextView? = null
private var mTaskJumpLineView: View? = null
private var mTvEndTask: TextView? = null
private var mTvCancelTask: TextView? = null
private var mMenuItemClickListener:OnMenuItemOnClickListener?=null
constructor(context: Context,menuItemClickListener:OnMenuItemOnClickListener) : super(context) {
init(context)
this.mMenuItemClickListener=menuItemClickListener
}
/**
* 初始化布局
*/
private fun init(context: Context) {
setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT))
var view: View = LayoutInflater.from(context).inflate(R.layout.sweeper_task_menu, null)
mTvJumpOverTask = view.findViewById(R.id.tvJumpOverTask)
mTaskJumpLineView = view.findViewById(R.id.taskJumpLineView)
mTvEndTask = view.findViewById(R.id.tvEndTask)
mTvCancelTask = view.findViewById(R.id.tvCancelTask)
mTvJumpOverTask?.setOnClickListener(this)
mTvEndTask?.setOnClickListener(this)
mTvCancelTask?.setOnClickListener(this)
width = context.resources.getDimension(R.dimen.dp_174).toInt()
height = LayoutParams.WRAP_CONTENT
contentView = view
isFocusable = true
isOutsideTouchable = true
}
/**
* 设置是否是手动任务
* 1云端自动驾驶任务
* 2云端手动驾驶任务
* 3: 运营任务
*/
fun setMenuView(type: Int) {
if (type == 1) {
mTvJumpOverTask?.visibility = View.GONE
mTaskJumpLineView?.visibility = View.GONE
} else {
mTvJumpOverTask?.visibility = View.VISIBLE
mTaskJumpLineView?.visibility = View.VISIBLE
}
}
interface OnMenuItemOnClickListener {
fun onMenuItemClick(itemType: TaskMenuTypeEnum)
}
override fun onClick(v: View) {
when(v.id){
R.id.tvJumpOverTask->{
mMenuItemClickListener?.onMenuItemClick(TaskMenuTypeEnum.JUMP_OVER_TASK)
dismiss()
}
R.id.tvEndTask->{
mMenuItemClickListener?.onMenuItemClick(TaskMenuTypeEnum.END_TASK)
dismiss()
}
R.id.tvCancelTask->{
mMenuItemClickListener?.onMenuItemClick(TaskMenuTypeEnum.CANCEL_TASK)
dismiss()
}
}
}
}

View File

@@ -3,8 +3,11 @@ package com.mogo.och.sweeper.view
import android.content.Context
import android.util.AttributeSet
import android.view.LayoutInflater
import android.view.View
import androidx.constraintlayout.widget.ConstraintLayout
import com.mogo.och.sweeper.R
import com.mogo.och.sweeper.bean.TaskInfoBean
import kotlinx.android.synthetic.main.sweeper_subtask_view.view.*
/**
* 子任务View
@@ -21,4 +24,14 @@ class SubTaskView : ConstraintLayout {
private fun initView(context: Context) {
LayoutInflater.from(context).inflate(R.layout.sweeper_subtask_view, this)
}
/**
* 设置子任务信息
*/
fun setData(taskInfo:TaskInfoBean,isSelect:Boolean=false,isLastTask:Boolean=false){
tvSubTaskName.text = taskInfo.taskName
tvSubTaskName.setTextColor(if (isSelect) 0x3BD2FF else 0xFFFFFF)
ivSubTask.setImageResource(if (isSelect) R.drawable.sweeper_icon_select_subtask else R.drawable.sweeper_icon_not_select_subtask)
ivRightDownArrow.visibility=if (isLastTask) View.GONE else View.VISIBLE
}
}

View File

@@ -3,17 +3,17 @@ package com.mogo.och.sweeper.view
import android.content.Context
import android.util.AttributeSet
import android.view.LayoutInflater
import android.view.View
import android.widget.ImageView
import androidx.constraintlayout.widget.ConstraintLayout
import com.mogo.och.sweeper.R
import com.mogo.och.sweeper.bean.TaskInfoBean
import kotlinx.android.synthetic.main.sweeper_current_task_info.view.*
/**
* 清扫车当前任务信息展示
*/
class SweeperCurrentTaskInfoView : ConstraintLayout {
private var menuView: SweeperTaskMenuView? = null
constructor(context: Context) : super(context) {}
constructor(context: Context, attrs: AttributeSet?) : super(context, attrs) {
initView(context)
@@ -26,11 +26,41 @@ class SweeperCurrentTaskInfoView : ConstraintLayout {
LayoutInflater.from(context).inflate(R.layout.sweeper_current_task_info, this)
}
fun getIvMore(): ImageView = ivMore
/**
* 设置当前任务信息
* 设置当前任务数据
*/
fun setCurrentTask(sweeperTaskMenuView: SweeperTaskMenuView?) {
menuView = sweeperTaskMenuView
fun setData(listTask: List<TaskInfoBean>, currentPosition: Int) {
if (listTask.size == 1) {
preSubTask.setData(listTask[currentPosition], isSelect=true,isLastTask=true)
currentSubTask.visibility = View.INVISIBLE
lastSubTask.visibility = View.INVISIBLE
} else if (listTask.size == 2) {
if (currentPosition==0){
preSubTask.setData(listTask[currentPosition], isSelect=true)
currentSubTask.setData(listTask[1], isSelect=true)
}else{
preSubTask.setData(listTask[currentPosition - 1])
currentSubTask.setData(listTask[currentPosition], isSelect=true,isLastTask=true)
}
lastSubTask.visibility = View.INVISIBLE
} else {
//当前正在执行的任务是第一个子任务
if (currentPosition == 0) {
preSubTask.setData(listTask[currentPosition], isSelect=true)
currentSubTask.setData(listTask[1])
lastSubTask.setData(listTask[2], isLastTask=true)
//当前正在执行的任务是最后一个子任务
} else if (currentPosition == listTask.size - 1) {
preSubTask.setData(listTask[currentPosition - 2], isSelect=true)
currentSubTask.setData(listTask[currentPosition-1])
lastSubTask.setData(listTask[currentPosition], isSelect=true,isLastTask=true)
} else {
preSubTask.setData(listTask[currentPosition - 1])
currentSubTask.setData(listTask[currentPosition],isSelect=true)
lastSubTask.setData(listTask[currentPosition + 1],isLastTask=true)
}
}
}
fun getIvMore():ImageView=ivMore
}

View File

@@ -1,40 +0,0 @@
package com.mogo.och.sweeper.view
import android.content.Context
import android.util.AttributeSet
import android.view.LayoutInflater
import android.view.View
import androidx.constraintlayout.widget.ConstraintLayout
import com.mogo.och.sweeper.R
import kotlinx.android.synthetic.main.sweeper_task_menu.view.*
/**
* 清扫车任务操作菜单
*/
class SweeperTaskMenuView:ConstraintLayout {
constructor(context: Context) : super(context)
constructor(context: Context, attrs: AttributeSet?) : super(context, attrs){
initView(context)
}
constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int) : super(context, attrs, defStyleAttr)
constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int, defStyleRes: Int) : super(context, attrs, defStyleAttr, defStyleRes)
private fun initView(context: Context) {
LayoutInflater.from(context).inflate(R.layout.sweeper_task_menu, this)
}
/**
* 设置是否是手动任务
* 1云端自动驾驶任务
* 2云端手动驾驶任务
* 3: 运营任务
*/
fun setMenuView(type:Int){
if (type==1){
tvTaskJumpOver.visibility= View.GONE
taskJumpLineView.visibility= View.GONE
}else{
tvTaskJumpOver.visibility= View.VISIBLE
taskJumpLineView.visibility= View.VISIBLE
}
}
}

View File

@@ -151,7 +151,7 @@ class SweeperTrafficDataView : ConstraintLayout,
private val limitingVelocityListener: LimitingVelocityListener = object : LimitingVelocityListener {
override fun onLimitingVelocityChange(limitingVelocity: Int) {
//设置限速
sweeperLimitingVelocity!!.updateLimitingSpeed(limitingVelocity)
sweeperLimitingVelocity?.updateLimitingSpeed(limitingVelocity)
}
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 338 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.7 KiB

View File

@@ -9,7 +9,7 @@
<size
android:width="30dp"
android:height="30dp" />
<gradient android:angle="270" android:startColor="#2F6296" android:endColor="#263A5B"/>
<solid android:color="#FF2F6296"/>
</shape>
</rotate>
</item>

View File

@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle">
<gradient android:angle="270" android:startColor="#2F6296" android:endColor="#263A5B"/>
<gradient android:angle="0" android:startColor="#FF2F6296" android:endColor="#FF263A5B"/>
<corners android:radius="@dimen/dp_16"/>
</shape>

View File

@@ -26,7 +26,7 @@
android:layout_width="20dp"
android:layout_height="20dp"
android:scaleType="center"
android:src="@drawable/sweeper_icon_current_subtask"
android:src="@drawable/sweeper_icon_select_subtask"
app:layout_constraintBottom_toBottomOf="@id/module_mogo_och_sweeper_station_name"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintVertical_bias="0.4"

View File

@@ -37,14 +37,6 @@
android:layout_marginBottom="@dimen/dp_30"
android:visibility="visible"
/>
<!--当前任务操作面板-->
<com.mogo.och.sweeper.view.SweeperTaskMenuView
android:id="@+id/sweeper_task_menu"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintStart_toEndOf="@+id/sweeper_cl_work_mode"
app:layout_constraintTop_toBottomOf="@+id/sweeper_cl_work_mode"
android:visibility="gone"/>
<!--清扫任务列表面板-->
<FrameLayout
android:id="@+id/module_mogo_och_task_list_container"

View File

@@ -78,7 +78,7 @@
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"/>
<com.mogo.och.sweeper.view.SubTaskView
android:id="@+id/currentSubTask"
android:id="@+id/preSubTask"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_constraintTop_toBottomOf="@+id/viewTaskInfoLine"
@@ -87,10 +87,10 @@
android:layout_marginTop="@dimen/dp_30"
/>
<com.mogo.och.sweeper.view.SubTaskView
android:id="@+id/nextSubTask"
android:id="@+id/currentSubTask"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_constraintTop_toBottomOf="@+id/currentSubTask"
app:layout_constraintTop_toBottomOf="@+id/preSubTask"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
android:layout_marginTop="@dimen/dp_16"
@@ -99,7 +99,7 @@
android:id="@+id/lastSubTask"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_constraintTop_toBottomOf="@+id/nextSubTask"
app:layout_constraintTop_toBottomOf="@+id/currentSubTask"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
android:layout_marginTop="@dimen/dp_16"

View File

@@ -20,7 +20,7 @@
android:id="@+id/ivSubTask"
android:layout_width="@dimen/dp_40"
android:layout_height="@dimen/dp_40"
android:src="@drawable/sweeper_icon_current_subtask"
android:src="@drawable/sweeper_icon_not_select_subtask"
app:layout_constraintTop_toTopOf="@+id/tvSubTaskName"
app:layout_constraintBottom_toBottomOf="@+id/tvSubTaskName"
app:layout_constraintEnd_toStartOf="@+id/tvSubTaskName"

View File

@@ -23,7 +23,7 @@
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"/>
<TextView
android:id="@+id/tvTaskJumpOver"
android:id="@+id/tvJumpOverTask"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintStart_toEndOf="@+id/ivTriangle"
@@ -41,11 +41,11 @@
app:layout_constraintEnd_toEndOf="parent"
android:layout_marginTop="@dimen/dp_20"
android:background="#A6CEFF"
app:layout_constraintTop_toBottomOf="@+id/tvTaskJumpOver"
app:layout_constraintTop_toBottomOf="@+id/tvJumpOverTask"
android:layout_marginStart="@dimen/dp_16"
android:layout_marginEnd="@dimen/dp_16"/>
<TextView
android:id="@+id/tvTaskFinish"
android:id="@+id/tvEndTask"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintStart_toEndOf="@+id/ivTriangle"
@@ -63,11 +63,11 @@
app:layout_constraintEnd_toEndOf="parent"
android:layout_marginTop="@dimen/dp_20"
android:background="#A6CEFF"
app:layout_constraintTop_toBottomOf="@+id/tvTaskFinish"
app:layout_constraintTop_toBottomOf="@+id/tvEndTask"
android:layout_marginStart="@dimen/dp_16"
android:layout_marginEnd="@dimen/dp_16"/>
<TextView
android:id="@+id/tvTaskCancel"
android:id="@+id/tvCancelTask"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintStart_toEndOf="@+id/ivTriangle"
@@ -82,7 +82,7 @@
android:layout_height="@dimen/dp_16"
app:layout_constraintStart_toEndOf="@+id/ivTriangle"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toBottomOf="@+id/tvTaskCancel"/>
app:layout_constraintTop_toBottomOf="@+id/tvCancelTask"/>
<com.mogo.och.common.module.wigets.OCHShapeBlurView
android:layout_width="0dp"
android:layout_height="0dp"
@@ -94,5 +94,6 @@
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"/>
app:layout_constraintEnd_toEndOf="parent"
android:visibility="gone"/>
</androidx.constraintlayout.widget.ConstraintLayout>