package me.yluo.ruisiapp.widget.emotioninput; import android.content.Context; import android.graphics.Color; import android.util.AttributeSet; import android.util.Log; import android.util.TypedValue; import android.view.Gravity; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.TextView; import androidx.core.content.ContextCompat; import androidx.viewpager.widget.PagerAdapter; import androidx.viewpager.widget.ViewPager; import java.util.ArrayList; import java.util.List; import me.yluo.ruisiapp.R; import me.yluo.ruisiapp.utils.DimenUtils; public class SmileyView extends LinearLayout implements ViewPager.OnPageChangeListener { private ViewPager viewPager; private Context context; private PageAdapter adapter; private int dotImageResourseId; private LinearLayout dotContainer; private LinearLayout tabContainer; private List<SmileyDataSet> smileys; private EmotionInputHandler emotionInputHandler; private int currentTabPosition = -1; private int totalPageSize = 0; private int size8 = 8; private static final int LMP = LayoutParams.MATCH_PARENT; private static final int LWC = LayoutParams.WRAP_CONTENT; private boolean isInitSize = false; private static int ROW_COUNT = 4; private static int COLOUM_COUNT = 7; private int colorTab = Color.WHITE; private int colorTabSize; public SmileyView(Context context) { super(context); init(context); } public SmileyView(Context context, AttributeSet attrs) { super(context, attrs); init(context); } public SmileyView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); init(context); } private void init(Context context) { this.context = context; setElevation(DimenUtils.dip2px(context, 4)); size8 = DimenUtils.dip2px(context, 8); setOrientation(VERTICAL); colorTab = ContextCompat.getColor(context, R.color.bg_primary); colorTabSize = ContextCompat.getColor(context, R.color.bg_secondary); viewPager = new ViewPager(context); viewPager.setLayoutParams(new LayoutParams(LMP, LWC, 1)); viewPager.addOnPageChangeListener(this); dotImageResourseId = R.drawable.dot_bg; addView(viewPager); dotContainer = new LinearLayout(context); dotContainer.setOrientation(LinearLayout.HORIZONTAL); dotContainer.setLayoutParams(new LayoutParams(LMP, DimenUtils.dip2px(context, 16))); dotContainer.setGravity(Gravity.CENTER_HORIZONTAL); addView(dotContainer); tabContainer = new LinearLayout(context); tabContainer.setOrientation(LinearLayout.HORIZONTAL); tabContainer.setGravity(Gravity.CENTER_VERTICAL); tabContainer.setBackgroundColor(ContextCompat.getColor(context, R.color.bg_primary)); tabContainer.setLayoutParams(new LayoutParams(LMP, DimenUtils.dip2px(context, 36))); addView(tabContainer); } @Override protected void onLayout(boolean changed, int l, int t, int r, int b) { super.onLayout(changed, l, t, r, b); if (!isInitSize) { isInitSize = true; int width = DimenUtils.px2dip(context, r - l); int height = DimenUtils.px2dip(context, b - t); if (width / 60 > 0) { COLOUM_COUNT = width / 60; } int col = (height - (36 + 16)) / 50; if (col > 0) { ROW_COUNT = col; } Log.d("SmileyView onLayout", "width: " + width + " height:" + height); adapter = new PageAdapter(); List<SmileyDataSet> smileys = new ArrayList<>(); SmileyDataSet setTieba = SmileyDataSet.getDataSet(context, "贴吧", SmileyDataSet.TYPE_IMAGE, R.array.smiley_tieba); SmileyDataSet setAcn = SmileyDataSet.getDataSet(context, "ac娘", SmileyDataSet.TYPE_IMAGE, R.array.smiley_acn); SmileyDataSet setJgz = SmileyDataSet.getDataSet(context, "金馆长", SmileyDataSet.TYPE_IMAGE, R.array.smiley_jgz); SmileyDataSet setYwz = SmileyDataSet.getDataSet(context, "颜文字", SmileyDataSet.TYPE_TEXT, R.array.smiley_ywz); smileys.add(setTieba); smileys.add(setAcn); smileys.add(setJgz); // TODO: 2016/12/11 睿思不支持emoji //smileys.add(SmileyEmoji.getEmojis()); smileys.add(setYwz); setSmileys(smileys); viewPager.setAdapter(adapter); } } public void setInputView(EmotionInputHandler handler) { emotionInputHandler = handler; } public void setSmileys(List<SmileyDataSet> smileys) { if (smileys == null) { return; } this.smileys = smileys; totalPageSize = getTotalPageSize(); adapter.notifyDataSetChanged(); initTabs(); setDots(0); switchDot(0); } //获得某一类表情的页数 private int getPageSize(int pos) { if (smileys == null) { return 0; } else { int singlePageCount = ROW_COUNT * COLOUM_COUNT; int size = smileys.get(pos).getCount(); int page = size / singlePageCount; if (size % singlePageCount != 0) { page++; } return page; } } //获得中的页数 private int getTotalPageSize() { if (smileys == null) { return 0; } else { int count = 0; for (int i = 0; i < smileys.size(); i++) { count += getPageSize(i); } return count; } } private int getPageCountBefore(int tabpos) { int p = 0; for (int i = 0; i < tabpos; i++) { p += getPageSize(i); } return p; } //页转tab private int pageToTabPos(int pageIndex) { if (pageIndex <= 0) { return 0; } if (pageIndex >= totalPageSize - 1) { return smileys.size() - 1; } int p = 0; for (int i = 0; i < smileys.size(); i++) { p += getPageSize(i); if (pageIndex < p) { return i; } } return smileys.size() - 1; } @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { } @Override public void onPageSelected(int page) { int tabpos = pageToTabPos(page); int dotindex = page - getPageCountBefore(tabpos); switchTab(tabpos); switchDot(dotindex); } private void switchTab(int pos) { if (currentTabPosition == -1 || pos != currentTabPosition) { if (currentTabPosition == -1) { currentTabPosition = 0; } tabContainer.getChildAt(currentTabPosition).setBackgroundColor(colorTab); currentTabPosition = pos; tabContainer.getChildAt(currentTabPosition).setBackgroundColor(colorTabSize); setDots(currentTabPosition); } } private void switchDot(int index) { for (int i = 0; i < dotContainer.getChildCount(); i++) { if (i == index) { dotContainer.getChildAt(i).setEnabled(true); dotContainer.getChildAt(i).setScaleX(1.2f); dotContainer.getChildAt(i).setScaleY(1.2f); } else { dotContainer.getChildAt(i).setEnabled(false); dotContainer.getChildAt(i).setScaleX(1.0f); dotContainer.getChildAt(i).setScaleY(1.0f); } } } public void initTabs() { LayoutParams params = new LayoutParams(LWC, LMP); for (int i = 0; i < smileys.size(); i++) { View itemView; SmileyDataSet set = smileys.get(i); itemView = new TextView(context); ((TextView) itemView).setText(set.name); ((TextView) itemView).setTextSize(TypedValue.COMPLEX_UNIT_SP, 14); ((TextView) itemView).setGravity(Gravity.CENTER); itemView.setPadding(size8 * 2, size8 / 2, size8 * 2, size8 / 2); itemView.setClickable(true); final int finalI = i; if (i == 0) { itemView.setBackgroundColor(colorTabSize); } itemView.setOnClickListener(v -> { switchTab(finalI); switchDot(0); int pageStart = getPageCountBefore(finalI); viewPager.setCurrentItem(pageStart, true); }); tabContainer.addView(itemView, params); } View v = new View(context); v.setLayoutParams(new LayoutParams(LWC, LMP, 1)); tabContainer.addView(v); ImageView delIcon = new ImageView(context); delIcon.setPadding(size8 * 2, size8 / 2, size8 * 2, size8 / 2); delIcon.setScaleType(ImageView.ScaleType.CENTER_CROP); delIcon.setImageDrawable(ContextCompat.getDrawable(context, R.drawable.btn_back_space)); delIcon.setClickable(true); delIcon.setOnClickListener(v1 -> emotionInputHandler.backSpace()); tabContainer.addView(delIcon, params); } public void setDots(int tabpos) { dotContainer.removeAllViews(); LayoutParams lpp = new LayoutParams(LWC, LWC); lpp.setMargins(size8 / 2, 0, size8 / 2, 0); lpp.gravity = Gravity.CENTER_VERTICAL; for (int i = 0; i < getPageSize(tabpos); i++) { ImageView dotImageView = new ImageView(context); dotImageView.setImageResource(dotImageResourseId); dotImageView.setScaleType(ImageView.ScaleType.CENTER_CROP); dotImageView.setEnabled(false); dotContainer.addView(dotImageView, lpp); } } @Override public void onPageScrollStateChanged(int state) { } private class PageAdapter extends PagerAdapter { @Override public int getCount() { return totalPageSize; } @Override public Object instantiateItem(ViewGroup container, final int page) { EmotionGridView v = container.findViewWithTag(page); if (v == null) { final int tabpos = pageToTabPos(page); int pageStart = page - getPageCountBefore(tabpos); int index = pageStart * ROW_COUNT * COLOUM_COUNT; v = new EmotionGridView(context, smileys.get(tabpos), COLOUM_COUNT, ROW_COUNT, index, emotionInputHandler); v.setLayoutParams(new LayoutParams(LMP, LMP)); v.setTag(page); container.addView(v); } return v; } @Override public void destroyItem(ViewGroup container, int position, Object object) { } @Override public boolean isViewFromObject(View view, Object object) { return view == object; } @Override public int getItemPosition(Object object) { return POSITION_NONE; } } }