From d2bb4e43753c7349ab8ddf8c6200ff527e0db0d9 Mon Sep 17 00:00:00 2001 From: zlzw <583819556@qq.com> Date: Thu, 22 Sep 2022 13:02:53 +0800 Subject: [PATCH] update --- .../com/yunbao/faceunity/FaceManager.java | 41 +++++++------- .../adapters/ContainerRecyclerAdapter.java | 31 +++++++---- .../adapters/vh/AnimojiViewHolder.java | 15 +++-- .../adapters/vh/BigHeadViewHolder.java | 3 +- .../vh/MakeupCustomItemViewHolder.java | 3 + .../adapters/vh/MakeupViewHolder.java | 7 ++- .../adapters/vh/StickerViewHolder.java | 3 +- .../faceunity/data/BodyBeautyDataFactory.java | 52 +++++++++++------- .../faceunity/data/MakeupDataFactory.java | 4 ++ .../yunbao/faceunity/ui/FaceUnityView.java | 19 ++++++- .../yunbao/faceunity/utils/FaceSPUtils.java | 8 +++ .../src/main/res/layout/layout_faceunity.xml | 8 ++- .../icon_beauty_box_style_7_normal.png | Bin 6989 -> 4892 bytes .../icon_beauty_style_7_selector.png | Bin 0 -> 4892 bytes .../phonelive/activity/LauncherActivity.java | 7 --- .../live/activity/LiveRyAnchorActivity.java | 1 + .../live/views/LiveNewReadyRyViewHolder.java | 20 +++++++ .../yunbao/live/views/LiveRoomViewHolder.java | 14 ++++- .../main/res/layout/view_new_live_ready.xml | 15 ++++- 19 files changed, 176 insertions(+), 75 deletions(-) create mode 100644 FaceUnity/src/main/res/mipmap-xxhdpi/icon_beauty_style_7_selector.png diff --git a/FaceUnity/src/main/java/com/yunbao/faceunity/FaceManager.java b/FaceUnity/src/main/java/com/yunbao/faceunity/FaceManager.java index 46cb20f4d..004b52187 100644 --- a/FaceUnity/src/main/java/com/yunbao/faceunity/FaceManager.java +++ b/FaceUnity/src/main/java/com/yunbao/faceunity/FaceManager.java @@ -2,35 +2,24 @@ package com.yunbao.faceunity; import static android.content.Context.SENSOR_SERVICE; -import static com.lzy.okgo.utils.HttpUtils.runOnUiThread; - import android.content.Context; -import android.graphics.Bitmap; -import android.graphics.BitmapFactory; import android.hardware.Camera; import android.hardware.Sensor; import android.hardware.SensorEvent; import android.hardware.SensorEventListener; import android.hardware.SensorManager; -import android.opengl.GLSurfaceView; import android.os.Environment; import android.util.Log; import androidx.annotation.NonNull; -import androidx.annotation.Nullable; import com.faceunity.core.callback.OperateCallback; -import com.faceunity.core.entity.FURenderFrameData; -import com.faceunity.core.entity.FURenderInputData; import com.faceunity.core.entity.FURenderOutputData; import com.faceunity.core.enumeration.CameraFacingEnum; import com.faceunity.core.enumeration.FUAIProcessorEnum; import com.faceunity.core.enumeration.FUInputTextureEnum; import com.faceunity.core.enumeration.FUTransformMatrixEnum; -import com.faceunity.core.faceunity.FURenderKit; import com.faceunity.core.faceunity.FURenderManager; -import com.faceunity.core.listener.OnGlRendererListener; -import com.faceunity.core.renderer.CameraRenderer; import com.faceunity.core.utils.CameraUtils; import com.faceunity.core.utils.FULogger; import com.yunbao.faceunity.data.FaceUnityDataFactory; @@ -39,23 +28,17 @@ import com.yunbao.faceunity.ui.FaceUnityView; import com.yunbao.faceunity.utils.Authpack; import com.yunbao.faceunity.utils.CSVUtils; import com.yunbao.faceunity.utils.FURenderer; -import com.yunbao.faceunity.utils.FaceCameraConfig; import com.yunbao.faceunity.utils.FaceUnityData; import com.yunbao.faceunity.utils.net.OkHttpUtils; import java.io.File; -import java.io.FileOutputStream; import java.text.SimpleDateFormat; -import java.util.Arrays; import java.util.Date; import java.util.Locale; import cn.rongcloud.rtc.api.RCRTCEngine; import cn.rongcloud.rtc.api.callback.IRCRTCVideoOutputFrameListener; -import cn.rongcloud.rtc.api.stream.RCRTCVideoView; import cn.rongcloud.rtc.base.RCRTCVideoFrame; -import cn.rongcloud.rtc.core.EglRenderer; -import io.rong.callkit.SingleCallActivity; /** * 美颜模块管理类,接入测试中 @@ -64,6 +47,7 @@ public class FaceManager implements SensorEventListener { private static boolean isInit = false; private static final String TAG = FaceManager.class.getSimpleName(); private FaceUnityDataFactory mFaceUnityDataFactory; + private FaceManager.FaceStatusChanged faceStatusChanged; /** * 初始化美颜模块,在AppContext中调用 @@ -72,7 +56,7 @@ public class FaceManager implements SensorEventListener { if (isInit) { return; } - FaceUnityData.mApplication=context; + FaceUnityData.mApplication = context; OkHttpUtils.getInstance().init(context, false); FURenderManager.setCoreDebug(FULogger.LogLevel.OFF); FURenderManager.setKitDebug(FULogger.LogLevel.OFF); @@ -91,6 +75,7 @@ public class FaceManager implements SensorEventListener { } private FURenderer mFURenderer; + private FaceUnityView faceUnityView; /** * 配置美颜SDK @@ -115,8 +100,13 @@ public class FaceManager implements SensorEventListener { /** * 绑定控制view */ - public void bindControlView(FaceUnityView view){ - view.bindDataFactory(mFaceUnityDataFactory); + public void bindControlView(FaceUnityView view) { + this.faceUnityView = view; + faceUnityView.bindDataFactory(mFaceUnityDataFactory); + } + + public void setFaceStatusChanged(FaceStatusChanged faceStatusChanged) { + this.faceStatusChanged = faceStatusChanged; } private boolean mIsFirstFrame = true; @@ -193,12 +183,16 @@ public class FaceManager implements SensorEventListener { @Override public void onTrackStatusChanged(FUAIProcessorEnum type, int status) { Log.e(TAG, "onTrackStatusChanged: 人脸数: " + status); + if (faceStatusChanged != null) { + faceStatusChanged.onFaceChanged(status); + } + } @Override public void onFpsChanged(double fps, double callTime) { final String FPS = String.format(Locale.getDefault(), "%.2f", fps); - // Log.d(TAG, "onFpsChanged FPS: " + FPS + ", callTime: " + String.format("%.2f", callTime)); + // Log.d(TAG, "onFpsChanged FPS: " + FPS + ", callTime: " + String.format("%.2f", callTime)); } @Override @@ -218,10 +212,15 @@ public class FaceManager implements SensorEventListener { } + /** * 离开渲染界面时注销融云监听器,不然会绿屏 */ public void onClose() { RCRTCEngine.getInstance().getDefaultVideoStream().setVideoFrameListener(null); } + + public interface FaceStatusChanged { + void onFaceChanged(int num); + } } diff --git a/FaceUnity/src/main/java/com/yunbao/faceunity/adapters/ContainerRecyclerAdapter.java b/FaceUnity/src/main/java/com/yunbao/faceunity/adapters/ContainerRecyclerAdapter.java index b00235a82..e57c4b8ca 100644 --- a/FaceUnity/src/main/java/com/yunbao/faceunity/adapters/ContainerRecyclerAdapter.java +++ b/FaceUnity/src/main/java/com/yunbao/faceunity/adapters/ContainerRecyclerAdapter.java @@ -4,6 +4,7 @@ import android.content.Context; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import android.widget.TextView; import androidx.annotation.NonNull; import androidx.recyclerview.widget.RecyclerView; @@ -71,16 +72,17 @@ public class ContainerRecyclerAdapter extends RecyclerView.Adapter list) { @@ -221,17 +224,21 @@ public class ContainerRecyclerAdapter extends RecyclerView.Adapter { adapter.getAnimojiDataFactory().onAnimojiSelected((AnimojiBean) itemView.getTag()); - setSelectPosition(getAdapterPosition()); + setSelectPosition(getLayoutPosition()); saveData(); }); } @@ -44,21 +44,26 @@ public class AnimojiViewHolder extends BaseViewHolder { @Override public boolean loadData() { String data = adapter.getString(getName(this)); - if (data != null) { - icon.setSelected(getAdapterPosition() == Integer.parseInt(data)); - return true; + if (data == null) { + return false; } + if (!data.equals(String.valueOf(getLayoutPosition()))) { + return false; + } + icon.setSelected(true); + adapter.getAnimojiDataFactory().onAnimojiSelected((AnimojiBean) itemView.getTag()); return false; } @Override public void saveData() { - adapter.save(getName(this), String.valueOf(getAdapterPosition())); + adapter.save(getName(this), String.valueOf(getLayoutPosition())); } @Override public void reset(List list) { adapter.del(getName(this)); + adapter.getAnimojiDataFactory().onAnimojiSelected((AnimojiBean) list.get(0)); adapter.setSelectPosition(0); } diff --git a/FaceUnity/src/main/java/com/yunbao/faceunity/adapters/vh/BigHeadViewHolder.java b/FaceUnity/src/main/java/com/yunbao/faceunity/adapters/vh/BigHeadViewHolder.java index 567293887..a79337fbc 100644 --- a/FaceUnity/src/main/java/com/yunbao/faceunity/adapters/vh/BigHeadViewHolder.java +++ b/FaceUnity/src/main/java/com/yunbao/faceunity/adapters/vh/BigHeadViewHolder.java @@ -69,7 +69,8 @@ public class BigHeadViewHolder extends BaseViewHolder { @Override public void reset(List list) { adapter.del(getName(this)); - itemView.callOnClick(); + adapter.getPropDataFactory().setPropType(FunctionEnum.BIG_HEAD); + adapter.getPropDataFactory().onItemSelected((PropBean) list.get(0)); adapter.setSelectPosition(0); } } diff --git a/FaceUnity/src/main/java/com/yunbao/faceunity/adapters/vh/MakeupCustomItemViewHolder.java b/FaceUnity/src/main/java/com/yunbao/faceunity/adapters/vh/MakeupCustomItemViewHolder.java index 58cee9fdc..172efd280 100644 --- a/FaceUnity/src/main/java/com/yunbao/faceunity/adapters/vh/MakeupCustomItemViewHolder.java +++ b/FaceUnity/src/main/java/com/yunbao/faceunity/adapters/vh/MakeupCustomItemViewHolder.java @@ -15,6 +15,9 @@ import com.yunbao.faceunity.seekbar.DiscreteSeekBar; import java.util.List; +/** + * 美妆 - 自定义 + */ public class MakeupCustomItemViewHolder extends BaseViewHolder { private ImageView icon; private TextView title; diff --git a/FaceUnity/src/main/java/com/yunbao/faceunity/adapters/vh/MakeupViewHolder.java b/FaceUnity/src/main/java/com/yunbao/faceunity/adapters/vh/MakeupViewHolder.java index acc0bde3b..604b9239e 100644 --- a/FaceUnity/src/main/java/com/yunbao/faceunity/adapters/vh/MakeupViewHolder.java +++ b/FaceUnity/src/main/java/com/yunbao/faceunity/adapters/vh/MakeupViewHolder.java @@ -9,6 +9,7 @@ import androidx.annotation.NonNull; import com.yunbao.faceunity.R; import com.yunbao.faceunity.entity.BaseBean; import com.yunbao.faceunity.entity.MakeupCombinationBean; +import com.yunbao.faceunity.utils.FaceSPUtils; import java.util.List; @@ -72,6 +73,10 @@ public class MakeupViewHolder extends BaseViewHolder { @Override public void reset(Listlist) { - + adapter.del(getName(this)); + FaceSPUtils.getInstance().delStart("MakeupCustomItemViewHolder"); + adapter.getMakeupDataFactory().onMakeupCombinationSelected((MakeupCombinationBean) list.get(0)); + adapter.getMakeupDataFactory().clearAll(); + adapter.setSelectPosition(0); } } diff --git a/FaceUnity/src/main/java/com/yunbao/faceunity/adapters/vh/StickerViewHolder.java b/FaceUnity/src/main/java/com/yunbao/faceunity/adapters/vh/StickerViewHolder.java index efdaced34..edc5ba70f 100644 --- a/FaceUnity/src/main/java/com/yunbao/faceunity/adapters/vh/StickerViewHolder.java +++ b/FaceUnity/src/main/java/com/yunbao/faceunity/adapters/vh/StickerViewHolder.java @@ -68,7 +68,8 @@ public class StickerViewHolder extends BaseViewHolder{ @Override public void reset(List list) { adapter.del(getName(this)); - itemView.callOnClick(); + adapter.getPropDataFactory().setPropType(FunctionEnum.STICKER); + adapter.getPropDataFactory().onItemSelected((PropBean) list.get(0)); adapter.setSelectPosition(0); } } diff --git a/FaceUnity/src/main/java/com/yunbao/faceunity/data/BodyBeautyDataFactory.java b/FaceUnity/src/main/java/com/yunbao/faceunity/data/BodyBeautyDataFactory.java index 29431f5bc..6a7cb088c 100644 --- a/FaceUnity/src/main/java/com/yunbao/faceunity/data/BodyBeautyDataFactory.java +++ b/FaceUnity/src/main/java/com/yunbao/faceunity/data/BodyBeautyDataFactory.java @@ -2,6 +2,8 @@ package com.yunbao.faceunity.data; import com.faceunity.core.controller.bodyBeauty.BodyBeautyParam; import com.faceunity.core.entity.FUBundleData; +import com.faceunity.core.enumeration.FUAITypeEnum; +import com.faceunity.core.faceunity.FUAIKit; import com.faceunity.core.faceunity.FURenderKit; import com.faceunity.core.model.bodyBeauty.BodyBeauty; @@ -9,6 +11,7 @@ import com.yunbao.faceunity.entity.BodyBeautyBean; import com.yunbao.faceunity.entity.ModelAttributeData; import com.yunbao.faceunity.infe.AbstractBodyBeautyDataFactory; import com.yunbao.faceunity.repo.BodyBeautySource; +import com.yunbao.faceunity.utils.FaceUnityConfig; import java.util.ArrayList; import java.util.HashMap; @@ -31,13 +34,14 @@ public class BodyBeautyDataFactory extends AbstractBodyBeautyDataFactory { /*渲染控制器*/ - private final FURenderKit mFURenderKit = FURenderKit.getInstance(); + private FURenderKit mFURenderKit = FURenderKit.getInstance(); + private FUAIKit mFUAIKit = FUAIKit.getInstance(); /*美体数据模型*/ public final BodyBeauty bodyBeauty; public BodyBeautyDataFactory() { - bodyBeauty = new BodyBeauty(new FUBundleData(BodyBeautySource.BUNDLE_BODY_BEAUTY)); + bodyBeauty = new BodyBeauty(new FUBundleData(FaceUnityConfig.BUNDLE_BODY_BEAUTY)); } @@ -90,6 +94,13 @@ public class BodyBeautyDataFactory extends AbstractBodyBeautyDataFactory { } } + @Override + public void enableBodyBeauty(boolean enable) { + if (mFURenderKit.getBodyBeauty() != null) { + mFURenderKit.getBodyBeauty().setEnable(enable); + } + } + /** * 获取当前模型 * @@ -99,22 +110,11 @@ public class BodyBeautyDataFactory extends AbstractBodyBeautyDataFactory { return bodyBeauty; } - /** - * 美体开关设置 - * - * @param enable - */ - @Override - public void enableBodyBeauty(boolean enable) { - if (mFURenderKit.getBodyBeauty() != null) { - mFURenderKit.getBodyBeauty().setEnable(enable); - } - } /*模型映射设置模型值*/ private final HashMap bodyBeautySetMapping = new HashMap() { { - put(BodyBeautyParam.BODY_SLIM_INTENSITY, value -> getCurrentBodyBeautyModel().setBodySlimIntensity(value)); + put(BodyBeautyParam.BODY_SLIM_INTENSITY, value -> getCurrentBodyBeautyModel().setBodySlimIntensity(value)); put(BodyBeautyParam.LEG_STRETCH_INTENSITY, value -> getCurrentBodyBeautyModel().setLegStretchIntensity(value)); put(BodyBeautyParam.WAIST_SLIM_INTENSITY, value -> getCurrentBodyBeautyModel().setWaistSlimIntensity(value)); put(BodyBeautyParam.SHOULDER_SLIM_INTENSITY, value -> getCurrentBodyBeautyModel().setShoulderSlimIntensity(value)); @@ -127,13 +127,13 @@ public class BodyBeautyDataFactory extends AbstractBodyBeautyDataFactory { /*模型映射获取模型值*/ HashMap bodyBeautyGetMapping = new HashMap() { { - put(BodyBeautyParam.BODY_SLIM_INTENSITY, () -> getCurrentBodyBeautyModel().getBodySlimIntensity()); - put(BodyBeautyParam.LEG_STRETCH_INTENSITY, () -> getCurrentBodyBeautyModel().getLegStretchIntensity()); - put(BodyBeautyParam.WAIST_SLIM_INTENSITY, () -> getCurrentBodyBeautyModel().getWaistSlimIntensity()); - put(BodyBeautyParam.SHOULDER_SLIM_INTENSITY, () -> getCurrentBodyBeautyModel().getShoulderSlimIntensity()); - put(BodyBeautyParam.HIP_SLIM_INTENSITY, () -> getCurrentBodyBeautyModel().getHipSlimIntensity()); - put(BodyBeautyParam.HEAD_SLIM_INTENSITY, () -> getCurrentBodyBeautyModel().getHeadSlimIntensity()); - put(BodyBeautyParam.LEG_SLIM_INTENSITY, () -> getCurrentBodyBeautyModel().getLegSlimIntensity()); + put(BodyBeautyParam.BODY_SLIM_INTENSITY, ()->getCurrentBodyBeautyModel().getBodySlimIntensity()); + put(BodyBeautyParam.LEG_STRETCH_INTENSITY, ()->getCurrentBodyBeautyModel().getLegStretchIntensity()); + put(BodyBeautyParam.WAIST_SLIM_INTENSITY, ()->getCurrentBodyBeautyModel().getWaistSlimIntensity()); + put(BodyBeautyParam.SHOULDER_SLIM_INTENSITY, ()->getCurrentBodyBeautyModel().getShoulderSlimIntensity()); + put(BodyBeautyParam.HIP_SLIM_INTENSITY, ()->getCurrentBodyBeautyModel().getHipSlimIntensity()); + put(BodyBeautyParam.HEAD_SLIM_INTENSITY, ()->getCurrentBodyBeautyModel().getHeadSlimIntensity()); + put(BodyBeautyParam.LEG_SLIM_INTENSITY, ()->getCurrentBodyBeautyModel().getLegSlimIntensity()); } }; @@ -143,8 +143,18 @@ public class BodyBeautyDataFactory extends AbstractBodyBeautyDataFactory { * FURenderKit加载当前特效 */ public void bindCurrentRenderer() { + mFUAIKit.loadAIProcessor(FaceUnityConfig.getAIHumanBundle(), FUAITypeEnum.FUAITYPE_HUMAN_PROCESSOR); + mFUAIKit.setMaxFaces(1); + mFURenderKit.setFaceBeauty(FaceBeautyDataFactory.faceBeauty); mFURenderKit.setBodyBeauty(bodyBeauty); } + /** + * 结束需要释放AI驱动 + */ + public void releaseAIProcessor() { + mFUAIKit.releaseAIProcessor(FUAITypeEnum.FUAITYPE_HUMAN_PROCESSOR); + } + } diff --git a/FaceUnity/src/main/java/com/yunbao/faceunity/data/MakeupDataFactory.java b/FaceUnity/src/main/java/com/yunbao/faceunity/data/MakeupDataFactory.java index 99c6809a3..1e808a010 100644 --- a/FaceUnity/src/main/java/com/yunbao/faceunity/data/MakeupDataFactory.java +++ b/FaceUnity/src/main/java/com/yunbao/faceunity/data/MakeupDataFactory.java @@ -846,4 +846,8 @@ public class MakeupDataFactory extends AbstractMakeupDataFactory { mFURenderKit.getPropContainer().addProp(expressionRecognition); } } + public void clearAll(){ + currentMakeup = new Makeup(new FUBundleData(FaceUnityConfig.BUNDLE_FACE_MAKEUP)); + mFURenderKit.setMakeup(currentMakeup); + } } \ No newline at end of file diff --git a/FaceUnity/src/main/java/com/yunbao/faceunity/ui/FaceUnityView.java b/FaceUnity/src/main/java/com/yunbao/faceunity/ui/FaceUnityView.java index ef2f8e0bf..3cbcc9d00 100644 --- a/FaceUnity/src/main/java/com/yunbao/faceunity/ui/FaceUnityView.java +++ b/FaceUnity/src/main/java/com/yunbao/faceunity/ui/FaceUnityView.java @@ -3,6 +3,7 @@ package com.yunbao.faceunity.ui; import android.content.Context; import android.util.AttributeSet; import android.view.LayoutInflater; +import android.view.View; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.TextView; @@ -111,9 +112,24 @@ public class FaceUnityView extends LinearLayout implements StickerDownloadHelper } private void initViewClick() { - menu2Back.setOnClickListener(v -> goBackMainMenu()); + menu2Back.setOnClickListener(v -> { + Object tag = menu2Back.getTag(); + if(tag==null) { + goBackMainMenu(); + }else if(tag.equals("makeup")){ + title.setText(R.string.home_function_name_makeup); + title.setVisibility(VISIBLE); + menuDiy.setVisibility(VISIBLE); + tabLayout.removeAllTabs(); + changeRecyclerItemCount(5); + setContainerRecycler(MakeupSource.buildCombinations()); + menu2Back.setTag(null); + } + }); menuDiy.setOnClickListener(v -> { + menu2Back.setTag("makeup"); changeRecyclerItemCount(5); + menuDiy.setVisibility(GONE); ArrayList list = MakeupSource.buildCustomClasses(); setTab(createTabs(list)); }); @@ -128,6 +144,7 @@ public class FaceUnityView extends LinearLayout implements StickerDownloadHelper title.setVisibility(VISIBLE); menu2.setVisibility(GONE); menuGroup.setVisibility(VISIBLE); + menuDiy.setVisibility(GONE); } diff --git a/FaceUnity/src/main/java/com/yunbao/faceunity/utils/FaceSPUtils.java b/FaceUnity/src/main/java/com/yunbao/faceunity/utils/FaceSPUtils.java index 0781c7b7c..f4ba6d5b0 100644 --- a/FaceUnity/src/main/java/com/yunbao/faceunity/utils/FaceSPUtils.java +++ b/FaceUnity/src/main/java/com/yunbao/faceunity/utils/FaceSPUtils.java @@ -30,4 +30,12 @@ public class FaceSPUtils { public void del(String key) { mSharedPreferences.edit().remove(key).apply(); } + + public void delStart(String key){ + for (String _key : mSharedPreferences.getAll().keySet()) { + if(_key.startsWith(key)){ + mSharedPreferences.edit().remove(key).apply(); + } + } + } } diff --git a/FaceUnity/src/main/res/layout/layout_faceunity.xml b/FaceUnity/src/main/res/layout/layout_faceunity.xml index 161b09f3d..f24b8d17c 100644 --- a/FaceUnity/src/main/res/layout/layout_faceunity.xml +++ b/FaceUnity/src/main/res/layout/layout_faceunity.xml @@ -13,8 +13,8 @@ android:layout_gravity="center_horizontal" android:layout_marginTop="@dimen/x24" android:layout_marginBottom="@dimen/x15" + android:paddingTop="20dp" android:visibility="gone" - android:paddingTop="10dp" app:dsb_indicatorColor="#CDCDCD" app:dsb_indicatorElevation="0dp" app:dsb_indicatorPopupEnabled="true" @@ -171,6 +171,8 @@ android:layout_height="wrap_content" android:layout_marginStart="10dp" android:layout_weight="0" + android:paddingStart="10dp" + android:paddingEnd="10dp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" @@ -186,8 +188,10 @@ diff --git a/FaceUnity/src/main/res/mipmap-xxhdpi/icon_beauty_box_style_7_normal.png b/FaceUnity/src/main/res/mipmap-xxhdpi/icon_beauty_box_style_7_normal.png index d76dc2580a164314af690c9f4991e211444c3a75..c33de736cb922e56336ffe1b0a0d19e4ec16b3ea 100644 GIT binary patch literal 4892 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 fpW_Ba3-iW{?-#zo00000NkvXXu0mjf9+oZ= diff --git a/FaceUnity/src/main/res/mipmap-xxhdpi/icon_beauty_style_7_selector.png b/FaceUnity/src/main/res/mipmap-xxhdpi/icon_beauty_style_7_selector.png new file mode 100644 index 0000000000000000000000000000000000000000..c33de736cb922e56336ffe1b0a0d19e4ec16b3ea GIT binary patch literal 4892 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 O0000 { - FaceManager manager = new FaceManager(); - manager.initFURender(mContext); - LiveFaceUnityDialogFragment fragment = new LiveFaceUnityDialogFragment(mContext); - fragment.setManager(manager); - fragment.show(((LauncherActivity) mContext).getSupportFragmentManager(), "FaceUnity"); - }); } diff --git a/live/src/main/java/com/yunbao/live/activity/LiveRyAnchorActivity.java b/live/src/main/java/com/yunbao/live/activity/LiveRyAnchorActivity.java index 3d43f2428..6d86ed44d 100644 --- a/live/src/main/java/com/yunbao/live/activity/LiveRyAnchorActivity.java +++ b/live/src/main/java/com/yunbao/live/activity/LiveRyAnchorActivity.java @@ -47,6 +47,7 @@ import com.yunbao.live.bean.LiveKsyConfigBean; import com.yunbao.live.bean.LiveReceiveGiftBean; import com.yunbao.live.bean.WishlistModel; import com.yunbao.live.dialog.LiveBeautyDialogFragment; +import com.yunbao.live.dialog.LiveFaceUnityDialogFragment; import com.yunbao.live.dialog.LiveFunctionDialogFragment; import com.yunbao.live.dialog.LiveLinkMicListDialogFragment; import com.yunbao.live.dialog.LiveMicUserDialogFragment; diff --git a/live/src/main/java/com/yunbao/live/views/LiveNewReadyRyViewHolder.java b/live/src/main/java/com/yunbao/live/views/LiveNewReadyRyViewHolder.java index 2f21d53b5..3a244c2f1 100644 --- a/live/src/main/java/com/yunbao/live/views/LiveNewReadyRyViewHolder.java +++ b/live/src/main/java/com/yunbao/live/views/LiveNewReadyRyViewHolder.java @@ -6,6 +6,8 @@ import android.content.Context; import android.content.Intent; import android.graphics.drawable.Drawable; import android.os.Bundle; +import android.os.Handler; +import android.os.Looper; import android.text.TextUtils; import android.view.View; import android.view.ViewGroup; @@ -71,6 +73,7 @@ public class LiveNewReadyRyViewHolder extends AbsViewHolder implements View.OnCl private int mLiveSdk; private LiveClassBean classBean; private FaceManager manager; + private TextView faceTextView;//提示人脸未检测到的TextView public LiveNewReadyRyViewHolder(Context context, ViewGroup parentView, int liveSdk) { super(context, parentView, liveSdk); @@ -120,6 +123,8 @@ public class LiveNewReadyRyViewHolder extends AbsViewHolder implements View.OnCl mLiveClass = (TextView) findViewById(R.id.live_class); mLiveTypeTextView = (TextView) findViewById(R.id.text_room_type); mLiveWishListTextView = (TextView) findViewById(R.id.text_wishlist); + faceTextView=(TextView)findViewById(R.id.faceTextView); + mImageUtil = ((LiveActivity) mContext).getProcessImageUtil(); mImageUtil.setImageResultCallback(new ImageResultCallback() { @@ -188,6 +193,20 @@ public class LiveNewReadyRyViewHolder extends AbsViewHolder implements View.OnCl } }; manager = new FaceManager(); + manager.setFaceStatusChanged(new FaceManager.FaceStatusChanged() { + final Handler handler = new Handler(Looper.getMainLooper()); + + @Override + public void onFaceChanged(int num) { + handler.post(() -> { + if (num == 0) { + faceTextView.setVisibility(View.VISIBLE); + } else { + faceTextView.setVisibility(View.GONE); + } + }); + } + }); manager.initFURender(mContext); manager.drawRongFrame(mContext); } @@ -229,6 +248,7 @@ public class LiveNewReadyRyViewHolder extends AbsViewHolder implements View.OnCl public void setFaceUnity() { LiveFaceUnityDialogFragment fragment = new LiveFaceUnityDialogFragment(mContext); fragment.setManager(manager); + if (mContext instanceof LiveRyAnchorActivity) { fragment.show(((LiveRyAnchorActivity) mContext).getSupportFragmentManager(), "FaceUnity"); } diff --git a/live/src/main/java/com/yunbao/live/views/LiveRoomViewHolder.java b/live/src/main/java/com/yunbao/live/views/LiveRoomViewHolder.java index 552043969..bb36809a5 100644 --- a/live/src/main/java/com/yunbao/live/views/LiveRoomViewHolder.java +++ b/live/src/main/java/com/yunbao/live/views/LiveRoomViewHolder.java @@ -108,6 +108,7 @@ import com.yunbao.live.bean.WishlistItemModel; import com.yunbao.live.custom.LiveLightView; import com.yunbao.live.custom.RightGradual; import com.yunbao.live.custom.TopGradual; +import com.yunbao.live.dialog.LiveFaceUnityDialogFragment; import com.yunbao.live.dialog.LiveFansMedalDialogFragment; import com.yunbao.live.dialog.LiveHDDialogFragment; import com.yunbao.live.dialog.LiveUserDialogFragment; @@ -963,7 +964,7 @@ public class LiveRoomViewHolder extends AbsViewHolder implements View.OnClickLis reloadIM(); } public void hideFloatMsg(){ - msg.setVisibility(View.GONE); + msgLayout.setVisibility(View.GONE); } private void showBanner2() { @@ -2541,6 +2542,12 @@ public class LiveRoomViewHolder extends AbsViewHolder implements View.OnClickLis */ public void startFace() { manager=new FaceManager(); + manager.setFaceStatusChanged(new FaceManager.FaceStatusChanged() { + @Override + public void onFaceChanged(int num) { + + } + }); manager.initFURender(mContext); manager.drawRongFrame(mContext); } @@ -2549,7 +2556,10 @@ public class LiveRoomViewHolder extends AbsViewHolder implements View.OnClickLis * 切换美颜UI */ public void changeFaceUnityView(){ - faceUnityView.setVisibility(faceUnityView.getVisibility() == View.GONE ? View.VISIBLE : View.GONE); + // faceUnityView.setVisibility(faceUnityView.getVisibility() == View.GONE ? View.VISIBLE : View.GONE); + LiveFaceUnityDialogFragment fragment=new LiveFaceUnityDialogFragment(mContext); + fragment.setManager(manager); + fragment.show(((LiveActivity)mContext).getSupportFragmentManager(),"faceUi"); } private static class LiveRoomHandler extends Handler { diff --git a/live/src/main/res/layout/view_new_live_ready.xml b/live/src/main/res/layout/view_new_live_ready.xml index ac6c6ab8b..0ec5b7b4d 100644 --- a/live/src/main/res/layout/view_new_live_ready.xml +++ b/live/src/main/res/layout/view_new_live_ready.xml @@ -249,5 +249,18 @@ app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" /> - + + + \ No newline at end of file