Android开发自定义表情
聊天中自定义表情,评论中自定义表情。用户要发表东西,一般都需要加上表情
一、思路:
用谷歌的字符编码做表情
二、效果图:
三、关键代码:
public class MyApp extends Application {
@Override
public void onCreate() {
super.onCreate();
EmojiCompat.init(new BundledEmojiCompatConfig(this)
.setReplaceAll(true));
}
}
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
EditText et_comment = findViewById(R.id.et_comment);
MyBanner mybanner_emoji = findViewById(R.id.mybanner_emoji);
mybanner_emoji.setDatas(getPagerList(this, EmojiDatas.listList, new OnEmojiClickListener() {
@Override
public void onClick(int emoji) {
if (emoji == -1){
KeyEvent event = new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_DEL);
et_comment.onKeyDown(KeyEvent.KEYCODE_DEL, event);
} else {
et_comment.append(EmojiUtil.Character2Chars(emoji));
}
}
}),2,0,R.drawable.point_background_3,false);
}
public List<View> getPagerList(Context mContext, List<List<Integer>> mEmojis, final OnEmojiClickListener mEmojiClickListener) {
List<View> pagers = null;
//String[] eachPageEmojis = null;
if (null != mEmojis && mEmojis.size() > 0) {
pagers = new ArrayList<>();
int pageCount = mEmojis.size();//共8页表情
for (int i = 0; i < pageCount; i++) {
GridView gridView = new GridView(mContext);
gridView.setNumColumns(7);
gridView.setSelector(new ColorDrawable(Color.TRANSPARENT));
gridView.setHorizontalSpacing(dp2px(mContext,10));
gridView.setVerticalSpacing(dp2px(mContext,15));
gridView.setAdapter(new EmojiGvAdapter(mContext, mEmojis.get(i)));
//点击表情监听
gridView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
//获取选中的表情字符
int emoji = (int) parent.getAdapter().getItem(position);
if (null != mEmojiClickListener) {
mEmojiClickListener.onClick(emoji);
}
}
});
pagers.add(gridView);
}
}
return pagers;
}
/**
* dp转px
*
* @param dpValue dp值
* @return px值
*/
public int dp2px(Context context, float dpValue) {
final float scale = context.getResources().getDisplayMetrics().density;
return (int) (dpValue * scale + 0.5f);
}
}
public class EmojiGvAdapter extends BaseAdapter {
private Context mContext;
private List<Integer> mEmojis;
public EmojiGvAdapter(Context context, List<Integer> eachPageEmojis) {
this.mContext = context;
this.mEmojis = eachPageEmojis;
}
@Override
public int getCount() {
return null == mEmojis ? 0 : mEmojis.size();
}
@Override
public Integer getItem(int position) {
return null == mEmojis ? 0 : mEmojis.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder = null;
if (null == convertView) {
holder = new ViewHolder();
convertView = LayoutInflater.from(mContext).inflate(R.layout.item_emoji, parent, false);
holder.emojiTv = (TextView) convertView.findViewById(R.id.tv_emoji);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
if (getItem(position) == -1){
FrameLayout.LayoutParams lp = (FrameLayout.LayoutParams) holder.emojiTv.getLayoutParams();
lp.width = dp2px(mContext,28);
lp.height = dp2px(mContext,28);
lp.leftMargin = dp2px(mContext,8);
lp.topMargin = dp2px(mContext,2);
holder.emojiTv.setLayoutParams(lp);
holder.emojiTv.setBackgroundResource(R.mipmap.rc_icon_emoji_delete);
} else {
FrameLayout.LayoutParams lp = new FrameLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT,FrameLayout.LayoutParams.WRAP_CONTENT);
holder.emojiTv.setLayoutParams(lp);
holder.emojiTv.setText(EmojiUtil.Character2Chars(getItem(position)));
}
return convertView;
}
private static class ViewHolder {
private TextView emojiTv;
}
/**
* dp转px
*
* @param dpValue dp值
* @return px值
*/
public static int dp2px(Context context, float dpValue) {
final float scale = context.getResources().getDisplayMetrics().density;
return (int) (dpValue * scale + 0.5f);
}
}
四、项目demo源码结构图:
有问题或者需要完整源码demo的可以看简介联系我,也可以私信我,我每天都看私信的