android QQ 채 팅 모방, 표정, 페이지 넘 기기, 페이지 넘 기기 드래그 버퍼
그 다음 에 대체적으로 원 리 를 말한다.
1. 먼저 입력 한 문자, 표정 이 포 함 된 문자 인지 판단 합 니 다. 예 를 들 어 이 표정 에 대응 하 는 파일 이름 은 emoji 입 니 다.1. png, 그 에 대응 하 는 문자 설명: [귀여워], 만약 우리 가 출력 하고 있다 면: 여보, 보고 싶 어 요.그럼 우리 가 대응 하 는 근본 적 인 문 자 는: 여보, 보고 싶 어 요.
2. 구체 적 인 전환 과정 은 정규 표현 식 으로 문자 에 [xxx] 와 같은 문자 가 포함 되 어 있 는 지 비교 하 는 것 입 니 다. 만약 에 있 으 면 우 리 는 받 은 [xxx] 에 따라 해당 하 는 자원 파일 id 를 찾 습 니 다. 물론 이 중 에 관계 표 가 있 습 니 다. 이 관 계 를 어떻게 처리 하 는 지 보 겠 습 니 다.마지막 으로 이 를 SpannableString 으로 문자 로 바 꾸 고 겉 으로 는 그림 이 표 시 됩 니 다. 사실은 TextView 의 text 는 여전히: 여보, 보고 싶 어 요 [귀여워 요].이 과정 알 겠 어 요?
아래 에 데모 프로젝트 의 구 조 를 붙 입 니 다.
몇 가지 중요 한 종 류 를 더 붙 여 라.
package com.example.facedemo;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.text.Spannable;
import android.text.SpannableString;
import android.text.TextUtils;
import android.text.style.ImageSpan;
import android.util.Log;
/**
*
******************************************
* @author
* @ : FaceConversionUtil.java
* @ : 2013-1-27 02:34:09
* @ :
******************************************
*/
public class FaceConversionUtil {
/** */
private int pageSize = 20;
private static FaceConversionUtil mFaceConversionUtil;
/** HashMap */
private HashMap emojiMap = new HashMap();
/** */
private List emojis = new ArrayList();
/** */
public List> emojiLists = new ArrayList>();
private FaceConversionUtil() {
}
public static FaceConversionUtil getInstace() {
if (mFaceConversionUtil == null) {
mFaceConversionUtil = new FaceConversionUtil();
}
return mFaceConversionUtil;
}
/**
* SpanableString , ,
*
* @param context
* @param str
* @return
*/
public SpannableString getExpressionString(Context context, String str) {
SpannableString spannableString = new SpannableString(str);
// , : [ ]
String zhengze = "\\[[^\\]]+\\]";
// pattern
Pattern sinaPatten = Pattern.compile(zhengze, Pattern.CASE_INSENSITIVE);
try {
dealExpression(context, spannableString, sinaPatten, 0);
} catch (Exception e) {
Log.e("dealExpression", e.getMessage());
}
return spannableString;
}
/**
*
*
* @param context
* @param imgId
* @param spannableString
* @return
*/
public SpannableString addFace(Context context, int imgId,
String spannableString) {
if (TextUtils.isEmpty(spannableString)) {
return null;
}
Bitmap bitmap = BitmapFactory.decodeResource(context.getResources(),
imgId);
bitmap = Bitmap.createScaledBitmap(bitmap, 35, 35, true);
ImageSpan imageSpan = new ImageSpan(context, bitmap);
SpannableString spannable = new SpannableString(spannableString);
spannable.setSpan(imageSpan, 0, spannableString.length(),
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
return spannable;
}
/**
* spanableString , ,
*
* @param context
* @param spannableString
* @param patten
* @param start
* @throws Exception
*/
private void dealExpression(Context context,
SpannableString spannableString, Pattern patten, int start)
throws Exception {
Matcher matcher = patten.matcher(spannableString);
while (matcher.find()) {
String key = matcher.group();
// ,ture
if (matcher.start() < start) {
continue;
}
String value = emojiMap.get(key);
if (TextUtils.isEmpty(value)) {
continue;
}
int resId = context.getResources().getIdentifier(value, "drawable",
context.getPackageName());
// id, , , 。
// Field field=R.drawable.class.getDeclaredField(value);
// int resId=Integer.parseInt(field.get(null).toString());
if (resId != 0) {
Bitmap bitmap = BitmapFactory.decodeResource(
context.getResources(), resId);
bitmap = Bitmap.createScaledBitmap(bitmap, 50, 50, true);
// id bitmap, ImageSpan
ImageSpan imageSpan = new ImageSpan(bitmap);
// ,
int end = matcher.start() + key.length();
//
spannableString.setSpan(imageSpan, matcher.start(), end,
Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
if (end < spannableString.length()) {
// , 。。
dealExpression(context, spannableString, patten, end);
}
break;
}
}
}
public void getFileText(Context context) {
ParseData(FileUtils.getEmojiFile(context), context);
}
/**
*
*
* @param data
*/
private void ParseData(List data, Context context) {
if (data == null) {
return;
}
ChatEmoji emojEentry;
try {
for (String str : data) {
String[] text = str.split(",");
String fileName = text[0]
.substring(0, text[0].lastIndexOf("."));
emojiMap.put(text[1], fileName);
int resID = context.getResources().getIdentifier(fileName,
"drawable", context.getPackageName());
if (resID != 0) {
emojEentry = new ChatEmoji();
emojEentry.setId(resID);
emojEentry.setCharacter(text[1]);
emojEentry.setFaceName(fileName);
emojis.add(emojEentry);
}
}
int pageCount = (int) Math.ceil(emojis.size() / 20 + 0.1);
for (int i = 0; i < pageCount; i++) {
emojiLists.add(getData(i));
}
} catch (Exception e) {
e.printStackTrace();
}
}
/**
*
*
* @param page
* @return
*/
private List getData(int page) {
int startIndex = page * pageSize;
int endIndex = startIndex + pageSize;
if (endIndex > emojis.size()) {
endIndex = emojis.size();
}
// , viewpager ,
List list = new ArrayList();
list.addAll(emojis.subList(startIndex, endIndex));
if (list.size() < pageSize) {
for (int i = list.size(); i < pageSize; i++) {
ChatEmoji object = new ChatEmoji();
list.add(object);
}
}
if (list.size() == pageSize) {
ChatEmoji object = new ChatEmoji();
object.setId(R.drawable.face_del_icon);
list.add(object);
}
return list;
}
}
아래 는 표정 레이아웃 이 고 입력 상자 가 있 습 니 다. 여러 곳 에서 사용 할 수 있 으 며 불필요 한 코드 를 많이 사용 하지 않 습 니 다.
package com.example.facedemo;
import java.util.ArrayList;
import java.util.List;
import android.content.Context;
import android.graphics.Color;
import android.graphics.drawable.ColorDrawable;
import android.support.v4.view.ViewPager;
import android.support.v4.view.ViewPager.OnPageChangeListener;
import android.text.SpannableString;
import android.text.TextUtils;
import android.util.AttributeSet;
import android.view.Gravity;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.EditText;
import android.widget.GridView;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
/**
*
******************************************
* @author
* @ : FaceRelativeLayout.java
* @ : 2013-1-27 02:34:17
* @ :
******************************************
*/
public class FaceRelativeLayout extends RelativeLayout implements
OnItemClickListener, OnClickListener {
private Context context;
/** */
private OnCorpusSelectedListener mListener;
/** viewpager */
private ViewPager vp_face;
/** */
private ArrayList pageViews;
/** */
private LinearLayout layout_point;
/** */
private ArrayList pointViews;
/** */
private List> emojis;
/** */
private View view;
/** */
private EditText et_sendmessage;
/** */
private List faceAdapters;
/** */
private int current = 0;
public FaceRelativeLayout(Context context) {
super(context);
this.context = context;
}
public FaceRelativeLayout(Context context, AttributeSet attrs) {
super(context, attrs);
this.context = context;
}
public FaceRelativeLayout(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
this.context = context;
}
public void setOnCorpusSelectedListener(OnCorpusSelectedListener listener) {
mListener = listener;
}
/**
*
*
* @author naibo-liao
* @ : 2013-1-15 04:32:54
*/
public interface OnCorpusSelectedListener {
void onCorpusSelected(ChatEmoji emoji);
void onCorpusDeleted();
}
@Override
protected void onFinishInflate() {
super.onFinishInflate();
emojis = FaceConversionUtil.getInstace().emojiLists;
onCreate();
}
private void onCreate() {
Init_View();
Init_viewPager();
Init_Point();
Init_Data();
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn_face:
//
if (view.getVisibility() == View.VISIBLE) {
view.setVisibility(View.GONE);
} else {
view.setVisibility(View.VISIBLE);
}
break;
case R.id.et_sendmessage:
//
if (view.getVisibility() == View.VISIBLE) {
view.setVisibility(View.GONE);
}
break;
}
}
/**
*
*/
public boolean hideFaceView() {
//
if (view.getVisibility() == View.VISIBLE) {
view.setVisibility(View.GONE);
return true;
}
return false;
}
/**
*
*/
private void Init_View() {
vp_face = (ViewPager) findViewById(R.id.vp_contains);
et_sendmessage = (EditText) findViewById(R.id.et_sendmessage);
layout_point = (LinearLayout) findViewById(R.id.iv_image);
et_sendmessage.setOnClickListener(this);
findViewById(R.id.btn_face).setOnClickListener(this);
view = findViewById(R.id.ll_facechoose);
}
/**
* viewpager
*/
private void Init_viewPager() {
pageViews = new ArrayList();
//
View nullView1 = new View(context);
//
nullView1.setBackgroundColor(Color.TRANSPARENT);
pageViews.add(nullView1);
//
faceAdapters = new ArrayList();
for (int i = 0; i < emojis.size(); i++) {
GridView view = new GridView(context);
FaceAdapter adapter = new FaceAdapter(context, emojis.get(i));
view.setAdapter(adapter);
faceAdapters.add(adapter);
view.setOnItemClickListener(this);
view.setNumColumns(7);
view.setBackgroundColor(Color.TRANSPARENT);
view.setHorizontalSpacing(1);
view.setVerticalSpacing(1);
view.setStretchMode(GridView.STRETCH_COLUMN_WIDTH);
view.setCacheColorHint(0);
view.setPadding(5, 0, 5, 0);
view.setSelector(new ColorDrawable(Color.TRANSPARENT));
view.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT,
LayoutParams.WRAP_CONTENT));
view.setGravity(Gravity.CENTER);
pageViews.add(view);
}
//
View nullView2 = new View(context);
//
nullView2.setBackgroundColor(Color.TRANSPARENT);
pageViews.add(nullView2);
}
/**
*
*/
private void Init_Point() {
pointViews = new ArrayList();
ImageView imageView;
for (int i = 0; i < pageViews.size(); i++) {
imageView = new ImageView(context);
imageView.setBackgroundResource(R.drawable.d1);
LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(
new ViewGroup.LayoutParams(LayoutParams.WRAP_CONTENT,
LayoutParams.WRAP_CONTENT));
layoutParams.leftMargin = 10;
layoutParams.rightMargin = 10;
layoutParams.width = 8;
layoutParams.height = 8;
layout_point.addView(imageView, layoutParams);
if (i == 0 || i == pageViews.size() - 1) {
imageView.setVisibility(View.GONE);
}
if (i == 1) {
imageView.setBackgroundResource(R.drawable.d2);
}
pointViews.add(imageView);
}
}
/**
*
*/
private void Init_Data() {
vp_face.setAdapter(new ViewPagerAdapter(pageViews));
vp_face.setCurrentItem(1);
current = 0;
vp_face.setOnPageChangeListener(new OnPageChangeListener() {
@Override
public void onPageSelected(int arg0) {
current = arg0 - 1;
//
draw_Point(arg0);
// , , .
if (arg0 == pointViews.size() - 1 || arg0 == 0) {
if (arg0 == 0) {
vp_face.setCurrentItem(arg0 + 1);// .
pointViews.get(1).setBackgroundResource(R.drawable.d2);
} else {
vp_face.setCurrentItem(arg0 - 1);//
pointViews.get(arg0 - 1).setBackgroundResource(
R.drawable.d2);
}
}
}
@Override
public void onPageScrolled(int arg0, float arg1, int arg2) {
}
@Override
public void onPageScrollStateChanged(int arg0) {
}
});
}
/**
*
*/
public void draw_Point(int index) {
for (int i = 1; i < pointViews.size(); i++) {
if (index == i) {
pointViews.get(i).setBackgroundResource(R.drawable.d2);
} else {
pointViews.get(i).setBackgroundResource(R.drawable.d1);
}
}
}
@Override
public void onItemClick(AdapterView> arg0, View arg1, int arg2, long arg3) {
ChatEmoji emoji = (ChatEmoji) faceAdapters.get(current).getItem(arg2);
if (emoji.getId() == R.drawable.face_del_icon) {
int selection = et_sendmessage.getSelectionStart();
String text = et_sendmessage.getText().toString();
if (selection > 0) {
String text2 = text.substring(selection - 1);
if ("]".equals(text2)) {
int start = text.lastIndexOf("[");
int end = selection;
et_sendmessage.getText().delete(start, end);
return;
}
et_sendmessage.getText().delete(selection - 1, selection);
}
}
if (!TextUtils.isEmpty(emoji.getCharacter())) {
if (mListener != null)
mListener.onCorpusSelected(emoji);
SpannableString spannableString = FaceConversionUtil.getInstace()
.addFace(getContext(), emoji.getId(), emoji.getCharacter());
et_sendmessage.append(spannableString);
}
}
}
다음은 채 팅 데이터 충전기 입 니 다.
package com.example.facedemo;
import android.content.Context;
import android.text.SpannableString;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;
import java.util.List;
/**
*
******************************************
* @author
* @ : ChatMsgAdapter.java
* @ : 2013-1-27 02:33:16
* @ :
******************************************
*/
public class ChatMsgAdapter extends BaseAdapter {
public static interface IMsgViewType {
int IMVT_COM_MSG = 0;
int IMVT_TO_MSG = 1;
}
private List coll;
private LayoutInflater mInflater;
private Context context;
public ChatMsgAdapter(Context context, List coll) {
this.coll = coll;
mInflater = LayoutInflater.from(context);
this.context = context;
}
public int getCount() {
return coll.size();
}
public Object getItem(int position) {
return coll.get(position);
}
public long getItemId(int position) {
return position;
}
public int getItemViewType(int position) {
ChatMsgEntity entity = coll.get(position);
if (entity.getMsgType()) {
return IMsgViewType.IMVT_COM_MSG;
} else {
return IMsgViewType.IMVT_TO_MSG;
}
}
public int getViewTypeCount() {
return 2;
}
public View getView(int position, View convertView, ViewGroup parent) {
ChatMsgEntity entity = coll.get(position);
boolean isComMsg = entity.getMsgType();
ViewHolder viewHolder = null;
if (convertView == null) {
if (isComMsg) {
convertView = mInflater.inflate(
R.layout.chatting_item_msg_text_left, null);
} else {
convertView = mInflater.inflate(
R.layout.chatting_item_msg_text_right, null);
}
viewHolder = new ViewHolder();
viewHolder.tvSendTime = (TextView) convertView
.findViewById(R.id.tv_sendtime);
viewHolder.tvContent = (TextView) convertView
.findViewById(R.id.tv_chatcontent);
viewHolder.isComMsg = isComMsg;
convertView.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) convertView.getTag();
}
viewHolder.tvSendTime.setText(entity.getDate());
SpannableString spannableString = FaceConversionUtil.getInstace().getExpressionString(context, entity.getText());
viewHolder.tvContent.setText(spannableString);
return convertView;
}
class ViewHolder {
public TextView tvSendTime;
public TextView tvContent;
public boolean isComMsg = true;
}
}
처음 읽 을 이모 티 콘 설정 파일
package com.example.facedemo;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import android.content.Context;
/**
*
******************************************
* @author
* @ : FileUtils.java
* @ : 2013-1-27 02:35:09
* @ :
******************************************
*/
public class FileUtils {
/**
*
*
* @param context
* @return
*/
public static List getEmojiFile(Context context) {
try {
List list = new ArrayList();
InputStream in = context.getResources().getAssets().open("emoji");
BufferedReader br = new BufferedReader(new InputStreamReader(in,
"UTF-8"));
String str = null;
while ((str = br.readLine()) != null) {
list.add(str);
}
return list;
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
}
아래 이것 은 이모 티 콘 페이지 를 넘 긴 데이터 로 채 우 고 viewpager 를 사용 하 며 각 페이지 마다 gridview 를 채 웁 니 다.
package com.example.facedemo;
import java.util.List;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.view.View;
/**
*
******************************************
* @author
* @ : ViewPagerAdapter.java
* @ : 2013-1-27 02:35:27
* @ : ViewPager , !!! View!!!!
******************************************
*/
public class ViewPagerAdapter extends PagerAdapter {
private List pageViews;
public ViewPagerAdapter(List pageViews) {
super();
this.pageViews=pageViews;
}
//
@Override
public int getCount() {
return pageViews.size();
}
@Override
public boolean isViewFromObject(View arg0, Object arg1) {
return arg0 == arg1;
}
@Override
public int getItemPosition(Object object) {
return super.getItemPosition(object);
}
@Override
public void destroyItem(View arg0, int arg1, Object arg2) {
((ViewPager)arg0).removeView(pageViews.get(arg1));
}
/***
* item�? listview getview
*/
@Override
public Object instantiateItem(View arg0, int arg1) {
((ViewPager)arg0).addView(pageViews.get(arg1));
return pageViews.get(arg1);
}
}
마지막 으로, 표정의 프로필 이 야. 네가 하고 싶 은 대로 해도 돼. 내 가 이렇게 할 게.
emoji_1.png,[ ]
emoji_2.png,[ ]
emoji_3.png,[ ]
emoji_4.png,[ ]
emoji_5.png,[ ]
emoji_6.png,[ ]
emoji_7.png,[ ]
emoji_8.png,[ ]
emoji_9.png,[ ]
emoji_10.png,[ ]
emoji_11.png,[ ]
emoji_12.png,[ ]
emoji_13.png,[ ]
emoji_14.png,[ ]
emoji_15.png,[ ]
emoji_16.png,[ ]
emoji_17.png,[ ]
emoji_18.png,[ ]
emoji_19.png,[ ]
emoji_20.png,[ ]
emoji_21.png,[ ]
emoji_22.png,[ ]
emoji_23.png,[ ]
emoji_24.png,[ ]
emoji_25.png,[ ]
emoji_26.png,[ ]
emoji_27.png,[ ]
emoji_28.png,[ ]
emoji_29.png,[ ]
emoji_30.png,[ ]
emoji_31.png,[ ]
emoji_32.png,[ ]
emoji_33.png,[ ]
emoji_34.png,[ ]
emoji_35.png,[ ]
emoji_36.png,[ ]
emoji_37.png,[ ]
emoji_38.png,[ ]
emoji_39.png,[ ]
emoji_40.png,[ ]
emoji_41.png,[ ]
emoji_42.png,[ ]
emoji_43.png,[ ]
emoji_44.png,[ ]
emoji_45.png,[ ]
emoji_46.png,[ ]
emoji_47.png,[ ]
emoji_48.png,[ ]
emoji_49.png,[ ]
emoji_50.png,[ ]
emoji_51.png,[ ]
emoji_52.png,[ ]
emoji_53.png,[ ]
emoji_54.png,[ ]
emoji_55.png,[ ]
emoji_56.png,[ ]
emoji_57.png,[ ]
emoji_58.png,[ ]
emoji_59.png,[ ]
emoji_60.png,[ ]
emoji_61.png,[ ]
emoji_62.png,[ ]
emoji_63.png,[ ]
emoji_64.png,[ ]
emoji_65.png,[ ]
emoji_66.png,[ ]
emoji_67.png,[ ]
emoji_68.png,[ ]
emoji_69.png,[ ]
emoji_70.png,[ ]
emoji_71.png,[ ]
emoji_179.png,[ ]
emoji_180.png,[ ]
emoji_181.png,[ ]
emoji_182.png,[ ]
emoji_183.png,[ ]
emoji_184.png,[ ]
emoji_185.png,[ ]
emoji_186.png,[ ]
emoji_187.png,[ ]
emoji_188.png,[ ]
emoji_189.png,[]
emoji_190.png,[ ]
emoji_191.png,[ ]
emoji_192.png,[ ]
emoji_193.png,[ ]
emoji_194.png,[ ]
emoji_195.png,[ ]
emoji_196.png,[ ]
emoji_197.png,[ ]
emoji_198.png,[ ]
emoji_199.png,[ ]
emoji_200.png,[ ]
emoji_201.png,[ ]
emoji_202.png,[ ]
emoji_203.png,[ ]
emoji_204.png,[ ]
emoji_205.png,[ ]
emoji_206.png,[ ]
emoji_207.png,[ ]
emoji_208.png,[ ]
emoji_209.png,[ ]
emoji_210.png,[ ]
emoji_211.png,[ ]
emoji_212.png,[ ]
emoji_213.png,[ ]
emoji_214.png,[ ]
emoji_215.png,[ ]
emoji_216.png,[ ]
emoji_217.png,[ ]
emoji_218.png,[ ]
emoji_219.png,[ ]
emoji_220.png,[ ]
emoji_221.png,[ ]
emoji_222.png,[ ]
emoji_223.png,[ ]
emoji_224.png,[ ]
레이아웃 파일 을 잊 어 버 렸 어 요. 와 하하.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.