我们来看产品的一个需求,如何在TextView中插入自定义表情符号,邮件,电话号码呢,默认的TextView是支持不了这个特性的,所以我们要写一个控件继承TextView来实现。
我们来看一下实现的效果:

文本里有表情,有手机号码,有邮箱,这个特别适合微博的列表item展示
因为功能比较复杂,我们分几部分来看
首先肯定要解析文字,把里面表情的文字,电话的文字还有邮箱的文字提取出来
我们把表情的json放到Asset里:
{
"data": {
"list": [{
"face": "(#f1)"
}, {
"face": "(#f2)"
}]
},
"status": "success",
"message": ""
}然后写一个表情的解析类:
public class StateFaceModel {
private static StateFaceModel instance = null;
public static synchronized StateFaceModel getInstance() {
if (instance == null) {
instance = new StateFaceModel();
}
return instance;
}
private boolean mInitialized = false;
private HashMap<String, Bitmap> mFaceMap = new HashMap<String, Bitmap>();
private ArrayList<String> mFaceStrings = new ArrayList<String>();
private ArrayList<Bitmap> mFaceIcons = new ArrayList<Bitmap>();
private HashMap<String, Bitmap> mSmallFaceMap = new HashMap<String, Bitmap>();
private ArrayList<Bitmap> mSmallFaceIcons = new ArrayList<Bitmap>();
private StateFaceModel() {
}
public void init(Context context) {
if (mInitialized || context == null) {
// initialize only once
return;
}
mFaceMap.clear();
mFaceStrings.clear();
mFaceIcons.clear();
mSmallFaceMap.clear();
mSmallFaceIcons.clear();
ArrayList<String> faces = new ArrayList<String>();
try {
//读取json文件里的内容
String text = ParseNewsInfoUtil.getAssetJsonByName(context,"state_face/state_face.json");
JSONObject jsonObject = new JSONObject(text);
JSONObject data = jsonObject.optJSONObject("data");
JSONArray list = data.optJSONArray("list");
for (int i=0;i<list.length();i++) {
JSONObject item = list.optJSONObject(i);
String value = item.optString("face");
faces.add(value);
}
} catch (Exception e) {
e.printStackTrace();
}
for (int i = 0; i < faces.size(); ++i) {
int index = i + 1;
int id = context.getResources().getIdentifier("msgface_" + index,
"drawable", "com.pic.optimize");
try {
Bitmap bm = BitmapFactory.decodeResource(
context.getResources(), id);
mSmallFaceMap.put(faces.get(i), bm);
mSmallFaceIcons.add(bm);
mFaceStrings.add(faces.get(i));
} catch (Exception e) {
e.printStackTrace();
}
}
mInitialized = true;
}
public ArrayList<String> getFaceStrings() {
return mFaceStrings;
}
public Bitmap getSmallFaceIcon(String content) {
if(mSmallFaceMap != null) {
return mSmallFaceMap.get(content);
}else{
return null;
}
}
}这个类写成单例模式,保证解析json只是发生一次
文字和bitmap都存储在mSmallFaceMap里面
我们要写一个model来放解析后的文案
public class LinkInfo implements Comparable<LinkInfo>{
private String content;
private String type;
private String id;
private boolean bIsFace = false;
private boolean bSelected = false;
public static final String EMAIL = "Email";
public static final String WEBURL = "WebUrl";
public static final String PHONENUMBER = "PhoneNumber";
private int startIndex;
private int endIndex;
private ArrayList<RectF> rectFList = new ArrayList<RectF>();如何解析我们放到下一篇
随时随地看视频