387 lines
16 KiB
Java
387 lines
16 KiB
Java
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) {
|
||
|
||
}
|
||
}
|