Files
pdlivexp/FaceUnity/src/main/java/com/yunbao/faceunity/ui/FaceUnityView.java
2022-09-21 18:31:07 +08:00

387 lines
16 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package com.yunbao.faceunity.ui;
import android.content.Context;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import androidx.annotation.Nullable;
import androidx.recyclerview.widget.GridLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import com.google.android.material.tabs.TabLayout;
import com.yunbao.common.utils.WordUtil;
import com.yunbao.faceunity.R;
import com.yunbao.faceunity.adapters.ContainerRecyclerAdapter;
import com.yunbao.faceunity.adapters.MenuGroupRecyclerAdapter;
import com.yunbao.faceunity.data.FaceParam;
import com.yunbao.faceunity.data.FaceUnityDataFactory;
import com.yunbao.faceunity.entity.BaseBean;
import com.yunbao.faceunity.data.FineStickerDataFactory;
import com.yunbao.faceunity.entity.FunctionEnum;
import com.yunbao.faceunity.entity.MakeupCustomClassBean;
import com.yunbao.faceunity.entity.MenuGroupBean;
import com.yunbao.faceunity.entity.net.FineStickerEntity;
import com.yunbao.faceunity.entity.net.FineStickerTagEntity;
import com.yunbao.faceunity.repo.AnimojiSource;
import com.yunbao.faceunity.repo.BodyBeautySource;
import com.yunbao.faceunity.repo.FaceBeautySource;
import com.yunbao.faceunity.repo.MakeupSource;
import com.yunbao.faceunity.repo.PropSource;
import com.yunbao.faceunity.seekbar.DiscreteSeekBar;
import com.yunbao.faceunity.utils.net.StickerDownloadHelper;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
/**
* DESC
* Created on 2021/4/26
*/
public class FaceUnityView extends LinearLayout implements StickerDownloadHelper.Callback {
private Context mContext;
private RecyclerView menuGroup;
private RecyclerView containerRecycler;
private ContainerRecyclerAdapter containerAdapter;
private TabLayout tabLayout;
private TextView title;
private LinearLayout menu2, menuDiy, reset, menu2Reset;
private ImageView menu2Back, back, close;
private DiscreteSeekBar seekBar;
public FaceUnityView(Context context) {
super(context);
mContext = context;
init();
}
public FaceUnityView(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
mContext = context;
init();
}
public FaceUnityView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
mContext = context;
init();
}
private void init() {
LayoutInflater.from(mContext).inflate(R.layout.layout_faceunity, this);
initView();
bindBottomView();
FineStickerDataFactory.getInstance().addCallback(this);
}
/**
* 绑定数据工厂
*
* @param dataFactory FaceUnityDataFactory
*/
public void bindDataFactory(FaceUnityDataFactory dataFactory) {
}
/**
* 初始化View
*/
private void initView() {
menuGroup = findViewById(R.id.menu_group);
containerRecycler = findViewById(R.id.menu2_container_view);
tabLayout = findViewById(R.id.menu2_tab);
title = findViewById(R.id.menu_title);
menu2 = findViewById(R.id.layout_faceunity_menu2);
back = findViewById(R.id.menu_back);
menu2Back = findViewById(R.id.menu2_back);
close = findViewById(R.id.menu_close);
reset = findViewById(R.id.menu_reset);
menu2Reset = findViewById(R.id.menu2_reset);
menuDiy = findViewById(R.id.menu_diy);
seekBar = findViewById(R.id.item_seekBar);
initMenuGroup();
setContainerRecycler(new ArrayList<>());
initViewClick();
}
private void initViewClick() {
menu2Back.setOnClickListener(v -> goBackMainMenu());
menuDiy.setOnClickListener(v -> {
changeRecyclerItemCount(5);
ArrayList<MakeupCustomClassBean> list = MakeupSource.buildCustomClasses();
setTab(createTabs(list));
});
}
private void goBackMainMenu() {
setContainerRecycler(new ArrayList<>());
title.setText("美顏特效選擇");
title.setVisibility(VISIBLE);
menu2.setVisibility(GONE);
menuGroup.setVisibility(VISIBLE);
}
/**
* 底部功能菜单切换
*/
private void bindBottomView() {
}
/**
* UI菜单显示控制
*
* @param index Int
*/
private void showFunction(int index) {
}
private void initMenuGroup() {
MenuGroupRecyclerAdapter adapter = new MenuGroupRecyclerAdapter(mContext);
menuGroup.setLayoutManager(new GridLayoutManager(mContext, 4));
List<MenuGroupBean> layoutItem = new ArrayList<>();
layoutItem.add(new MenuGroupBean(R.string.home_function_name_beauty, R.mipmap.ico_home_beauty));
layoutItem.add(new MenuGroupBean(R.string.home_function_name_makeup, R.mipmap.ico_home_makeup));
layoutItem.add(new MenuGroupBean(R.string.home_function_name_beauty_body, R.mipmap.ico_home_beauty_body));
layoutItem.add(new MenuGroupBean(R.string.home_function_name_big_head, R.mipmap.ico_home_big_head));
layoutItem.add(new MenuGroupBean(R.string.home_function_name_animoji, R.mipmap.ico_home_animoji));
layoutItem.add(new MenuGroupBean(R.string.home_function_name_sticker, R.mipmap.ico_home_sticker));
layoutItem.add(new MenuGroupBean(R.string.home_function_name_fine_sticker, R.mipmap.ico_home_fine_sticker));
adapter.setList(layoutItem);
adapter.setOnItemClickListener(position -> {
LinkedHashMap<Integer, Integer> map = new LinkedHashMap<>();
title.setVisibility(GONE);
switch (position) {
case 0:
map.put(R.string.beauty_radio_skin_beauty, FaceParam.FACE_BEAUTY_SKIN);
map.put(R.string.beauty_radio_face_shape, FaceParam.FACE_BEAUTY_SHAPE);
map.put(R.string.beauty_radio_filter, FaceParam.FACE_BEAUTY_FILTER);
map.put(R.string.beauty_radio_style, FaceParam.FACE_BEAUTY_STYLE);
setContainerRecycler(FaceBeautySource.buildSkinParams());
break;
case 1:
title.setText(R.string.home_function_name_makeup);
title.setVisibility(VISIBLE);
menuDiy.setVisibility(VISIBLE);
changeRecyclerItemCount(5);
setContainerRecycler(MakeupSource.buildCombinations());
break;
case 2:
title.setText(R.string.home_function_name_beauty_body);
title.setVisibility(VISIBLE);
changeRecyclerItemCount(2);
setContainerRecycler(BodyBeautySource.buildBodyBeauty());
break;
case 3:
changeRecyclerItemCount(5);
setContainerRecycler(PropSource.buildPropBeans(FunctionEnum.BIG_HEAD));
break;
case 4:
changeRecyclerItemCount(5);
map.put(R.string.animoji_filter, FaceParam.FACE_ANIMOJI);
map.put(R.string.cartoon_filter, FaceParam.FACE_ANIM);
setContainerRecycler(AnimojiSource.buildAnimojis());
break;
case 5:
changeRecyclerItemCount(5);
setContainerRecycler(PropSource.buildPropBeans(FunctionEnum.STICKER));
break;
case 6:
List<FineStickerTagEntity> tagList = FineStickerDataFactory.getInstance().loadTagList();
if (!tagList.isEmpty()) {
setTab(createTabs(tagList));
}
break;
}
setTab(createTabs(map));
menuGroup.setVisibility(GONE);
menu2.setVisibility(VISIBLE);
});
menuGroup.setAdapter(adapter);
}
private List<TabLayout.Tab> createTabs(Map<Integer, Integer> map) {
List<TabLayout.Tab> list = new ArrayList<>();
for (Integer key : map.keySet()) {
TabLayout.Tab tab = tabLayout.newTab().setText(key);
tab.setTag(map.get(key));
list.add(tab);
}
return list;
}
private List<TabLayout.Tab> createTabs(List<FineStickerTagEntity> tags) {
List<TabLayout.Tab> list = new ArrayList<>();
for (FineStickerTagEntity tag : tags) {
TabLayout.Tab tab;
if (WordUtil.isZh()) {
tab = tabLayout.newTab().setText(tag.getTag().split("/")[0]);
} else {
tab = tabLayout.newTab().setText(tag.getTag().split("/")[1]);
}
tab.setTag(tag);
list.add(tab);
}
return list;
}
private List<TabLayout.Tab> createTabs(ArrayList<MakeupCustomClassBean> tags) {
List<TabLayout.Tab> list = new ArrayList<>();
for (MakeupCustomClassBean tag : tags) {
TabLayout.Tab tab;
tab = tabLayout.newTab().setText(tag.getDesRes());
tab.setTag(tag.getBeanType());
list.add(tab);
}
return list;
}
private void setTab(List<TabLayout.Tab> tabs) {
tabLayout.removeAllTabs();
for (TabLayout.Tab tab : tabs) {
tabLayout.addTab(tab);
}
tabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
@Override
public void onTabSelected(TabLayout.Tab tab) {
Object tabTag = tab.getTag();
if (tabTag instanceof Integer) {
switch ((int) tab.getTag()) {
case FaceParam.FACE_BEAUTY_SKIN:
changeRecyclerItemCount(2);
setContainerRecycler(FaceBeautySource.buildSkinParams());
break;
case FaceParam.FACE_BEAUTY_SHAPE:
changeRecyclerItemCount(2);
setContainerRecycler(FaceBeautySource.buildShapeParams());
break;
case FaceParam.FACE_BEAUTY_FILTER:
changeRecyclerItemCount(5);
setContainerRecycler(FaceBeautySource.buildFilters());
break;
case FaceParam.FACE_BEAUTY_STYLE:
changeRecyclerItemCount(5);
setContainerRecycler(FaceBeautySource.buildStylesParams());
break;
case FaceParam.FACE_ANIMOJI:
changeRecyclerItemCount(5);
setContainerRecycler(AnimojiSource.buildAnimojis());
break;
case FaceParam.FACE_ANIM:
changeRecyclerItemCount(5);
setContainerRecycler(AnimojiSource.buildFilters());
break;
case FaceParam.FACE_MAKEUP_TYPE_FOUNDATION:
changeRecyclerItemCount(5);
setContainerRecycler(MakeupSource.buildCustomItemParams().get(MakeupSource.FACE_MAKEUP_TYPE_FOUNDATION));
break;
case FaceParam.FACE_MAKEUP_TYPE_LIP_STICK:
changeRecyclerItemCount(5);
setContainerRecycler(MakeupSource.buildCustomItemParams().get(MakeupSource.FACE_MAKEUP_TYPE_LIP_STICK));
break;
case FaceParam.FACE_MAKEUP_TYPE_BLUSHER:
changeRecyclerItemCount(5);
setContainerRecycler(MakeupSource.buildCustomItemParams().get(MakeupSource.FACE_MAKEUP_TYPE_BLUSHER));
break;
case FaceParam.FACE_MAKEUP_TYPE_EYE_BROW:
changeRecyclerItemCount(5);
setContainerRecycler(MakeupSource.buildCustomItemParams().get(MakeupSource.FACE_MAKEUP_TYPE_EYE_BROW));
break;
case FaceParam.FACE_MAKEUP_TYPE_EYE_SHADOW:
changeRecyclerItemCount(5);
setContainerRecycler(MakeupSource.buildCustomItemParams().get(MakeupSource.FACE_MAKEUP_TYPE_EYE_SHADOW));
break;
case FaceParam.FACE_MAKEUP_TYPE_EYE_LINER:
changeRecyclerItemCount(5);
setContainerRecycler(MakeupSource.buildCustomItemParams().get(MakeupSource.FACE_MAKEUP_TYPE_EYE_LINER));
break;
case FaceParam.FACE_MAKEUP_TYPE_EYE_LASH:
changeRecyclerItemCount(5);
setContainerRecycler(MakeupSource.buildCustomItemParams().get(MakeupSource.FACE_MAKEUP_TYPE_EYE_LASH));
break;
case FaceParam.FACE_MAKEUP_TYPE_HIGH_LIGHT:
changeRecyclerItemCount(5);
setContainerRecycler(MakeupSource.buildCustomItemParams().get(MakeupSource.FACE_MAKEUP_TYPE_HIGH_LIGHT));
break;
case FaceParam.FACE_MAKEUP_TYPE_SHADOW:
changeRecyclerItemCount(5);
setContainerRecycler(MakeupSource.buildCustomItemParams().get(MakeupSource.FACE_MAKEUP_TYPE_SHADOW));
break;
case FaceParam.FACE_MAKEUP_TYPE_EYE_PUPIL:
changeRecyclerItemCount(5);
setContainerRecycler(MakeupSource.buildCustomItemParams().get(MakeupSource.FACE_MAKEUP_TYPE_EYE_PUPIL));
break;
default:
setContainerRecycler(new ArrayList<>());
}
} else if (tabTag instanceof FineStickerTagEntity) {
FineStickerTagEntity tag = (FineStickerTagEntity) tabTag;
FineStickerEntity sticker = FineStickerDataFactory.getInstance().loadStickerList(tag);
ArrayList<FineStickerEntity.DocsBean> list = new ArrayList<>();
FineStickerEntity.DocsBean docsBean = new FineStickerEntity.DocsBean();
docsBean.set_id("-1");
list.add(docsBean);
list.addAll(sticker.getDocs());
changeRecyclerItemCount(5);
setContainerRecycler(list);
}
}
@Override
public void onTabUnselected(TabLayout.Tab tab) {
}
@Override
public void onTabReselected(TabLayout.Tab tab) {
}
});
}
private void changeRecyclerItemCount(int count) {
containerRecycler.setLayoutManager(new GridLayoutManager(mContext, count));
}
private void setContainerRecycler(ArrayList<? extends BaseBean> list) {
if (containerAdapter == null) {
containerAdapter = new ContainerRecyclerAdapter(mContext);
containerAdapter.setSeekBar(seekBar);
containerRecycler.setLayoutManager(new GridLayoutManager(mContext, 2));
containerRecycler.setAdapter(containerAdapter);
}
containerAdapter.setList(list);
containerAdapter.notifyDataSetChanged();
}
@Override
public void onGetTags(String[] tags) {
List<FineStickerTagEntity> list = FineStickerDataFactory.formatTag(tags);
setTab(createTabs(list));
}
@Override
public void onGetList(String tag, FineStickerEntity fineSticker) {
}
@Override
public void onDownload(FineStickerEntity.DocsBean entity) {
}
@Override
public void onDownloadError(FineStickerEntity.DocsBean entity, String msg) {
}
}