Androidで画像を絵文字のように表示する
AndroidのTextViewを拡張して、EmojiTextViewというクラスをつくりました。
絵文字データを独自のタグでDBに保存しており、APIで絵文字の独自タグで取得してしてAndroid内の絵文字画像とマッピングするコードを書いたので、公開いたします。
EmojiTextView.java
package jp.sharakova.android.emoji; import android.content.Context; import android.graphics.drawable.Drawable; import android.text.Html; import android.text.Html.ImageGetter; import android.util.AttributeSet; import android.widget.TextView; public class EmojiTextView extends TextView { private Context context; public EmojiTextView(Context context) { super(context); this.context = context; } public EmojiTextView(Context context, AttributeSet attrs) { super(context, attrs); this.context = context; } public EmojiTextView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); this.context = context; } public void setEmojiText(String text) { text = EmojiUtils.convertTag(text); CharSequence spanned = Html.fromHtml(text, emojiGetter, null); setText(spanned); } private ImageGetter emojiGetter = new ImageGetter() { public Drawable getDrawable(String source){ int id = getResources().getIdentifier(source, "drawable", context.getPackageName()); Drawable emoji = getResources().getDrawable(id); int w = (int)(emoji.getIntrinsicWidth() * 1.25); int h = (int)(emoji.getIntrinsicHeight() * 1.25); emoji.setBounds(0, 0, w, h); return emoji; } }; }
利用方法は、setEmojiTextに弊社で利用している、絵文字の独自タグごと文字列を設定します。
絵文字の独自タグ(今回は%%i:1%%などのフォーマット)をAndroidの絵文字とマッピングするには、独自タグから<img src="e001">のようにe001はdrawable内にある画像名に変換する必要があります。
ちょっとダサいコードですが、絵文字変換部分は、このような形で実装しております。
EmojiUtils.java
package jp.sharakova.android.emoji; public class EmojiUtils { public static String convertTag(String str){ return str .replaceAll("<", "<") .replaceAll("%%i:1%%","<img src=\"e001\"/>") .replaceAll("%%i:2%%","<img src=\"e002\"/>") .replaceAll("%%i:3%%","<img src=\"e003\"/>") .replaceAll("%%i:4%%","<img src=\"e004\"/>") .replaceAll("%%i:5%%","<img src=\"e005\"/>") .replaceAll("%%i:6%%","<img src=\"e006\"/>") .replaceAll("%%i:7%%","<img src=\"e007\"/>") ・・・・・・・・ .replaceAll("%%ix:97%%","") .replaceAll("%%ix:98%%","") .replaceAll("%%ix:99%%","") .replaceAll("%%ix:100%%","") ; } }
layoutファイルで、TextViewから今回作ったEmojiTextViewに切り替える必要があるので、
layoutファイルはこのような感じになります。TextViewを継承しているので、TextViewで設定可能な項目はそのまま利用できます。
main.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <jp.sharakova.android.emoji.EmojiTextView android:id="@+id/EmojiTextView1" android:layout_width="fill_parent" android:layout_height="wrap_content" /> </LinearLayout>
実際に、サンプル的にActivityを書いてみます。
EmojiTextViewSampleActivity.java
package jp.sharakova.android.emoji; import android.app.Activity; import android.os.Bundle; public class EmojiTextViewSampleActivity extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); EmojiTextView emojiTextView = (EmojiTextView)findViewById(R.id.EmojiTextView1); String emojiText = "絵文字テスト%%i:3%%、こんどは、%%i:85%%"; emojiTextView.setEmojiText(emojiText); } }
%%i:3%%、%%i:85%%の部分が、drawable無いにある画像に置き換わって表示されるのがわかると思います。
今回のソース・絵文字データはすべてgithubでダウンロードいただけますので、そちらで確認をお願いいたします。