[到达终点部分页面]
This commit is contained in:
yangyakun
2023-07-19 18:23:02 +08:00
parent cd7329d3d4
commit 8c78b2793a
73 changed files with 231 additions and 50 deletions

View File

@@ -72,34 +72,41 @@ class BaseTaxiPassengerPresenter(view: TaxiPassengerBaseFragment?) :
mView?.showOrHideArrivedEndLayout(isShow = false)
mView?.showOrHidePressengerCheckPager(true, order.startSiteAddr,
order.endSiteAddr, order.passengerNum, order.carNumber, order.passengerPhone)
mView?.showOrHideStartAutopilotView(isShow = false)
}
TaxiPassengerOrderStatusEnum.UserArriveAtStart -> {
mView?.showOrHideStartAutopilotView(isShow = true)
// 30 乘客到达上车点
mView?.showOrHideArrivedEndLayout(isShow = false)
mView?.showOrHidePressengerCheckPager(isShow = false)
mView?.showOrHideStartAutopilotView(isShow = true)
}
TaxiPassengerOrderStatusEnum.OnTheWayToEnd -> {
mView?.showOrHideStartAutopilotView(isShow = false)
// 服务中(去往目的地)
mView?.showOrHideArrivedEndLayout(isShow = false)
mView?.showOrHidePressengerCheckPager(isShow = false)
mView?.showOrHideStartAutopilotView(isShow = false)
}
TaxiPassengerOrderStatusEnum.ArriveAtEnd -> {
// 50 到达终点 乘客可以评价
mView?.showOrHideArrivedEndLayout(true)
mView?.showOrHideOverMapViewFragment(false)
mView?.showOrHidePressengerCheckPager(isShow = false)
mView?.showOrHideStartAutopilotView(isShow = false)
}
TaxiPassengerOrderStatusEnum.JourneyCompleted -> {
// 60 行程完成
mView?.showOrHideStartAutopilotView(isShow = false)
mView?.showOrHidePressengerCheckPager(isShow = false)
mView?.showOrHideArrivedEndLayout(false)
}
TaxiPassengerOrderStatusEnum.Cancel -> {
// 70 取消订单
mView?.showOrHideOverMapViewFragment(false)
mView?.showOrHideStartAutopilotView(isShow = false)
mView?.showOrHidePressengerCheckPager(isShow = false)
mView?.showOrHideArrivedEndLayout(isShow = false)
}
else -> {}
}
}

View File

@@ -1,7 +1,9 @@
package com.mogo.och.taxi.passenger.ui
import android.graphics.drawable.AnimationDrawable
import android.os.Bundle
import android.view.View
import androidx.core.content.ContextCompat
import com.mogo.commons.mvp.MvpFragment
import com.mogo.eagle.core.function.call.hmi.CallerHmiManager
import com.mogo.eagle.core.function.call.map.CallerMapUIServiceManager
@@ -11,12 +13,14 @@ import com.mogo.eagle.core.utilcode.util.OverlayViewUtils
import com.mogo.eagle.core.utilcode.util.UiThreadHandler
import com.mogo.map.listener.IMogoMapListener
import com.mogo.map.uicontroller.VisualAngleMode
import com.mogo.och.common.module.utils.RxUtils
import com.mogo.och.taxi.passenger.R
import com.mogo.och.taxi.passenger.callback.ITaxiPassengerCommonValueCallback
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
@@ -125,7 +129,8 @@ class TaxiPassengerBaseFragment() :
// 切换缩放到中视角
controller.changeZoom2(0.8f)
}
showOrHideArrivedEndLayout(true)
// showOrHideStartAutopilotView(true)
}
BottomBar.SelectView.OVERMAPVIEW -> {
overMapView.displayCustomOverView()
@@ -135,6 +140,10 @@ class TaxiPassengerBaseFragment() :
}
}
aciv_xiaozhi_normal.setImageResource(R.drawable.taxi_p_xioazhi_normal)
val anim = aciv_xiaozhi_normal.drawable as AnimationDrawable
anim.start()
}
private fun initCheckView() {
@@ -211,19 +220,6 @@ class TaxiPassengerBaseFragment() :
}
}
/**
* 显示或隐藏全局概览
*
* @param isShow
*/
fun showOrHideOverMapViewFragment(isShow: Boolean) {
if (isShow) {
overMapView.visibility = View.VISIBLE
} else {
overMapView.visibility = View.GONE
}
}
/**
* 显示或者隐藏乘客可点击自动驾驶页面
* 乘客验证成功,页面显示,按钮置于不可点击
@@ -265,11 +261,9 @@ class TaxiPassengerBaseFragment() :
}
mArrivedEndView?.get()?.let {
OverlayViewUtils.showOverlayView(activity, it, R.style.och_window_anim_alpha)
UiThreadHandler.postDelayed({
it.setDataAndStartAnimation()
}, //如果在全屏 回收需要300毫秒 后期优化使用单独的播放器
500
)
RxUtils.createSubscribe(500) {
it.setDataAndStartAnimation()
}
}
} else {
mArrivedEndView?.get()?.let {

View File

@@ -8,18 +8,16 @@ import com.mogo.eagle.core.utilcode.kotlin.onClick
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger.d
import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant
import com.mogo.eagle.core.utilcode.util.OverlayViewUtils
import com.mogo.och.common.module.utils.RxUtils
import com.mogo.och.taxi.passenger.R
import com.mogo.och.taxi.passenger.callback.ITaxiPassengerCommonCallback
import com.mogo.och.taxi.passenger.widget.WindowRelativeLayout
import com.shuyu.gsyvideoplayer.builder.GSYVideoOptionBuilder
import com.shuyu.gsyvideoplayer.listener.GSYSampleCallBack
import io.reactivex.Observable
import io.reactivex.android.schedulers.AndroidSchedulers
import io.reactivex.disposables.Disposable
import kotlinx.android.synthetic.main.taxi_p_arrived_end_panel.view.aciv_close
import kotlinx.android.synthetic.main.taxi_p_arrived_end_panel.view.actv_endstation
import kotlinx.android.synthetic.main.taxi_p_arrived_end_panel.view.svp_frame
import java.util.concurrent.TimeUnit
/**
@@ -94,25 +92,9 @@ class ArrivedView : WindowRelativeLayout, ArrivedViewModel.ArrivedViewCallback {
}
})
svp_frame.startPlayLogic()
}
/**
* 评论成功 向左移动并消失 消失后感谢页面透明度0-1 然后开始小手的动画
*/
fun scoreSuccess(){
// 10s 后逻辑
subscribe = Observable.timer(10000, TimeUnit.MILLISECONDS)
.observeOn(AndroidSchedulers.mainThread())
.subscribe {
// 正在展示感谢页面
if (taxiPassengerCommonCallback == null) {
// 没有用户确定页面
OverlayViewUtils.dismissOverlayView(this@ArrivedView)
} else {
// 有排队展示的用户确定页面
taxiPassengerCommonCallback?.onCommonCallback()
}
}
RxUtils.createSubscribe(60_000) {
OverlayViewUtils.dismissOverlayView(this@ArrivedView)
}
}
companion object {

View File

@@ -0,0 +1,107 @@
package com.mogo.och.taxi.passenger.ui.arrived;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.widget.AppCompatImageView;
import com.bumptech.glide.Priority;
import com.bumptech.glide.load.engine.DiskCacheStrategy;
import com.bumptech.glide.request.RequestOptions;
import com.bumptech.glide.request.target.CustomTarget;
import com.bumptech.glide.request.transition.Transition;
import com.mogo.eagle.core.function.api.autopilot.IMoGoBackCameraVideoListener;
import com.mogo.eagle.core.function.api.autopilot.IMoGoRoboBusJinlvM1StitchedVideoListener;
import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotControlManager;
import com.mogo.eagle.core.function.call.autopilot.CallerBackCameraVideoListenerManager;
import com.mogo.eagle.core.function.call.autopilot.CallerRoboBusJinlvM1StitchedVideoListenerManager;
import com.mogo.eagle.core.utilcode.mogo.glide.GlideApp;
import com.mogo.eagle.core.utilcode.util.ThreadUtils;
import com.mogo.eagle.core.widget.media.video.TextureVideoViewOutlineProvider;
/**
* 图片帧展示View
*/
public class RightRearGlideView extends AppCompatImageView implements IMoGoBackCameraVideoListener, IMoGoRoboBusJinlvM1StitchedVideoListener {
private static final String TAG = RightRearGlideView.class.getSimpleName();
private final RequestOptions requestOptions = new RequestOptions()
.priority(Priority.HIGH)
.skipMemoryCache(true)
.diskCacheStrategy(DiskCacheStrategy.NONE)
.dontAnimate();
public RightRearGlideView(@NonNull Context context) {
super(context);
}
public RightRearGlideView(@NonNull Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
}
public RightRearGlideView(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@Override
protected void onAttachedToWindow() {
super.onAttachedToWindow();
CallerAutoPilotControlManager.INSTANCE.setIsSubscribeBackCameraVideoVideo(1, true);
CallerBackCameraVideoListenerManager.INSTANCE.addListener(TAG, this);
CallerRoboBusJinlvM1StitchedVideoListenerManager.INSTANCE.addListener(TAG, this);
}
@Override
protected void onDetachedFromWindow() {
super.onDetachedFromWindow();
CallerAutoPilotControlManager.INSTANCE.setIsSubscribeBackCameraVideoVideo(1, false);
CallerBackCameraVideoListenerManager.INSTANCE.removeListener(this);
CallerRoboBusJinlvM1StitchedVideoListenerManager.INSTANCE.removeListener(this);
}
private final CustomTarget<Bitmap> target = new CustomTarget<Bitmap>() {
@Override
public void onResourceReady(@NonNull Bitmap resource, @Nullable Transition<? super Bitmap> transition) {
//回调内容
if (!resource.isRecycled()) {
RightRearGlideView.this.setImageBitmap(resource);
}
}
@Override
public void onLoadCleared(@Nullable Drawable placeholder) {
//这个方法在target被回收时调用如果在除了imageView以外的地方引用了imageView中的bitmap在这里清除引用以避免崩溃
}
};
private void draw(@NonNull byte[] data) {
ThreadUtils.runOnUiThread(() -> GlideApp.with(RightRearGlideView.this)
.asBitmap()
.load(data)
.placeholder(RightRearGlideView.this.getDrawable())
.apply(requestOptions)
.into(target));
}
@Override
public void onBackCameraVideo(@NonNull byte[] data) {
draw(data);
}
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
setOutlineProvider(new TextureVideoViewOutlineProvider(36F));
setClipToOutline(true);
}
@Override
public void onRoboBusJinlvM1StitchedVideo(@NonNull byte[] data) {
draw(data);
}
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 930 KiB

After

Width:  |  Height:  |  Size: 6.1 MiB

View File

@@ -0,0 +1,80 @@
<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android" android:visible="true"
android:oneshot="false">
<item android:drawable="@drawable/xiaozhi_normal_001" android:duration="60"/>
<item android:drawable="@drawable/xiaozhi_normal_002" android:duration="60"/>
<item android:drawable="@drawable/xiaozhi_normal_003" android:duration="60"/>
<item android:drawable="@drawable/xiaozhi_normal_004" android:duration="60"/>
<item android:drawable="@drawable/xiaozhi_normal_005" android:duration="60"/>
<item android:drawable="@drawable/xiaozhi_normal_006" android:duration="60"/>
<item android:drawable="@drawable/xiaozhi_normal_007" android:duration="60"/>
<item android:drawable="@drawable/xiaozhi_normal_008" android:duration="60"/>
<item android:drawable="@drawable/xiaozhi_normal_009" android:duration="60"/>
<item android:drawable="@drawable/xiaozhi_normal_010" android:duration="60"/>
<item android:drawable="@drawable/xiaozhi_normal_010" android:duration="60"/>
<item android:drawable="@drawable/xiaozhi_normal_011" android:duration="60"/>
<item android:drawable="@drawable/xiaozhi_normal_012" android:duration="60"/>
<item android:drawable="@drawable/xiaozhi_normal_013" android:duration="60"/>
<item android:drawable="@drawable/xiaozhi_normal_014" android:duration="60"/>
<item android:drawable="@drawable/xiaozhi_normal_015" android:duration="60"/>
<item android:drawable="@drawable/xiaozhi_normal_016" android:duration="60"/>
<item android:drawable="@drawable/xiaozhi_normal_017" android:duration="60"/>
<item android:drawable="@drawable/xiaozhi_normal_018" android:duration="60"/>
<item android:drawable="@drawable/xiaozhi_normal_019" android:duration="60"/>
<item android:drawable="@drawable/xiaozhi_normal_020" android:duration="60"/>
<item android:drawable="@drawable/xiaozhi_normal_021" android:duration="60"/>
<item android:drawable="@drawable/xiaozhi_normal_022" android:duration="60"/>
<item android:drawable="@drawable/xiaozhi_normal_023" android:duration="60"/>
<item android:drawable="@drawable/xiaozhi_normal_024" android:duration="60"/>
<item android:drawable="@drawable/xiaozhi_normal_025" android:duration="60"/>
<item android:drawable="@drawable/xiaozhi_normal_026" android:duration="60"/>
<item android:drawable="@drawable/xiaozhi_normal_027" android:duration="60"/>
<item android:drawable="@drawable/xiaozhi_normal_028" android:duration="60"/>
<item android:drawable="@drawable/xiaozhi_normal_029" android:duration="60"/>
<item android:drawable="@drawable/xiaozhi_normal_030" android:duration="60"/>
<item android:drawable="@drawable/xiaozhi_normal_031" android:duration="60"/>
<item android:drawable="@drawable/xiaozhi_normal_032" android:duration="60"/>
<item android:drawable="@drawable/xiaozhi_normal_033" android:duration="60"/>
<item android:drawable="@drawable/xiaozhi_normal_034" android:duration="60"/>
<item android:drawable="@drawable/xiaozhi_normal_035" android:duration="60"/>
<item android:drawable="@drawable/xiaozhi_normal_036" android:duration="60"/>
<item android:drawable="@drawable/xiaozhi_normal_037" android:duration="60"/>
<item android:drawable="@drawable/xiaozhi_normal_038" android:duration="60"/>
<item android:drawable="@drawable/xiaozhi_normal_039" android:duration="60"/>
<item android:drawable="@drawable/xiaozhi_normal_040" android:duration="60"/>
<item android:drawable="@drawable/xiaozhi_normal_041" android:duration="60"/>
<item android:drawable="@drawable/xiaozhi_normal_042" android:duration="60"/>
<item android:drawable="@drawable/xiaozhi_normal_043" android:duration="60"/>
<item android:drawable="@drawable/xiaozhi_normal_044" android:duration="60"/>
<item android:drawable="@drawable/xiaozhi_normal_045" android:duration="60"/>
<item android:drawable="@drawable/xiaozhi_normal_046" android:duration="60"/>
<item android:drawable="@drawable/xiaozhi_normal_047" android:duration="60"/>
<item android:drawable="@drawable/xiaozhi_normal_048" android:duration="60"/>
<item android:drawable="@drawable/xiaozhi_normal_049" android:duration="60"/>
<item android:drawable="@drawable/xiaozhi_normal_050" android:duration="60"/>
<item android:drawable="@drawable/xiaozhi_normal_051" android:duration="60"/>
<item android:drawable="@drawable/xiaozhi_normal_052" android:duration="60"/>
<item android:drawable="@drawable/xiaozhi_normal_053" android:duration="60"/>
<item android:drawable="@drawable/xiaozhi_normal_054" android:duration="60"/>
<item android:drawable="@drawable/xiaozhi_normal_055" android:duration="60"/>
<item android:drawable="@drawable/xiaozhi_normal_056" android:duration="60"/>
<item android:drawable="@drawable/xiaozhi_normal_057" android:duration="60"/>
<item android:drawable="@drawable/xiaozhi_normal_058" android:duration="60"/>
<item android:drawable="@drawable/xiaozhi_normal_059" android:duration="60"/>
<item android:drawable="@drawable/xiaozhi_normal_060" android:duration="60"/>
<item android:drawable="@drawable/xiaozhi_normal_061" android:duration="60"/>
<item android:drawable="@drawable/xiaozhi_normal_062" android:duration="60"/>
<item android:drawable="@drawable/xiaozhi_normal_063" android:duration="60"/>
<item android:drawable="@drawable/xiaozhi_normal_064" android:duration="60"/>
<item android:drawable="@drawable/xiaozhi_normal_065" android:duration="60"/>
</animation-list>

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

View File

@@ -25,6 +25,7 @@
android:layout_height="@dimen/dp_120"/>
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/actv_arrived_station"
app:layout_constraintStart_toStartOf="@+id/actv_endstation"
app:layout_constraintBottom_toTopOf="@+id/actv_endstation"
android:layout_marginBottom="@dimen/dp_26"
@@ -48,12 +49,12 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<View
<com.mogo.och.taxi.passenger.ui.arrived.RightRearGlideView
android:id="@+id/v_video_right_rear"
android:background="@color/background_error"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
android:layout_marginStart="@dimen/dp_90"
android:background="@color/arrow_color"
android:layout_marginBottom="@dimen/dp_90"
android:layout_width="@dimen/dp_900"
android:layout_height="@dimen/dp_506"/>
@@ -63,7 +64,7 @@
app:layout_constraintBottom_toBottomOf="@+id/v_video_right_rear"
android:layout_marginStart="@dimen/dp_44"
android:layout_marginBottom="@dimen/dp_11"
android:text="向摄像头"
android:text="向摄像头"
android:textSize="@dimen/dp_40"
android:textColor="@color/taxi_p_76D7FF"
android:layout_width="wrap_content"

View File

@@ -100,4 +100,14 @@
android:layout_width="match_parent"
android:layout_height="@dimen/dp_160"/>
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/aciv_xiaozhi_normal"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
android:layout_marginEnd="@dimen/dp_82"
android:src="@drawable/xiaozhi_normal_001"
android:layout_marginBottom="@dimen/dp_28"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</androidx.constraintlayout.widget.ConstraintLayout>