This commit is contained in:
zlzw 2022-09-22 13:02:53 +08:00
parent 80c5609bb7
commit d2bb4e4375
19 changed files with 176 additions and 75 deletions

View File

@ -2,35 +2,24 @@ package com.yunbao.faceunity;
import static android.content.Context.SENSOR_SERVICE; import static android.content.Context.SENSOR_SERVICE;
import static com.lzy.okgo.utils.HttpUtils.runOnUiThread;
import android.content.Context; import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.hardware.Camera; import android.hardware.Camera;
import android.hardware.Sensor; import android.hardware.Sensor;
import android.hardware.SensorEvent; import android.hardware.SensorEvent;
import android.hardware.SensorEventListener; import android.hardware.SensorEventListener;
import android.hardware.SensorManager; import android.hardware.SensorManager;
import android.opengl.GLSurfaceView;
import android.os.Environment; import android.os.Environment;
import android.util.Log; import android.util.Log;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import com.faceunity.core.callback.OperateCallback; 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.entity.FURenderOutputData;
import com.faceunity.core.enumeration.CameraFacingEnum; import com.faceunity.core.enumeration.CameraFacingEnum;
import com.faceunity.core.enumeration.FUAIProcessorEnum; import com.faceunity.core.enumeration.FUAIProcessorEnum;
import com.faceunity.core.enumeration.FUInputTextureEnum; import com.faceunity.core.enumeration.FUInputTextureEnum;
import com.faceunity.core.enumeration.FUTransformMatrixEnum; import com.faceunity.core.enumeration.FUTransformMatrixEnum;
import com.faceunity.core.faceunity.FURenderKit;
import com.faceunity.core.faceunity.FURenderManager; 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.CameraUtils;
import com.faceunity.core.utils.FULogger; import com.faceunity.core.utils.FULogger;
import com.yunbao.faceunity.data.FaceUnityDataFactory; 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.Authpack;
import com.yunbao.faceunity.utils.CSVUtils; import com.yunbao.faceunity.utils.CSVUtils;
import com.yunbao.faceunity.utils.FURenderer; import com.yunbao.faceunity.utils.FURenderer;
import com.yunbao.faceunity.utils.FaceCameraConfig;
import com.yunbao.faceunity.utils.FaceUnityData; import com.yunbao.faceunity.utils.FaceUnityData;
import com.yunbao.faceunity.utils.net.OkHttpUtils; import com.yunbao.faceunity.utils.net.OkHttpUtils;
import java.io.File; import java.io.File;
import java.io.FileOutputStream;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Date; import java.util.Date;
import java.util.Locale; import java.util.Locale;
import cn.rongcloud.rtc.api.RCRTCEngine; import cn.rongcloud.rtc.api.RCRTCEngine;
import cn.rongcloud.rtc.api.callback.IRCRTCVideoOutputFrameListener; import cn.rongcloud.rtc.api.callback.IRCRTCVideoOutputFrameListener;
import cn.rongcloud.rtc.api.stream.RCRTCVideoView;
import cn.rongcloud.rtc.base.RCRTCVideoFrame; 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 boolean isInit = false;
private static final String TAG = FaceManager.class.getSimpleName(); private static final String TAG = FaceManager.class.getSimpleName();
private FaceUnityDataFactory mFaceUnityDataFactory; private FaceUnityDataFactory mFaceUnityDataFactory;
private FaceManager.FaceStatusChanged faceStatusChanged;
/** /**
* 初始化美颜模块在AppContext中调用 * 初始化美颜模块在AppContext中调用
@ -72,7 +56,7 @@ public class FaceManager implements SensorEventListener {
if (isInit) { if (isInit) {
return; return;
} }
FaceUnityData.mApplication=context; FaceUnityData.mApplication = context;
OkHttpUtils.getInstance().init(context, false); OkHttpUtils.getInstance().init(context, false);
FURenderManager.setCoreDebug(FULogger.LogLevel.OFF); FURenderManager.setCoreDebug(FULogger.LogLevel.OFF);
FURenderManager.setKitDebug(FULogger.LogLevel.OFF); FURenderManager.setKitDebug(FULogger.LogLevel.OFF);
@ -91,6 +75,7 @@ public class FaceManager implements SensorEventListener {
} }
private FURenderer mFURenderer; private FURenderer mFURenderer;
private FaceUnityView faceUnityView;
/** /**
* 配置美颜SDK * 配置美颜SDK
@ -115,8 +100,13 @@ public class FaceManager implements SensorEventListener {
/** /**
* 绑定控制view * 绑定控制view
*/ */
public void bindControlView(FaceUnityView view){ public void bindControlView(FaceUnityView view) {
view.bindDataFactory(mFaceUnityDataFactory); this.faceUnityView = view;
faceUnityView.bindDataFactory(mFaceUnityDataFactory);
}
public void setFaceStatusChanged(FaceStatusChanged faceStatusChanged) {
this.faceStatusChanged = faceStatusChanged;
} }
private boolean mIsFirstFrame = true; private boolean mIsFirstFrame = true;
@ -193,12 +183,16 @@ public class FaceManager implements SensorEventListener {
@Override @Override
public void onTrackStatusChanged(FUAIProcessorEnum type, int status) { public void onTrackStatusChanged(FUAIProcessorEnum type, int status) {
Log.e(TAG, "onTrackStatusChanged: 人脸数: " + status); Log.e(TAG, "onTrackStatusChanged: 人脸数: " + status);
if (faceStatusChanged != null) {
faceStatusChanged.onFaceChanged(status);
}
} }
@Override @Override
public void onFpsChanged(double fps, double callTime) { public void onFpsChanged(double fps, double callTime) {
final String FPS = String.format(Locale.getDefault(), "%.2f", fps); 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 @Override
@ -218,10 +212,15 @@ public class FaceManager implements SensorEventListener {
} }
/** /**
* 离开渲染界面时注销融云监听器不然会绿屏 * 离开渲染界面时注销融云监听器不然会绿屏
*/ */
public void onClose() { public void onClose() {
RCRTCEngine.getInstance().getDefaultVideoStream().setVideoFrameListener(null); RCRTCEngine.getInstance().getDefaultVideoStream().setVideoFrameListener(null);
} }
public interface FaceStatusChanged {
void onFaceChanged(int num);
}
} }

View File

@ -4,6 +4,7 @@ import android.content.Context;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.widget.TextView;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView; import androidx.recyclerview.widget.RecyclerView;
@ -71,16 +72,17 @@ public class ContainerRecyclerAdapter extends RecyclerView.Adapter<BaseViewHolde
} }
seekBar.setVisibility(View.VISIBLE); seekBar.setVisibility(View.VISIBLE);
if (seekY == 0) { if (seekY == 0) {
seekY = seekBar.getY(); seekY = seekBar.getY() - DpUtil.dp2px(20);
seekBar.setY(seekY - DpUtil.dp2px(20));
} }
seekBar.setY(seekY);
} }
public void hideSeekBar(){
if(seekBar.getVisibility()==View.INVISIBLE){ public void hideSeekBar() {
if (seekBar.getVisibility() == View.GONE) {
return; return;
} }
seekBar.setOnProgressChangeListener(null); seekBar.setOnProgressChangeListener(null);
seekBar.setVisibility(View.INVISIBLE); seekBar.setVisibility(View.GONE);
} }
@ -105,6 +107,7 @@ public class ContainerRecyclerAdapter extends RecyclerView.Adapter<BaseViewHolde
animojiDataFactory = new AnimojiDataFactory(0, 0); animojiDataFactory = new AnimojiDataFactory(0, 0);
makeupDataFactory = new MakeupDataFactory(0); makeupDataFactory = new MakeupDataFactory(0);
bodyBeautyDataFactory = new BodyBeautyDataFactory(); bodyBeautyDataFactory = new BodyBeautyDataFactory();
bodyBeautyDataFactory.bindCurrentRenderer();
} }
public void setList(ArrayList<? extends BaseBean> list) { public void setList(ArrayList<? extends BaseBean> list) {
@ -221,17 +224,21 @@ public class ContainerRecyclerAdapter extends RecyclerView.Adapter<BaseViewHolde
} }
public void save(String key, String data) { public void save(String key, String data) {
FaceSPUtils.getInstance().saveString(key,data); FaceSPUtils.getInstance().saveString(key, data);
} }
public String getString(String key){
public String getString(String key) {
return FaceSPUtils.getInstance().getString(key); return FaceSPUtils.getInstance().getString(key);
} }
public void del(String key){
public void del(String key) {
FaceSPUtils.getInstance().del(key); FaceSPUtils.getInstance().del(key);
} }
public void reset(){
if(vh!=null){ public void reset() {
vh.reset(list); if (vh != null) {
} vh.reset(list);
}
} }
} }

View File

@ -23,7 +23,7 @@ public class AnimojiViewHolder extends BaseViewHolder {
icon = itemView.findViewById(R.id.iv_control); icon = itemView.findViewById(R.id.iv_control);
itemView.setOnClickListener(v -> { itemView.setOnClickListener(v -> {
adapter.getAnimojiDataFactory().onAnimojiSelected((AnimojiBean) itemView.getTag()); adapter.getAnimojiDataFactory().onAnimojiSelected((AnimojiBean) itemView.getTag());
setSelectPosition(getAdapterPosition()); setSelectPosition(getLayoutPosition());
saveData(); saveData();
}); });
} }
@ -44,21 +44,26 @@ public class AnimojiViewHolder extends BaseViewHolder {
@Override @Override
public boolean loadData() { public boolean loadData() {
String data = adapter.getString(getName(this)); String data = adapter.getString(getName(this));
if (data != null) { if (data == null) {
icon.setSelected(getAdapterPosition() == Integer.parseInt(data)); return false;
return true;
} }
if (!data.equals(String.valueOf(getLayoutPosition()))) {
return false;
}
icon.setSelected(true);
adapter.getAnimojiDataFactory().onAnimojiSelected((AnimojiBean) itemView.getTag());
return false; return false;
} }
@Override @Override
public void saveData() { public void saveData() {
adapter.save(getName(this), String.valueOf(getAdapterPosition())); adapter.save(getName(this), String.valueOf(getLayoutPosition()));
} }
@Override @Override
public void reset(List<? extends BaseBean> list) { public void reset(List<? extends BaseBean> list) {
adapter.del(getName(this)); adapter.del(getName(this));
adapter.getAnimojiDataFactory().onAnimojiSelected((AnimojiBean) list.get(0));
adapter.setSelectPosition(0); adapter.setSelectPosition(0);
} }

View File

@ -69,7 +69,8 @@ public class BigHeadViewHolder extends BaseViewHolder {
@Override @Override
public void reset(List<? extends BaseBean> list) { public void reset(List<? extends BaseBean> list) {
adapter.del(getName(this)); adapter.del(getName(this));
itemView.callOnClick(); adapter.getPropDataFactory().setPropType(FunctionEnum.BIG_HEAD);
adapter.getPropDataFactory().onItemSelected((PropBean) list.get(0));
adapter.setSelectPosition(0); adapter.setSelectPosition(0);
} }
} }

View File

@ -15,6 +15,9 @@ import com.yunbao.faceunity.seekbar.DiscreteSeekBar;
import java.util.List; import java.util.List;
/**
* 美妆 - 自定义
*/
public class MakeupCustomItemViewHolder extends BaseViewHolder { public class MakeupCustomItemViewHolder extends BaseViewHolder {
private ImageView icon; private ImageView icon;
private TextView title; private TextView title;

View File

@ -9,6 +9,7 @@ import androidx.annotation.NonNull;
import com.yunbao.faceunity.R; import com.yunbao.faceunity.R;
import com.yunbao.faceunity.entity.BaseBean; import com.yunbao.faceunity.entity.BaseBean;
import com.yunbao.faceunity.entity.MakeupCombinationBean; import com.yunbao.faceunity.entity.MakeupCombinationBean;
import com.yunbao.faceunity.utils.FaceSPUtils;
import java.util.List; import java.util.List;
@ -72,6 +73,10 @@ public class MakeupViewHolder extends BaseViewHolder {
@Override @Override
public void reset(List<? extends BaseBean>list) { public void reset(List<? extends BaseBean>list) {
adapter.del(getName(this));
FaceSPUtils.getInstance().delStart("MakeupCustomItemViewHolder");
adapter.getMakeupDataFactory().onMakeupCombinationSelected((MakeupCombinationBean) list.get(0));
adapter.getMakeupDataFactory().clearAll();
adapter.setSelectPosition(0);
} }
} }

View File

@ -68,7 +68,8 @@ public class StickerViewHolder extends BaseViewHolder{
@Override @Override
public void reset(List<? extends BaseBean> list) { public void reset(List<? extends BaseBean> list) {
adapter.del(getName(this)); adapter.del(getName(this));
itemView.callOnClick(); adapter.getPropDataFactory().setPropType(FunctionEnum.STICKER);
adapter.getPropDataFactory().onItemSelected((PropBean) list.get(0));
adapter.setSelectPosition(0); adapter.setSelectPosition(0);
} }
} }

View File

@ -2,6 +2,8 @@ package com.yunbao.faceunity.data;
import com.faceunity.core.controller.bodyBeauty.BodyBeautyParam; import com.faceunity.core.controller.bodyBeauty.BodyBeautyParam;
import com.faceunity.core.entity.FUBundleData; 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.faceunity.FURenderKit;
import com.faceunity.core.model.bodyBeauty.BodyBeauty; 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.entity.ModelAttributeData;
import com.yunbao.faceunity.infe.AbstractBodyBeautyDataFactory; import com.yunbao.faceunity.infe.AbstractBodyBeautyDataFactory;
import com.yunbao.faceunity.repo.BodyBeautySource; import com.yunbao.faceunity.repo.BodyBeautySource;
import com.yunbao.faceunity.utils.FaceUnityConfig;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashMap; 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 final BodyBeauty bodyBeauty;
public BodyBeautyDataFactory() { 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; return bodyBeauty;
} }
/**
* 美体开关设置
*
* @param enable
*/
@Override
public void enableBodyBeauty(boolean enable) {
if (mFURenderKit.getBodyBeauty() != null) {
mFURenderKit.getBodyBeauty().setEnable(enable);
}
}
/*模型映射设置模型值*/ /*模型映射设置模型值*/
private final HashMap<String, BodyBeautySetParamInterface> bodyBeautySetMapping = new HashMap<String, BodyBeautySetParamInterface>() { private final HashMap<String, BodyBeautySetParamInterface> bodyBeautySetMapping = new HashMap<String, BodyBeautySetParamInterface>() {
{ {
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.LEG_STRETCH_INTENSITY, value -> getCurrentBodyBeautyModel().setLegStretchIntensity(value));
put(BodyBeautyParam.WAIST_SLIM_INTENSITY, value -> getCurrentBodyBeautyModel().setWaistSlimIntensity(value)); put(BodyBeautyParam.WAIST_SLIM_INTENSITY, value -> getCurrentBodyBeautyModel().setWaistSlimIntensity(value));
put(BodyBeautyParam.SHOULDER_SLIM_INTENSITY, value -> getCurrentBodyBeautyModel().setShoulderSlimIntensity(value)); put(BodyBeautyParam.SHOULDER_SLIM_INTENSITY, value -> getCurrentBodyBeautyModel().setShoulderSlimIntensity(value));
@ -127,13 +127,13 @@ public class BodyBeautyDataFactory extends AbstractBodyBeautyDataFactory {
/*模型映射获取模型值*/ /*模型映射获取模型值*/
HashMap<String, BodyBeautyGetParamInterface> bodyBeautyGetMapping = new HashMap<String, BodyBeautyGetParamInterface>() { HashMap<String, BodyBeautyGetParamInterface> bodyBeautyGetMapping = new HashMap<String, BodyBeautyGetParamInterface>() {
{ {
put(BodyBeautyParam.BODY_SLIM_INTENSITY, () -> getCurrentBodyBeautyModel().getBodySlimIntensity()); put(BodyBeautyParam.BODY_SLIM_INTENSITY, ()->getCurrentBodyBeautyModel().getBodySlimIntensity());
put(BodyBeautyParam.LEG_STRETCH_INTENSITY, () -> getCurrentBodyBeautyModel().getLegStretchIntensity()); put(BodyBeautyParam.LEG_STRETCH_INTENSITY, ()->getCurrentBodyBeautyModel().getLegStretchIntensity());
put(BodyBeautyParam.WAIST_SLIM_INTENSITY, () -> getCurrentBodyBeautyModel().getWaistSlimIntensity()); put(BodyBeautyParam.WAIST_SLIM_INTENSITY, ()->getCurrentBodyBeautyModel().getWaistSlimIntensity());
put(BodyBeautyParam.SHOULDER_SLIM_INTENSITY, () -> getCurrentBodyBeautyModel().getShoulderSlimIntensity()); put(BodyBeautyParam.SHOULDER_SLIM_INTENSITY, ()->getCurrentBodyBeautyModel().getShoulderSlimIntensity());
put(BodyBeautyParam.HIP_SLIM_INTENSITY, () -> getCurrentBodyBeautyModel().getHipSlimIntensity()); put(BodyBeautyParam.HIP_SLIM_INTENSITY, ()->getCurrentBodyBeautyModel().getHipSlimIntensity());
put(BodyBeautyParam.HEAD_SLIM_INTENSITY, () -> getCurrentBodyBeautyModel().getHeadSlimIntensity()); put(BodyBeautyParam.HEAD_SLIM_INTENSITY, ()->getCurrentBodyBeautyModel().getHeadSlimIntensity());
put(BodyBeautyParam.LEG_SLIM_INTENSITY, () -> getCurrentBodyBeautyModel().getLegSlimIntensity()); put(BodyBeautyParam.LEG_SLIM_INTENSITY, ()->getCurrentBodyBeautyModel().getLegSlimIntensity());
} }
}; };
@ -143,8 +143,18 @@ public class BodyBeautyDataFactory extends AbstractBodyBeautyDataFactory {
* FURenderKit加载当前特效 * FURenderKit加载当前特效
*/ */
public void bindCurrentRenderer() { public void bindCurrentRenderer() {
mFUAIKit.loadAIProcessor(FaceUnityConfig.getAIHumanBundle(), FUAITypeEnum.FUAITYPE_HUMAN_PROCESSOR);
mFUAIKit.setMaxFaces(1);
mFURenderKit.setFaceBeauty(FaceBeautyDataFactory.faceBeauty);
mFURenderKit.setBodyBeauty(bodyBeauty); mFURenderKit.setBodyBeauty(bodyBeauty);
} }
/**
* 结束需要释放AI驱动
*/
public void releaseAIProcessor() {
mFUAIKit.releaseAIProcessor(FUAITypeEnum.FUAITYPE_HUMAN_PROCESSOR);
}
} }

View File

@ -846,4 +846,8 @@ public class MakeupDataFactory extends AbstractMakeupDataFactory {
mFURenderKit.getPropContainer().addProp(expressionRecognition); mFURenderKit.getPropContainer().addProp(expressionRecognition);
} }
} }
public void clearAll(){
currentMakeup = new Makeup(new FUBundleData(FaceUnityConfig.BUNDLE_FACE_MAKEUP));
mFURenderKit.setMakeup(currentMakeup);
}
} }

View File

@ -3,6 +3,7 @@ package com.yunbao.faceunity.ui;
import android.content.Context; import android.content.Context;
import android.util.AttributeSet; import android.util.AttributeSet;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.View;
import android.widget.ImageView; import android.widget.ImageView;
import android.widget.LinearLayout; import android.widget.LinearLayout;
import android.widget.TextView; import android.widget.TextView;
@ -111,9 +112,24 @@ public class FaceUnityView extends LinearLayout implements StickerDownloadHelper
} }
private void initViewClick() { 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 -> { menuDiy.setOnClickListener(v -> {
menu2Back.setTag("makeup");
changeRecyclerItemCount(5); changeRecyclerItemCount(5);
menuDiy.setVisibility(GONE);
ArrayList<MakeupCustomClassBean> list = MakeupSource.buildCustomClasses(); ArrayList<MakeupCustomClassBean> list = MakeupSource.buildCustomClasses();
setTab(createTabs(list)); setTab(createTabs(list));
}); });
@ -128,6 +144,7 @@ public class FaceUnityView extends LinearLayout implements StickerDownloadHelper
title.setVisibility(VISIBLE); title.setVisibility(VISIBLE);
menu2.setVisibility(GONE); menu2.setVisibility(GONE);
menuGroup.setVisibility(VISIBLE); menuGroup.setVisibility(VISIBLE);
menuDiy.setVisibility(GONE);
} }

View File

@ -30,4 +30,12 @@ public class FaceSPUtils {
public void del(String key) { public void del(String key) {
mSharedPreferences.edit().remove(key).apply(); 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();
}
}
}
} }

View File

@ -13,8 +13,8 @@
android:layout_gravity="center_horizontal" android:layout_gravity="center_horizontal"
android:layout_marginTop="@dimen/x24" android:layout_marginTop="@dimen/x24"
android:layout_marginBottom="@dimen/x15" android:layout_marginBottom="@dimen/x15"
android:paddingTop="20dp"
android:visibility="gone" android:visibility="gone"
android:paddingTop="10dp"
app:dsb_indicatorColor="#CDCDCD" app:dsb_indicatorColor="#CDCDCD"
app:dsb_indicatorElevation="0dp" app:dsb_indicatorElevation="0dp"
app:dsb_indicatorPopupEnabled="true" app:dsb_indicatorPopupEnabled="true"
@ -171,6 +171,8 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginStart="10dp" android:layout_marginStart="10dp"
android:layout_weight="0" android:layout_weight="0"
android:paddingStart="10dp"
android:paddingEnd="10dp"
app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" app:layout_constraintTop_toTopOf="parent"
@ -186,8 +188,10 @@
<com.google.android.material.tabs.TabLayout <com.google.android.material.tabs.TabLayout
android:id="@+id/menu2_tab" android:id="@+id/menu2_tab"
android:layout_width="wrap_content" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
app:tabMaxWidth="100dp"
app:tabMode="scrollable"
app:tabSelectedTextColor="#F6F7FB" app:tabSelectedTextColor="#F6F7FB"
app:tabTextColor="#9A9A9A" /> app:tabTextColor="#9A9A9A" />
</HorizontalScrollView> </HorizontalScrollView>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.8 KiB

After

Width:  |  Height:  |  Size: 4.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.8 KiB

View File

@ -148,13 +148,6 @@ public class LauncherActivity extends AppCompatActivity implements View.OnClickL
} }
}; };
mHandler.sendEmptyMessageDelayed(WHAT_GET_CONFIG, 1000); mHandler.sendEmptyMessageDelayed(WHAT_GET_CONFIG, 1000);
mCover.setOnClickListener(v -> {
FaceManager manager = new FaceManager();
manager.initFURender(mContext);
LiveFaceUnityDialogFragment fragment = new LiveFaceUnityDialogFragment(mContext);
fragment.setManager(manager);
fragment.show(((LauncherActivity) mContext).getSupportFragmentManager(), "FaceUnity");
});
} }

View File

@ -47,6 +47,7 @@ import com.yunbao.live.bean.LiveKsyConfigBean;
import com.yunbao.live.bean.LiveReceiveGiftBean; import com.yunbao.live.bean.LiveReceiveGiftBean;
import com.yunbao.live.bean.WishlistModel; import com.yunbao.live.bean.WishlistModel;
import com.yunbao.live.dialog.LiveBeautyDialogFragment; import com.yunbao.live.dialog.LiveBeautyDialogFragment;
import com.yunbao.live.dialog.LiveFaceUnityDialogFragment;
import com.yunbao.live.dialog.LiveFunctionDialogFragment; import com.yunbao.live.dialog.LiveFunctionDialogFragment;
import com.yunbao.live.dialog.LiveLinkMicListDialogFragment; import com.yunbao.live.dialog.LiveLinkMicListDialogFragment;
import com.yunbao.live.dialog.LiveMicUserDialogFragment; import com.yunbao.live.dialog.LiveMicUserDialogFragment;

View File

@ -6,6 +6,8 @@ import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.graphics.drawable.Drawable; import android.graphics.drawable.Drawable;
import android.os.Bundle; import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.text.TextUtils; import android.text.TextUtils;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
@ -71,6 +73,7 @@ public class LiveNewReadyRyViewHolder extends AbsViewHolder implements View.OnCl
private int mLiveSdk; private int mLiveSdk;
private LiveClassBean classBean; private LiveClassBean classBean;
private FaceManager manager; private FaceManager manager;
private TextView faceTextView;//提示人脸未检测到的TextView
public LiveNewReadyRyViewHolder(Context context, ViewGroup parentView, int liveSdk) { public LiveNewReadyRyViewHolder(Context context, ViewGroup parentView, int liveSdk) {
super(context, parentView, liveSdk); super(context, parentView, liveSdk);
@ -120,6 +123,8 @@ public class LiveNewReadyRyViewHolder extends AbsViewHolder implements View.OnCl
mLiveClass = (TextView) findViewById(R.id.live_class); mLiveClass = (TextView) findViewById(R.id.live_class);
mLiveTypeTextView = (TextView) findViewById(R.id.text_room_type); mLiveTypeTextView = (TextView) findViewById(R.id.text_room_type);
mLiveWishListTextView = (TextView) findViewById(R.id.text_wishlist); mLiveWishListTextView = (TextView) findViewById(R.id.text_wishlist);
faceTextView=(TextView)findViewById(R.id.faceTextView);
mImageUtil = ((LiveActivity) mContext).getProcessImageUtil(); mImageUtil = ((LiveActivity) mContext).getProcessImageUtil();
mImageUtil.setImageResultCallback(new ImageResultCallback() { mImageUtil.setImageResultCallback(new ImageResultCallback() {
@ -188,6 +193,20 @@ public class LiveNewReadyRyViewHolder extends AbsViewHolder implements View.OnCl
} }
}; };
manager = new FaceManager(); 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.initFURender(mContext);
manager.drawRongFrame(mContext); manager.drawRongFrame(mContext);
} }
@ -229,6 +248,7 @@ public class LiveNewReadyRyViewHolder extends AbsViewHolder implements View.OnCl
public void setFaceUnity() { public void setFaceUnity() {
LiveFaceUnityDialogFragment fragment = new LiveFaceUnityDialogFragment(mContext); LiveFaceUnityDialogFragment fragment = new LiveFaceUnityDialogFragment(mContext);
fragment.setManager(manager); fragment.setManager(manager);
if (mContext instanceof LiveRyAnchorActivity) { if (mContext instanceof LiveRyAnchorActivity) {
fragment.show(((LiveRyAnchorActivity) mContext).getSupportFragmentManager(), "FaceUnity"); fragment.show(((LiveRyAnchorActivity) mContext).getSupportFragmentManager(), "FaceUnity");
} }

View File

@ -108,6 +108,7 @@ import com.yunbao.live.bean.WishlistItemModel;
import com.yunbao.live.custom.LiveLightView; import com.yunbao.live.custom.LiveLightView;
import com.yunbao.live.custom.RightGradual; import com.yunbao.live.custom.RightGradual;
import com.yunbao.live.custom.TopGradual; import com.yunbao.live.custom.TopGradual;
import com.yunbao.live.dialog.LiveFaceUnityDialogFragment;
import com.yunbao.live.dialog.LiveFansMedalDialogFragment; import com.yunbao.live.dialog.LiveFansMedalDialogFragment;
import com.yunbao.live.dialog.LiveHDDialogFragment; import com.yunbao.live.dialog.LiveHDDialogFragment;
import com.yunbao.live.dialog.LiveUserDialogFragment; import com.yunbao.live.dialog.LiveUserDialogFragment;
@ -963,7 +964,7 @@ public class LiveRoomViewHolder extends AbsViewHolder implements View.OnClickLis
reloadIM(); reloadIM();
} }
public void hideFloatMsg(){ public void hideFloatMsg(){
msg.setVisibility(View.GONE); msgLayout.setVisibility(View.GONE);
} }
private void showBanner2() { private void showBanner2() {
@ -2541,6 +2542,12 @@ public class LiveRoomViewHolder extends AbsViewHolder implements View.OnClickLis
*/ */
public void startFace() { public void startFace() {
manager=new FaceManager(); manager=new FaceManager();
manager.setFaceStatusChanged(new FaceManager.FaceStatusChanged() {
@Override
public void onFaceChanged(int num) {
}
});
manager.initFURender(mContext); manager.initFURender(mContext);
manager.drawRongFrame(mContext); manager.drawRongFrame(mContext);
} }
@ -2549,7 +2556,10 @@ public class LiveRoomViewHolder extends AbsViewHolder implements View.OnClickLis
* 切换美颜UI * 切换美颜UI
*/ */
public void changeFaceUnityView(){ 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 { private static class LiveRoomHandler extends Handler {

View File

@ -249,5 +249,18 @@
app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" /> app:layout_constraintStart_toStartOf="parent" />
<TextView
android:id="@+id/faceTextView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="#FFFFFF"
android:visibility="gone"
android:textSize="16sp"
android:text="@string/fu_base_is_tracking_text"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>