视频使用单独的进程

This commit is contained in:
yangyakun
2022-07-08 16:57:23 +08:00
parent 2a10ccc4b5
commit f16c247b3c
15 changed files with 800 additions and 94 deletions

View File

@@ -1,5 +1,16 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.mogo.och.taxi.passenger">
/
<application>
<activity
android:name=".ui.video.VideoActivity"
android:process=":video"
android:exported="false" />
<provider
android:name=".mulprocess.BinderProvider"
android:authorities="com.mogo.och.taxi.passenger.leftmenu"
android:exported="false" />
</application>
</manifest>

View File

@@ -0,0 +1,14 @@
// IOrderService.aidl
package com.mogo.och.taxi.passenger.mulprocess;
// Declare any non-default types here with import statements
interface IOrderService {
/**
* 向主进程传输坐标
*/
boolean transmission(int x, int action);
void open();
}

View File

@@ -0,0 +1,64 @@
package com.mogo.och.taxi.passenger.mulprocess;
import android.database.MatrixCursor;
import android.os.Bundle;
import android.os.IBinder;
import android.os.Parcel;
import android.os.Parcelable;
public class BinderCursor extends MatrixCursor {
static final String KEY_BINDER = "binder";
Bundle mBinderExtra = new Bundle();
public static class BinderParcelable implements Parcelable {
public IBinder mBinder;
public static final Creator<BinderParcelable> CREATOR = new Creator<BinderParcelable>() {
@Override
public BinderParcelable createFromParcel(Parcel source) {
return new BinderParcelable(source);
}
@Override
public BinderParcelable[] newArray(int size) {
return new BinderParcelable[size];
}
};
BinderParcelable(IBinder binder) {
mBinder = binder;
}
BinderParcelable(Parcel source) {
mBinder = source.readStrongBinder();
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeStrongBinder(mBinder);
}
}
public BinderCursor(String[] columnNames, IBinder binder) {
super(columnNames);
if (binder != null) {
Parcelable value = new BinderParcelable(binder);
mBinderExtra.putParcelable(KEY_BINDER, value);
}
}
@Override
public Bundle getExtras() {
return mBinderExtra;
}
}

View File

@@ -0,0 +1,55 @@
package com.mogo.och.taxi.passenger.mulprocess;
import static android.os.Binder.getCallingUid;
import android.content.ContentProvider;
import android.content.ContentValues;
import android.database.Cursor;
import android.net.Uri;
import android.os.IBinder;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
public class BinderProvider extends ContentProvider {
public static final String TAG = BinderProvider.class.getSimpleName();
public static final String AUTHORITY = "com.mogo.och.taxi.passenger.leftmenu";
public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/binder");
public static final String SERVICE_LEFTMENU = "lefmenu";
@Override
public boolean onCreate() {
return true;
}
@Override
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
getCallingUid();
IBinder binder;
if (selectionArgs[0].equals(BinderProvider.SERVICE_LEFTMENU)) {
binder = new OrderServiceImpl();
} else {
return null;
}
BinderCursor cursor = new BinderCursor(new String[]{"service"}, binder);
return cursor;
}
@Override
public String getType(Uri uri) {return null;}
@Override
public Uri insert(Uri uri, ContentValues values) {return null;}
@Override
public int delete(Uri uri, String selection, String[] selectionArgs) {return 0;}
@Override
public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {return 0;}
}

View File

@@ -0,0 +1,25 @@
package com.mogo.och.taxi.passenger.mulprocess;
import android.app.Application;
import android.os.Build;
import android.os.RemoteException;
import androidx.annotation.RequiresApi;
import com.mogo.eagle.core.utilcode.util.UiThreadHandler;
import com.mogo.eagle.core.utilcode.util.Utils;
import com.mogo.och.taxi.passenger.ui.leftmenu.LeftMenuOpen;
import com.mogo.och.taxi.passenger.ui.leftmenu.OverlayLeftViewUtils;
public class OrderServiceImpl extends IOrderService.Stub {
@Override
public boolean transmission(int x, int action) throws RemoteException {
return LeftMenuOpen.INSTANCE.dragAndOpen(x,action);
}
@Override
public void open() throws RemoteException {
UiThreadHandler.getsUiHandler().post(() -> OverlayLeftViewUtils.INSTANCE.open());
}
}

View File

@@ -1,5 +1,6 @@
package com.mogo.och.taxi.passenger.ui;
import android.content.Intent;
import android.os.Build;
import android.os.Handler;
import android.os.Looper;
@@ -18,6 +19,7 @@ import com.mogo.eagle.core.function.call.hmi.CallerHmiManager;
import com.mogo.eagle.core.function.call.map.CallerSmpManager;
import com.mogo.eagle.core.utilcode.util.OverlayViewUtils;
import com.mogo.eagle.core.utilcode.util.UiThreadHandler;
import com.mogo.eagle.core.utilcode.util.Utils;
import com.mogo.map.MogoMapUIController;
import com.mogo.map.MogoMarkerManager;
import com.mogo.map.listener.IMogoMapListener;
@@ -29,6 +31,7 @@ import com.mogo.och.taxi.passenger.callback.ITPClickStartAutopilotCallback;
import com.mogo.och.taxi.passenger.presenter.BaseTaxiPassengerPresenter;
import com.mogo.och.taxi.passenger.ui.comment.TaxiPassengerArrivedView;
import com.mogo.och.taxi.passenger.ui.leftmenu.OverlayLeftViewUtils;
import com.mogo.och.taxi.passenger.ui.video.VideoActivity;
import java.lang.ref.WeakReference;
@@ -128,15 +131,15 @@ public class TaxiPassengerBaseFragment extends MvpFragment<TaxiPassengerBaseFrag
});
findViewById(R.id.iv_temp).setOnClickListener(view -> {
// OverlayLeftViewUtils.INSTANCE.showOverlayView(getActivity());
// OverlayLeftViewUtils.INSTANCE.dragTarget(vOpenLeft);
Intent intent = new Intent(getContext(), VideoActivity.class);
startActivity(intent);
OverlayLeftViewUtils.INSTANCE.showOverlayView(getActivity());
OverlayLeftViewUtils.INSTANCE.dragTarget(vOpenLeft);
//showOrHideArrivedEndLayout(true, "北京北京北京", "1527481606997577728");
//showOrHidePressengerCheckPager(true, "开始站点开", "开始站点开始站点开始", "2", "京A888888", "18811539480");
//OCHFloatWindowManager.getInstance().ShowFloatWindow(getContext());
//OverlayViewUtils.showOverlayView(getActivity(),new TaxiPassengerMogoConsultView(getContext()));
});
vOpenLeft.setOnClickListener(v -> OverlayLeftViewUtils.INSTANCE.open());
}
private void initArrivedView(){

View File

@@ -1,74 +1,36 @@
package com.mogo.och.taxi.passenger.ui.leftmenu
import android.annotation.SuppressLint
import android.view.MotionEvent
import android.view.View
import android.view.WindowManager
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger
import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant
class ItemViewTouchListener(
private val windowView: View,
private val wl: WindowManager.LayoutParams,
private val windowManager: WindowManager?,
private val close: (view:View,windowManager: WindowManager?) -> Unit,
private val open : (view:View,windowManager: WindowManager?) -> Unit
) :
class ItemViewTouchListener :
View.OnTouchListener {
private var x = 0
// 判断并放跑点击事件
private var dragTime = 0L
private val DEVIATION = 10
private val NEGATIVEDEVIATION = -10
@SuppressLint("ClickableViewAccessibility")
override fun onTouch(view: View, motionEvent: MotionEvent): Boolean {
when (motionEvent.action) {
MotionEvent.ACTION_DOWN -> {
x = motionEvent.rawX.toInt()
LeftMenuOpen.dragAndOpenOwnProcess(motionEvent.rawX.toInt(),motionEvent.action)
dragTime = System.currentTimeMillis()
}
MotionEvent.ACTION_MOVE -> {
val nowX = motionEvent.rawX.toInt()
val movedX = nowX - x
x = nowX
wl.apply {
x += movedX
}
if (wl.x > 0 || wl.x < OverlayLeftViewUtils.DEVIATION_WIDTH) {
wl.apply {
x -= movedX
}
if (LeftMenuOpen.dragAndOpenOwnProcess(motionEvent.rawX.toInt(),motionEvent.action)) {
return false
}
if (wl.x > NEGATIVEDEVIATION && movedX > 0) {
open(windowView,windowManager)
}else{
//更新悬浮球控件位置
windowManager?.updateViewLayout(windowView, wl)
}
if (wl.x < OverlayLeftViewUtils.DEVIATION_WIDTH +DEVIATION && movedX < 0) {
close(windowView,windowManager)
}else{
//更新悬浮球控件位置
windowManager?.updateViewLayout(windowView, wl)
}
}
MotionEvent.ACTION_UP -> {
val startX = wl.x
if (startX > OverlayLeftViewUtils.DEVIATION_WIDTH /2 && startX < 0) {
//拖动距离大于一半 自动打开
open(windowView,windowManager)
} else if (startX < OverlayLeftViewUtils.DEVIATION_WIDTH /2 && startX >= OverlayLeftViewUtils.DEVIATION_WIDTH) {
// 拖动距离小于一半自动关闭
close(windowView,windowManager)
}
LeftMenuOpen.dragAndOpenOwnProcess(motionEvent.rawX.toInt(),motionEvent.action)
if (System.currentTimeMillis() - dragTime > 500) {
dragTime = 0
return true
}
}
else -> {
}
else -> {}
}
return false
}

View File

@@ -0,0 +1,206 @@
package com.mogo.och.taxi.passenger.ui.leftmenu
import android.annotation.SuppressLint
import android.content.ContentResolver
import android.database.Cursor
import android.os.IBinder
import android.os.RemoteException
import android.view.MotionEvent
import android.view.View
import android.view.WindowManager
import com.mogo.eagle.core.utilcode.util.UiThreadHandler
import com.mogo.eagle.core.utilcode.util.Utils
import com.mogo.och.taxi.passenger.mulprocess.BinderCursor
import com.mogo.och.taxi.passenger.mulprocess.BinderProvider
import com.mogo.och.taxi.passenger.mulprocess.IOrderService
@SuppressLint("StaticFieldLeak")
object LeftMenuOpen {
private var windowView: View? = null
private var wl: WindowManager.LayoutParams? = null
private var windowManager: WindowManager? = null
private var close: ((view: View, windowManager: WindowManager?) -> Unit)? = null
private var open: ((view: View, windowManager: WindowManager?) -> Unit)? = null
private var cu: Cursor? = null
// 两部分主进程和子进程
private var dragList = mutableSetOf<View>()
private var orderService: IOrderService? = null
// 主进程
fun setValue(
windowView: View,
wl: WindowManager.LayoutParams?,
windowManager: WindowManager?,
close: (view: View, windowManager: WindowManager?) -> Unit,
open: (view: View, windowManager: WindowManager?) -> Unit
) {
this.open = open
this.close = close
this.windowView = windowView
this.windowManager = windowManager
this.wl = wl
dragList.forEach {
registerDragView(it)
}
registerC()
}
// 主进程
fun clearValue() {
this.open = null
this.close = null
this.windowView = null
this.windowManager = null
this.wl = null
cu?.let {
it.close()
orderService = null
}
val iterator = dragList.iterator()
while (iterator.hasNext()) {
val next = iterator.next()
unRegisterDragView(next)
}
}
private var x = 0
// 判断并放跑点击事件
private const val DEVIATION = 10
private const val NEGATIVEDEVIATION = -10
fun dragAndOpenOwnProcess(newX: Int, action: Int): Boolean {
return orderService?.transmission(newX, action) ?: false
}
fun dragAndOpen(newX: Int, action: Int): Boolean {
when (action) {
MotionEvent.ACTION_DOWN -> {
x = newX
}
MotionEvent.ACTION_MOVE -> {
val nowX = newX
val movedX = nowX - x
x = nowX
wl?.let { it ->
it.x += movedX
if (it.x > 0 || it.x < OverlayLeftViewUtils.DEVIATION_WIDTH) {
it.apply {
x -= movedX
}
return true
}
windowView?.let { windowView ->
windowManager?.let { windowManager ->
if (it.x > NEGATIVEDEVIATION && movedX > 0) {
open?.let { it1 ->
UiThreadHandler.getsUiHandler().post {
it1(windowView, windowManager)
}
}
} else {
//更新悬浮球控件位置
UiThreadHandler.getsUiHandler().post {
windowManager.updateViewLayout(windowView, it)
}
}
if (it.x < OverlayLeftViewUtils.DEVIATION_WIDTH + DEVIATION && movedX < 0) {
close?.let { it1 ->
UiThreadHandler.getsUiHandler().post {
it1(windowView, windowManager)
}
}
} else {
//更新悬浮球控件位置
UiThreadHandler.getsUiHandler().post {
windowManager.updateViewLayout(windowView, it)
}
}
}
}
}
}
MotionEvent.ACTION_UP -> {
wl?.let { wl ->
val startX = wl.x
if (startX > OverlayLeftViewUtils.DEVIATION_WIDTH / 2 && startX < 0) {
//拖动距离大于一半 自动打开
open?.let {
UiThreadHandler.getsUiHandler().post {
it(windowView!!, windowManager)
}
}
} else if (startX < OverlayLeftViewUtils.DEVIATION_WIDTH / 2 && startX >= OverlayLeftViewUtils.DEVIATION_WIDTH) {
// 拖动距离小于一半自动关闭
close?.let {
UiThreadHandler.getsUiHandler().post {
it(windowView!!, windowManager)
}
}
} else {
}
}
}
}
return false
}
fun registerDragView(view: View?) {
if (view != null) {
dragList.add(view)
if (orderService == null) {
registerC()
}
view.setOnTouchListener(ItemViewTouchListener())
view.setOnClickListener {
orderService?.open()
}
}
}
fun unRegisterDragView(view: View?) {
dragList.remove(view)
view?.let {
it.setOnTouchListener(null)
it.setOnClickListener(null)
}
}
private fun registerC() {
val resolver: ContentResolver = Utils.getApp().contentResolver
cu = resolver.query(
BinderProvider.CONTENT_URI,
null,
null,
arrayOf(BinderProvider.SERVICE_LEFTMENU),
null
) ?: return
val binder: IBinder = getBinder(cu!!)
try {
orderService = IOrderService.Stub.asInterface(binder)
} catch (e: RemoteException) {
e.printStackTrace()
cu?.close()
cu = null
}
}
private fun getBinder(cursor: Cursor): IBinder {
val extras = cursor.extras
extras.classLoader = BinderCursor.BinderParcelable::class.java.classLoader
val w = extras.getParcelable<BinderCursor.BinderParcelable>("binder")
return w!!.mBinder
}
}

View File

@@ -6,13 +6,18 @@ import android.annotation.SuppressLint
import android.app.Activity
import android.content.Context
import android.graphics.PixelFormat
import android.graphics.Rect
import android.view.*
import android.view.Gravity
import android.view.LayoutInflater
import android.view.View
import android.view.WindowManager
import android.view.animation.LinearInterpolator
import android.widget.ListView
import androidx.appcompat.widget.AppCompatImageView
import androidx.constraintlayout.widget.ConstraintLayout
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger
import com.mogo.eagle.core.utilcode.util.IAppStateListener
import com.mogo.eagle.core.utilcode.util.OverlayViewUtils
import com.mogo.eagle.core.utilcode.util.ProcessUtils
import com.mogo.och.taxi.passenger.R
import com.mogo.och.taxi.passenger.ui.leftmenu.model.LeftMenuModel
import com.mogo.och.taxi.passenger.ui.video.FullVideoUtils
@@ -51,13 +56,26 @@ object OverlayLeftViewUtils {
private var taxiPassengerMogoMoviesView: TaxiPassengerMogoMoviesView? = null
private var acivOpenClose: AppCompatImageView?=null
private var dragList = mutableListOf<View>()
private val appStatesListener = object : IAppStateListener {
override fun onAppStateChanged(isForeground: Boolean) {
if (isForeground) {
CallerLogger.d("FinalizeCrashFixer", "--- 切换到前台 ---")
} else {
CallerLogger.d("FinalizeCrashFixer", "--- 切换到后台 ---")
}
}
}
/**
* 添加覆盖View在Activity上面
*/
@JvmOverloads
fun showOverlayView(context: Activity, ani: Int = -1) {
if (!ProcessUtils.isMainProcess(context)) {
// 只有主进程可以启动
return
}
if (isShowing) {
return
}
@@ -84,13 +102,7 @@ object OverlayLeftViewUtils {
val vDragField = view.findViewById<View>(R.id.v_drag_field)
acivOpenClose = view.findViewById(R.id.aciv_open_close)
dragList.forEach {
it.setOnTouchListener(ItemViewTouchListener(
overlayView!!,params!!, windowManager, ::close,
::open))
}
vDragField.setOnTouchListener(ItemViewTouchListener(overlayView!!,params!!, windowManager, ::close,
::open))
vDragField.setOnTouchListener(ItemViewTouchListener())
vDragField.setOnClickListener {
val start: Int = params!!.x
if (start > DEVIATION_WIDTH /2 && start < 10) {
@@ -136,6 +148,9 @@ object OverlayLeftViewUtils {
integers.add(LeftMenuModel(R.drawable.taxi_p_mogo_consult_select,R.drawable.taxi_p_mogo_consult_selected,false,consultSelect))
integers.add(LeftMenuModel(R.drawable.taxi_p_mogo_entertainment_select,R.drawable.taxi_p_mogo_entertainment_selected,false,entertainmentSelect))
lvSelectItem.adapter = ListAdapter(context, integers)
//AppStateManager.registerAppStateListener(appStatesListener)
LeftMenuOpen.setValue(view, params, windowManager,::close,::open)
try {
windowManager!!.addView(overlayView, params)
isShowing = true
@@ -182,22 +197,12 @@ object OverlayLeftViewUtils {
}
}
fun dragTarget(view :View){
if(view!=null) {
dragList.add(view)
params?.let {
view.setOnTouchListener(
ItemViewTouchListener(
overlayView!!, params!!, windowManager, ::close,
::open
)
)
}
}
fun dragTarget(view :View?){
LeftMenuOpen.registerDragView(view)
}
fun removeDragTarget(view: View){
dragList.remove(view)
fun removeDragTarget(view: View?){
LeftMenuOpen.unRegisterDragView(view)
}
private fun closeByTime(
@@ -262,7 +267,7 @@ object OverlayLeftViewUtils {
it.y = 0
it.format = PixelFormat.RGBA_8888
// 设置窗口类型为应用子窗口和PopupWindow同类型
it.type = WindowManager.LayoutParams.TYPE_APPLICATION_SUB_PANEL
it.type = WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY
// 没有边界限制,允许窗口扩展到屏幕外
it.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE or
WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS or
@@ -281,17 +286,15 @@ object OverlayLeftViewUtils {
if (!isShowing) {
return
}
//AppStateManager.unRegisterAppStateListener(appStatesListener)
subscribe?.let {
if (!it.isDisposed) {
it.dispose()
}
}
LeftMenuOpen.clearValue()
FullVideoUtils.dismissOverlayView(true)
// 管理的要关闭都得关闭
dragList.forEach {
it.setOnTouchListener(null)
}
dragList.clear()
closeConsult()
closeMovice()
subscribe = null
@@ -323,7 +326,4 @@ object OverlayLeftViewUtils {
System.gc()
}
private fun getViewBounds(view: View): Rect {
return Rect(view.left, view.top, view.right, view.bottom)
}
}

View File

@@ -59,9 +59,6 @@ class TaxiPassengerMogoConsultView :RelativeLayout {
clContain = findViewById(R.id.cl_contain)
vOpenLeft = findViewById(R.id.v_open_left)
vOpenLeft.setOnClickListener {
OverlayLeftViewUtils.open()
}
OverlayLeftViewUtils.dragTarget(vOpenLeft)
val arrayListOf = ArrayList<TaxiPassengerVideoPlay>()

View File

@@ -60,9 +60,6 @@ class TaxiPassengerMogoMoviesView :RelativeLayout {
clContain = findViewById(R.id.cl_contain)
vOpenLeft = findViewById(R.id.v_open_left)
vOpenLeft.setOnClickListener {
OverlayLeftViewUtils.open()
}
OverlayLeftViewUtils.dragTarget(vOpenLeft)
val arrayListOf = ArrayList<TaxiPassengerVideoPlay>()

View File

@@ -0,0 +1,301 @@
package com.mogo.och.taxi.passenger.ui.video
import android.content.ContentResolver
import android.database.Cursor
import android.graphics.Bitmap
import android.graphics.Color
import android.graphics.drawable.BitmapDrawable
import android.net.Uri
import android.os.Bundle
import android.os.IBinder
import android.os.RemoteException
import android.view.View
import androidx.appcompat.app.AppCompatActivity
import androidx.constraintlayout.widget.ConstraintLayout
import androidx.recyclerview.widget.RecyclerView
import com.bumptech.glide.Glide
import com.bumptech.glide.request.RequestOptions
import com.bumptech.glide.request.target.SimpleTarget
import com.bumptech.glide.request.transition.Transition
import com.mogo.eagle.core.utilcode.util.ToastUtils
import com.mogo.och.taxi.passenger.R
import com.mogo.och.taxi.passenger.bean.TaxiPassengerVideoPlay
import com.mogo.och.taxi.passenger.ui.leftmenu.OverlayLeftViewUtils
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.utils.blur.GlideBlurTransform
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.listener.GSYSampleCallBack
import com.shuyu.gsyvideoplayer.video.base.GSYVideoView
import kotlin.math.floor
class VideoActivity : AppCompatActivity() {
private lateinit var rvVideoPlaylist: RecyclerView
private lateinit var indicatorView: IndicatorView
private lateinit var clContain: ConstraintLayout
private lateinit var vOpenLeft: View
companion object{
const val SERVICE_ORDER = "order"
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_video)
initView()
initListener()
initData()
}
private fun initData() {
val arrayListOf = ArrayList<TaxiPassengerVideoPlay>()
arrayListOf.add(
TaxiPassengerVideoPlay(
"https://img.zhidaohulian.com/fileServer/online_car_hailing/1655708596763/全车型混剪增加红旗车队.m4v",
"https://img.zhidaohulian.com/fileServer/online_car_hailing/1655969511280/车队.png",
"蘑菇车联覆盖生活的方方面面"
)
)
arrayListOf.add(
TaxiPassengerVideoPlay(
"https://img.zhidaohulian.com/fileServer/online_car_hailing/1655708554279/红旗车队.m4v",
"https://img.zhidaohulian.com/fileServer/online_car_hailing/1655969553174/红旗重新排版.png",
"蘑菇车联之红旗车队"
)
)
arrayListOf.add(
TaxiPassengerVideoPlay(
"https://img.zhidaohulian.com/fileServer/online_car_hailing/1655708499497/大运会合作解说版.m4v",
"https://img.zhidaohulian.com/fileServer/online_car_hailing/1655969536177/大运会.png",
"蘑菇车联牵手成都大运会"
)
)
arrayListOf.add(
TaxiPassengerVideoPlay(
"https://img.zhidaohulian.com/fileServer/online_car_hailing/1655708409810/20210610重新排版3屏.m4v",
"https://img.zhidaohulian.com/fileServer/online_car_hailing/1655969579713/三屏.png",
"多视角体验蘑菇车联自动驾驶"
)
)
val recyclerVideoAdapter = RecyclerVideoAdapter(this, arrayListOf)
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("#80FFFFFF"), Color.parseColor("#2972FF"),
Color.parseColor("#27C8FF")
)
indicatorView.setSliderWidth(16f, 101f)
indicatorView.setSliderHeight(16f)
indicatorView.setSliderGap(30f)
rvVideoPlaylist.addOnScrollListener(object : CenterScrollListener() {
var prePlayerPosition = 0
override fun pageSelect(recyclerView: RecyclerView?, newState: Int) {
//播放视频
val (centerItemPosition: kotlin.Int, player) = getPlayer(carouselLayoutManager)
indicatorView.onPageSelected(centerItemPosition)
if (player is ConsultVideoPlayer) {
if (prePlayerPosition != centerItemPosition) {
if (player.currentState == GSYVideoView.CURRENT_STATE_PAUSE) {
player.onVideoReset()
} else {
}
val playerHolder =
carouselLayoutManager.findViewByPosition(prePlayerPosition)
val prePlayer =
playerHolder?.findViewById<ConsultVideoPlayer>(R.id.video_item_player)
prePlayer?.let {
if (it is ConsultVideoPlayer) {
it.onVideoReset()
}
}
val taxiPassengerVideoPlay = arrayListOf[centerItemPosition]
setBackageAndPlayNext(taxiPassengerVideoPlay, player, centerItemPosition)
} else {
player.onVideoResume(false)
}
}
prePlayerPosition = centerItemPosition
}
override fun pageStop() {
val (centerItemPosition: kotlin.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)
}
recyclerVideoAdapter.setOnThumbImageClilckListener {
val (centerItemPosition: kotlin.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)
}
private fun initListener() {
OverlayLeftViewUtils.dragTarget(vOpenLeft)
}
private fun initView() {
rvVideoPlaylist = findViewById(R.id.rv_video_playlist)
indicatorView = findViewById(R.id.indicatorView)
clContain = findViewById(R.id.cl_contain)
vOpenLeft = findViewById(R.id.v_open_left)
}
private fun setBackageAndPlayNext(
taxiPassengerVideoPlay: TaxiPassengerVideoPlay,
player: ConsultVideoPlayer,
centerItemPosition: Int,
) {
// 设置背景图片
Glide.with(this).asBitmap()
.load(taxiPassengerVideoPlay.imageUrl)
.apply(
RequestOptions().transform(
GlideBlurTransform(this, taxiPassengerVideoPlay.imageUrl, 100)
)
)
.into(object : SimpleTarget<Bitmap?>() {
override fun onResourceReady(
resource: Bitmap,
transition: Transition<in Bitmap?>?
) {
clContain.background = BitmapDrawable(resources, resource)
}
})
if (player.getVideoAllCallBack() == null) {
player.setVideoAllCallBack(object : GSYSampleCallBack() {
override fun onAutoComplete(url: String?, vararg objects: Any?) {
player.onVideoReset()
val itemCount = rvVideoPlaylist.adapter?.itemCount
itemCount?.let {
if (centerItemPosition == itemCount - 1) {
rvVideoPlaylist.smoothScrollToPosition(0)
} else {
rvVideoPlaylist.smoothScrollToPosition(centerItemPosition + 1)
}
}
}
override fun onClickBlank(url: String?, vararg objects: Any?) {
super.onClickBlank(url, *objects)
rvVideoPlaylist.smoothScrollToPosition(centerItemPosition)
}
override fun onPlayError(url: String?, vararg objects: Any?) {
super.onPlayError(url, *objects)
ToastUtils.showLong("哎呀,出错了,看看其他视频吧")
}
override fun onClickStartError(url: String?, vararg objects: Any?) {
super.onClickStartError(url, *objects)
ToastUtils.showLong("哎呀,出错了,看看其他视频吧")
}
})
}
}
override fun onResume() {
super.onResume()
val carouselLayoutManager = rvVideoPlaylist.layoutManager as CarouselLayoutManager
val (centerItemPosition: Int, player) = getPlayer(carouselLayoutManager)
player?.let {
if (player is ConsultVideoPlayer) {
// 恢复播放和开始播放
if (player.isIfCurrentIsFullscreen) {// 全屏了
} else {
when (player.currentState) {
GSYVideoView.CURRENT_STATE_PAUSE -> {
player.onVideoResume(false)
}
GSYVideoView.CURRENT_STATE_PLAYING -> {
}
else -> {
val recyclerVideoAdapter =
rvVideoPlaylist.adapter as RecyclerVideoAdapter
setBackageAndPlayNext(
recyclerVideoAdapter.getItemByPosition(centerItemPosition),
player, centerItemPosition
)
//player.startPlayLogic()
}
}
}
}
}
}
override fun onPause() {
super.onPause()
val carouselLayoutManager = rvVideoPlaylist.layoutManager as CarouselLayoutManager
val (centerItemPosition: Int, player) = getPlayer(carouselLayoutManager)
player?.let {
if (player is ConsultVideoPlayer) {
// 离开应用 暂停视频
// 关闭 onDetachedFromWindow 会reset
if (player.isIfCurrentIsFullscreen) {// 全屏了
} else {
player.onVideoPause()
}
}
}
}
override fun onDestroy() {
super.onDestroy()
val carouselLayoutManager = rvVideoPlaylist.layoutManager as CarouselLayoutManager
val (_: Int, player) = getPlayer(carouselLayoutManager)
player?.let {
if(player is ConsultVideoPlayer){
player.currentPlayer.release()
player.onVideoReset()
}
}
OverlayLeftViewUtils.removeDragTarget(vOpenLeft)
}
}

View File

@@ -76,9 +76,6 @@ class ConsultVideoPlayer : StandardGSYVideoPlayer {
aivStartPlay.scaleY = 0.8f
vPpenLeft = findViewById(R.id.v_open_left)
vPpenLeft.setOnClickListener {
OverlayLeftViewUtils.open()
}
OverlayLeftViewUtils.dragTarget(vPpenLeft)
}

View File

@@ -0,0 +1,74 @@
<?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/cl_contain"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/cardview_dark_background"
tools:ignore="MissingDefaultResource">
<View
android:background="#80000000"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/aciv_title_icon"
android:src="@drawable/taxi_p_mogo_consult_title_icon"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintStart_toStartOf="parent"
android:layout_marginTop="@dimen/dp_130"
android:layout_marginStart="@dimen/dp_100"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<TextView
android:id="@+id/tv_mogo_consult"
app:layout_constraintTop_toTopOf="@+id/aciv_title_icon"
app:layout_constraintBottom_toBottomOf="@+id/aciv_title_icon"
app:layout_constraintStart_toEndOf="@+id/aciv_title_icon"
android:text="蘑菇资讯"
android:textStyle="bold"
android:textSize="60px"
android:includeFontPadding="false"
android:textColor="@color/taxi_order_status_textColor"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rv_video_playlist"
android:layout_width="match_parent"
android:layout_height="1294px"
android:orientation="horizontal"
android:layout_marginTop="-40px"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/tv_mogo_consult"/>
<com.mogo.och.taxi.passenger.widget.indicator.IndicatorView
android:id="@+id/indicatorView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
android:layout_marginBottom="172px"
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" />
<View
android:id="@+id/v_open_left"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
android:layout_width="143px"
android:layout_height="308px"/>
</androidx.constraintlayout.widget.ConstraintLayout>

View File

@@ -31,7 +31,7 @@
<string name="taxi_p_check_input_phone_tail_title">请输出手机号后4位:</string>
<string name="taxi_p_check_small_mogo">小蘑菇</string>
<string name="tv_delete">删除</string>
<string name="taxi_p_start_autopilot_txt">点击开始</string>
<string name="taxi_p_start_autopilot_loading">启动中...</string>
<string name="taxi_p_start_autopilot_fail_10s_tip">自动驾驶启动失败,请与司机确认车辆状态</string>