[3.4.0][Feat]新增蘑菇咨询功能

This commit is contained in:
chenfufeng
2023-07-19 18:39:15 +08:00
parent 8c78b2793a
commit d91a888290
14 changed files with 334 additions and 24 deletions

View File

@@ -20,15 +20,7 @@ import com.mogo.och.taxi.passenger.presenter.BaseTaxiPassengerPresenter
import com.mogo.och.taxi.passenger.ui.bottom.BottomBar
import com.mogo.och.taxi.passenger.ui.arrived.ArrivedView
import com.mogo.och.taxi.passenger.ui.startautopilot.StartAutopilotView
import kotlinx.android.synthetic.main.taxi_p_base_fragment.aciv_xiaozhi_normal
import kotlinx.android.synthetic.main.taxi_p_base_fragment.bottom
import kotlinx.android.synthetic.main.taxi_p_base_fragment.ck_setting
import kotlinx.android.synthetic.main.taxi_p_base_fragment.itinerary
import kotlinx.android.synthetic.main.taxi_p_base_fragment.mapBizView
import kotlinx.android.synthetic.main.taxi_p_base_fragment.overMapView
import kotlinx.android.synthetic.main.taxi_p_base_fragment.pcnActionView
import kotlinx.android.synthetic.main.taxi_p_base_fragment.romaPView
import kotlinx.android.synthetic.main.taxi_p_base_fragment.rv_location_center
import kotlinx.android.synthetic.main.taxi_p_base_fragment.*
import java.lang.ref.WeakReference
/**
@@ -93,6 +85,7 @@ class TaxiPassengerBaseFragment() :
rv_location_center.visibility = View.VISIBLE
pcnActionView.visibility = View.VISIBLE
CallerHmiManager.showTrafficLightView()
infoVideoView.visibility = View.GONE
}
BottomBar.SelectView.OVERMAPVIEW -> {
overMapView.visibility = View.VISIBLE
@@ -103,6 +96,7 @@ class TaxiPassengerBaseFragment() :
rv_location_center.visibility = View.VISIBLE
pcnActionView.visibility = View.VISIBLE
CallerHmiManager.showTrafficLightView()
infoVideoView.visibility = View.GONE
}
BottomBar.SelectView.VIDEO -> {
overMapView.visibility = View.GONE
@@ -113,6 +107,7 @@ class TaxiPassengerBaseFragment() :
rv_location_center.visibility = View.GONE
pcnActionView.visibility = View.GONE
CallerHmiManager.hideTrafficLightView()
infoVideoView.visibility = View.VISIBLE
}
}

View File

@@ -0,0 +1,214 @@
package com.mogo.och.taxi.passenger.ui.video
import android.content.Context
import android.graphics.Color
import android.util.AttributeSet
import android.view.LayoutInflater
import android.view.View
import android.widget.FrameLayout
import androidx.constraintlayout.widget.ConstraintLayout
import androidx.recyclerview.widget.RecyclerView
import com.mogo.och.taxi.passenger.R
import com.mogo.och.taxi.passenger.bean.TaxiPassengerVideoPlay
import com.mogo.och.taxi.passenger.ui.video.layoutmanage.CarouselLayoutManager
import com.mogo.och.taxi.passenger.ui.video.layoutmanage.CarouselZoomPostLayoutListener
import com.mogo.och.taxi.passenger.ui.video.layoutmanage.CenterScrollListener
import com.mogo.och.taxi.passenger.widget.ConsultVideoPlayer
import com.mogo.och.taxi.passenger.widget.indicator.IndicatorView
import com.mogo.och.taxi.passenger.widget.indicator.enums.IndicatorOrientation
import com.mogo.och.taxi.passenger.widget.indicator.enums.IndicatorSlideMode
import com.mogo.och.taxi.passenger.widget.indicator.enums.IndicatorStyle
import com.shuyu.gsyvideoplayer.video.base.GSYVideoView
import kotlin.math.floor
/**
* @author ChenFufeng
* 蘑菇资讯视频
*/
internal class InfoVideoView @JvmOverloads constructor(
context: Context,
attrs: AttributeSet? = null,
defStyleAttr: Int = 0
) : FrameLayout(
context,
attrs,
defStyleAttr
) {
companion object{
private const val TAG = "VideoView"
}
init {
LayoutInflater.from(context).inflate(R.layout.taxi_p_mogo_video_layout, this, true)
initView()
}
private var rvVideoPlaylist: RecyclerView? = null
private lateinit var indicatorView: IndicatorView
private lateinit var clContain: ConstraintLayout
private val arrayListOf by lazy {
arrayListOf<TaxiPassengerVideoPlay>().apply {
add(TaxiPassengerVideoPlay(
"https://img.zhidaohulian.com/fileServer/online_car_hailing/1655708596763/全车型混剪增加红旗车队.m4v",
"https://img.zhidaohulian.com/fileServer/online_car_hailing/1655969511280/车队.png",
"蘑菇车联覆盖生活的方方面面"
))
add(TaxiPassengerVideoPlay(
"https://img.zhidaohulian.com/fileServer/online_car_hailing/1655708554279/红旗车队.m4v",
"https://img.zhidaohulian.com/fileServer/online_car_hailing/1655969553174/红旗重新排版.png",
"蘑菇车联之红旗车队"
))
add(
com.mogo.och.taxi.passenger.bean.TaxiPassengerVideoPlay(
"https://img.zhidaohulian.com/fileServer/online_car_hailing/1655708499497/大运会合作解说版.m4v",
"https://img.zhidaohulian.com/fileServer/online_car_hailing/1655969536177/大运会.png",
"蘑菇车联牵手成都大运会"
)
)
add(
TaxiPassengerVideoPlay(
"https://img.zhidaohulian.com/fileServer/online_car_hailing/1655708409810/20210610重新排版3屏.m4v",
"https://img.zhidaohulian.com/fileServer/online_car_hailing/1655969579713/三屏.png",
"多视角体验蘑菇车联自动驾驶"
)
)
}
}
fun exitFullScreenMode() {
val carouselLayoutManager = rvVideoPlaylist?.layoutManager as CarouselLayoutManager
val (centerItemPosition: Int, player) = getPlayer(carouselLayoutManager)
player?.let {
it.exitFullScreenMode()
}
}
override fun onAttachedToWindow() {
super.onAttachedToWindow()
configPage()
}
override fun onVisibilityChanged(changedView: View, visibility: Int) {
super.onVisibilityChanged(changedView, visibility)
val carouselLayoutManager = rvVideoPlaylist?.layoutManager as CarouselLayoutManager
val (centerItemPosition: Int, player) = getPlayer(carouselLayoutManager)
when (visibility) {
View.VISIBLE -> {
player?.let {
if (!player.isIfCurrentIsFullscreen) {
when (player.currentState) {
GSYVideoView.CURRENT_STATE_PAUSE -> {
player.onVideoResume(false)
}
else -> {}
}
}
}
}
else -> {
player?.let {
if (!player.isIfCurrentIsFullscreen) {
player.onVideoPause()
}
}
}
}
}
private fun initView() {
rvVideoPlaylist = findViewById(R.id.infoVideoPlaylist)
indicatorView = findViewById(R.id.infoIndicatorView)
clContain = findViewById(R.id.infoContainer)
}
private fun configPage() {
// FullVideoUtils.dismissOverlayView(true)
initData()
}
private fun initData() {
val carouselLayoutManager = CarouselLayoutManager(CarouselLayoutManager.HORIZONTAL, true)
carouselLayoutManager.setPostLayoutListener(CarouselZoomPostLayoutListener())
carouselLayoutManager.maxVisibleItems = 1
indicatorView.notifyDataChanged(arrayListOf.size)
indicatorView.setSlideMode(IndicatorSlideMode.SCALE)
indicatorView.setOrientation(IndicatorOrientation.INDICATOR_HORIZONTAL)
indicatorView.setIndicatorStyle(IndicatorStyle.ROUND_RECT)
indicatorView.setSliderColor(
Color.parseColor("#80000000"), Color.parseColor("#3FACFD"),
Color.parseColor("#3FACFD")
)
indicatorView.setSliderWidth(9f, 54f)
indicatorView.setSliderHeight(9f)
indicatorView.setSliderGap(36f)
rvVideoPlaylist?.addOnScrollListener(object : CenterScrollListener() {
var prePlayerPosition = 0
override fun pageSelect(recyclerView: RecyclerView?, newState: Int) {
//播放视频
val (centerItemPosition: Int, player) = getPlayer(carouselLayoutManager)
indicatorView.onPageSelected(centerItemPosition)
if (player is ConsultVideoPlayer) {
if (prePlayerPosition != centerItemPosition) {
if (player.currentState == GSYVideoView.CURRENT_STATE_PAUSE) {
player.onVideoReset()
}
val playerHolder =
carouselLayoutManager.findViewByPosition(prePlayerPosition)
val prePlayer =
playerHolder?.findViewById<ConsultVideoPlayer>(R.id.video_item_player)
prePlayer?.onVideoReset()
val taxiPassengerVideoPlay = arrayListOf[centerItemPosition]
} else {
player.onVideoResume(false)
}
}
prePlayerPosition = centerItemPosition
}
override fun pageStop() {
val (_: Int, player) = getPlayer(carouselLayoutManager)
if (player is ConsultVideoPlayer) {
player.onVideoPause()
}
}
})
carouselLayoutManager.addOnDargAutoDiffListener { adapterPosition, currentPosition ->
val fl = adapterPosition - floor(adapterPosition)
var currentIndex = currentPosition
if (fl > 0.5) {
if (currentPosition == 0) {
currentIndex = rvVideoPlaylist?.adapter!!.itemCount - 1
} else {
currentIndex -= 1
}
}
indicatorView.onPageScrolled(currentIndex, fl, 0)
}
val recyclerVideoAdapter = RecyclerVideoAdapter(context, arrayListOf, rvVideoPlaylist)
recyclerVideoAdapter.setOnThumbImageClilckListener {
val (_: Int, player) = getPlayer(carouselLayoutManager)
if (player is ConsultVideoPlayer) {
player.onVideoReset()
player.thumbImageViewLayout.visibility = View.VISIBLE
}
rvVideoPlaylist?.smoothScrollToPosition(it)
}
rvVideoPlaylist?.layoutManager = carouselLayoutManager
rvVideoPlaylist?.setHasFixedSize(true)
rvVideoPlaylist?.adapter = recyclerVideoAdapter
}
private fun getPlayer(carouselLayoutManager: CarouselLayoutManager): Pair<Int, ConsultVideoPlayer?> {
val centerItemPosition: Int = carouselLayoutManager.centerItemPosition
val playerHolder = carouselLayoutManager.findViewByPosition(centerItemPosition)
val player = playerHolder?.findViewById<ConsultVideoPlayer>(R.id.video_item_player)
return Pair(centerItemPosition, player)
}
override fun onDetachedFromWindow() {
super.onDetachedFromWindow()
}
}

View File

@@ -52,7 +52,7 @@ public class RecyclerVideoAdapter extends RecyclerView.Adapter<RecyclerItemVideo
@NonNull
@Override
public RecyclerItemVideoHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View v = LayoutInflater.from(context).inflate(R.layout.list_video_item_normal, parent, false);
View v = LayoutInflater.from(context).inflate(R.layout.list_video_item_light, parent, false);
RecyclerItemVideoHolder recyclerItemVideoHolder = new RecyclerItemVideoHolder(context, v);
recyclerItemVideoHolder.setIsRecyclable(false);
return recyclerItemVideoHolder;

View File

@@ -96,9 +96,9 @@ class ConsultVideoPlayer : StandardGSYVideoPlayer {
val background = layoutBottom.background as GradientDrawable
val x = arrayOf(12f, 12f,12f, 12f,12f, 12f,12f, 12f)
background.cornerRadii = x.toFloatArray()
layoutBottom.background = background
fullscreenButton.setPadding(92,0,92,0)
titleTextView.setTextSize(TypedValue.COMPLEX_UNIT_PX, 50f)
val layoutParams1 = titleTextView.layoutParams as ConstraintLayout.LayoutParams
layoutParams1.marginStart = 80
@@ -157,15 +157,39 @@ class ConsultVideoPlayer : StandardGSYVideoPlayer {
override fun changeUiToNormal() {
super.changeUiToNormal()
setViewShowState(fullscreenButton, INVISIBLE)
// TODO:("显示顶部View")
}
override fun changeUiToPreparingShow() {
super.changeUiToPreparingShow()
// TODO:("显示顶部View")
}
override fun changeUiToPlayingShow() {
super.changeUiToPlayingShow()
setViewShowState(fullscreenButton, VISIBLE)
// TODO:("显示顶部View")
}
override fun changeUiToPauseShow() {
super.changeUiToPauseShow()
// TODO:("显示顶部View")
}
override fun changeUiToPlayingBufferingShow() {
super.changeUiToPlayingBufferingShow()
// TODO:("显示顶部View")
}
override fun changeUiToCompleteShow() {
super.changeUiToCompleteShow()
// TODO:("显示顶部View")
}
public override fun hideAllWidget() {
super.hideAllWidget()
// TODO:("隐藏顶部View")
}
override fun setProgressAndTime(
@@ -297,11 +321,16 @@ class ConsultVideoPlayer : StandardGSYVideoPlayer {
override fun onSizeChanged(w: Int, h: Int, oldw: Int, oldh: Int) {
super.onSizeChanged(w, h, oldw, oldh)
if (!mIfCurrentIsFullscreen) {
this.outlineProvider = TextureVideoViewOutlineProvider(38F)
this.outlineProvider = TextureVideoViewOutlineProvider(12F)
this.clipToOutline = true
}
}
fun exitFullScreenMode() {
fullVideoPlayer?.let { clearFullscreenLayout(it) }
FullVideoUtils.dismissOverlayView(false)
}
private fun startWindowFullscreenOwn(context:Context){
val gsyBaseVideoPlayer = startWindowFullscreen(context)
gsyBaseVideoPlayer?.let {

Binary file not shown.

Before

Width:  |  Height:  |  Size: 749 B

After

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

After

Width:  |  Height:  |  Size: 4.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.4 MiB

View File

@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<solid android:color="#59141A2D"/>
<solid android:color="#58141A2D"/>
<corners android:radius="8dp"/>
</shape>

View File

@@ -0,0 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<corners
android:bottomLeftRadius="36dp"
android:bottomRightRadius="36dp"
android:topLeftRadius="36dp"
android:topRightRadius="36dp" />
<solid android:color="#ADFFFFFF" />
</shape>

View File

@@ -3,22 +3,22 @@
xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@android:id/background">
<shape>
<corners android:radius="5dp"/>
<solid android:color="#99D8D8D8" />
<corners android:radius="4dp"/>
<solid android:color="#26FFFFFF" />
</shape>
</item>
<item android:id="@android:id/secondaryProgress">
<clip>
<shape>
<corners android:radius="5dp"/>
<solid android:color="#66FFFFFF" />
<corners android:radius="4dp"/>
<solid android:color="#4DFFFFFF" />
</shape>
</clip>
</item>
<item android:id="@android:id/progress">
<scale android:scaleWidth="100%">
<shape android:shape="rectangle">
<corners android:radius="5dp"/>
<corners android:radius="4dp"/>
<gradient android:startColor="#303CFF" android:centerColor="#216CFF" android:endColor="#25C1F9"/>
</shape>
</scale>

View File

@@ -0,0 +1,18 @@
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:background="@drawable/bg_taxi_p_video_light_bg_shape"
android:layout_width="1620dp"
android:layout_height="940dp"
android:paddingTop="57dp"
android:paddingBottom="57dp"
android:paddingStart="61dp"
android:paddingEnd="61dp"
>
<com.mogo.och.taxi.passenger.widget.ConsultVideoPlayer
android:id="@+id/video_item_player"
android:layout_gravity="center"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</FrameLayout>

View File

@@ -15,6 +15,12 @@
app:mapStylePath="style.data"
/>
<!-- 视频播放View -->
<com.mogo.och.taxi.passenger.ui.video.InfoVideoView
android:id="@+id/infoVideoView"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<!-- 高精地图 -->
<com.mogo.eagle.core.function.view.MapBizView
android:id="@+id/mapBizView"

View File

@@ -0,0 +1,37 @@
<?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"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/infoContainer"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/taxi_p_video_light_bg"
tools:ignore="MissingDefaultResource">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/infoVideoPlaylist"
android:layout_width="match_parent"
android:layout_height="991dp"
android:orientation="horizontal"
android:layout_marginTop="284dp"
android:layout_marginStart="24dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<com.mogo.och.taxi.passenger.widget.indicator.IndicatorView
android:id="@+id/infoIndicatorView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toBottomOf="@+id/infoVideoPlaylist"
android:layout_marginTop="67dp"
app:vpi_orientation="horizontal"
app:vpi_slide_mode="scale"
app:vpi_slider_checked_color="@color/taxi_p_traffic_light_red_color_up"
app:vpi_slider_normal_color="@color/taxi_p_check_keyboard_input_field"
app:vpi_slider_radius="@dimen/dp_20"
app:vpi_style="round_rect" />
</androidx.constraintlayout.widget.ConstraintLayout>

View File

@@ -45,10 +45,11 @@
android:id="@+id/fullscreen"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintEnd_toEndOf="parent"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:paddingEnd="40dp"
android:paddingStart="93dp"
app:layout_constraintBottom_toBottomOf="parent"
android:layout_width="69dp"
android:layout_height="69dp"
android:layout_marginEnd="49dp"
android:scaleType="fitXY"
android:src="@drawable/taxi_p_change_full" />
<TextView
@@ -71,8 +72,8 @@
android:background="@drawable/bg_taxi_p_video_bg"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
android:layout_marginLeft="148dp"
android:layout_marginRight="148dp"
android:layout_marginLeft="150dp"
android:layout_marginRight="150dp"
android:layout_marginBottom="51dp"
android:layout_height="99dp"
app:layout_constraintBottom_toBottomOf="parent">