aboutsummaryrefslogtreecommitdiffstats
path: root/libs/emojicon/src/main/java/com/rockerhieu/emojicon/EmojiconSpan.java
diff options
context:
space:
mode:
Diffstat (limited to 'libs/emojicon/src/main/java/com/rockerhieu/emojicon/EmojiconSpan.java')
-rw-r--r--libs/emojicon/src/main/java/com/rockerhieu/emojicon/EmojiconSpan.java95
1 files changed, 95 insertions, 0 deletions
diff --git a/libs/emojicon/src/main/java/com/rockerhieu/emojicon/EmojiconSpan.java b/libs/emojicon/src/main/java/com/rockerhieu/emojicon/EmojiconSpan.java
new file mode 100644
index 00000000..94ebdc0d
--- /dev/null
+++ b/libs/emojicon/src/main/java/com/rockerhieu/emojicon/EmojiconSpan.java
@@ -0,0 +1,95 @@
+/*
+ * Copyright 2014 Hieu Rocker
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.rockerhieu.emojicon;
+
+import android.content.Context;
+import android.graphics.Canvas;
+import android.graphics.Paint;
+import android.graphics.drawable.Drawable;
+import android.text.style.DynamicDrawableSpan;
+
+import java.lang.ref.WeakReference;
+
+/**
+ * @author Hieu Rocker (rockerhieu@gmail.com)
+ */
+class EmojiconSpan extends DynamicDrawableSpan {
+
+ private final Context mContext;
+
+ private final int mResourceId;
+
+ private final int mSize;
+
+ private final int mTextSize;
+
+ private int mHeight;
+
+ private int mWidth;
+
+ private int mTop;
+
+ private Drawable mDrawable;
+
+ private WeakReference<Drawable> mDrawableRef;
+
+ public EmojiconSpan(Context context, int resourceId, int size, int alignment, int textSize) {
+ super(alignment);
+ mContext = context;
+ mResourceId = resourceId;
+ mWidth = mHeight = mSize = size;
+ mTextSize = textSize;
+ }
+
+ public Drawable getDrawable() {
+ if (mDrawable == null) {
+ try {
+ mDrawable = mContext.getResources().getDrawable(mResourceId);
+ mHeight = mSize;
+ mWidth = mHeight * mDrawable.getIntrinsicWidth() / mDrawable.getIntrinsicHeight();
+ mTop = (mTextSize - mHeight) / 2;
+ mDrawable.setBounds(0, mTop, mWidth, mTop + mHeight);
+ } catch (Exception e) {
+ // swallow
+ }
+ }
+ return mDrawable;
+ }
+
+ @Override
+ public void draw(Canvas canvas, CharSequence text, int start, int end, float x, int top, int y, int bottom, Paint paint) {
+ //super.draw(canvas, text, start, end, x, top, y, bottom, paint);
+ Drawable b = getCachedDrawable();
+ canvas.save();
+
+ int transY = bottom - b.getBounds().bottom;
+ if (mVerticalAlignment == ALIGN_BASELINE) {
+ transY = top + ((bottom - top) / 2) - ((b.getBounds().bottom - b.getBounds().top) / 2) - mTop;
+ }
+
+ canvas.translate(x, transY);
+ b.draw(canvas);
+ canvas.restore();
+ }
+
+ private Drawable getCachedDrawable() {
+ if (mDrawableRef == null || mDrawableRef.get() == null) {
+ mDrawableRef = new WeakReference<Drawable>(getDrawable());
+ }
+ return mDrawableRef.get();
+ }
+} \ No newline at end of file