package com.netease.nim.uikit.common.ui.drop; import android.content.Context; import android.graphics.Color; import android.graphics.Paint; import android.text.TextPaint; import android.view.View; import com.netease.nim.uikit.R; import com.netease.nim.uikit.common.util.log.LogUtil; import com.netease.nim.uikit.common.util.sys.ScreenUtil; /** * Created by huangjun on 2016/9/13. */ public class DropManager { // constant private static final String TAG = "DropManager"; static final int TEXT_SIZE = ScreenUtil.sp2px(12); // 12sp static final int CIRCLE_RADIUS = ScreenUtil.dip2px(10); // 10dip public interface IDropListener { void onDropBegin(); void onDropEnd(); } // single instance private static DropManager instance; public static synchronized DropManager getInstance() { if (instance == null) { instance = new DropManager(); } return instance; } // field private boolean isTouchable; // 是否响应按键事件,如果一个红点已经在响应,其它红点就不响应,同一界面始终最多只有一个红点响应触摸 private int statusBarHeight; // 状态栏(通知栏)高度 private DropCover dropCover; // Drop全屏动画 private Object currentId; // 当前正在执行动画的业务节点 private TextPaint textPaint; // 文本画笔共享 private float textYOffset; // 文本y轴居中需要的offset private Paint circlePaint; // 圆形画笔共享 private IDropListener listener; // 红点拖拽动画监听器 private boolean enable; private int[] explosionResIds = new int[]{ R.drawable.explosion_one, R.drawable.explosion_two, R.drawable.explosion_three, R.drawable.explosion_four, R.drawable.explosion_five }; // interface public void init(Context context, DropCover dropCover, DropCover.IDropCompletedListener listener) { this.isTouchable = true; this.statusBarHeight = ScreenUtil.getStatusBarHeight(context); this.dropCover = dropCover; this.dropCover.addDropCompletedListener(listener); this.listener = null; this.enable = true; LogUtil.i(TAG, "init DropManager, statusBarHeight=" + statusBarHeight); } public void initPaint() { getCirclePaint(); getTextPaint(); } public void destroy() { this.isTouchable = false; this.statusBarHeight = 0; this.dropCover.removeAllDropCompletedListeners(); this.dropCover = null; this.currentId = null; this.textPaint = null; this.textYOffset = 0; this.circlePaint = null; this.enable = false; LogUtil.i(TAG, "destroy DropManager"); } public boolean isEnable() { return enable; } public boolean isTouchable() { if (!enable) { return true; } return isTouchable; } public void setTouchable(boolean isTouchable) { this.isTouchable = isTouchable; if (listener != null) { if (!isTouchable) { listener.onDropBegin(); // touchable = false } else { listener.onDropEnd(); // touchable = true } } } public int getTop() { return statusBarHeight; } public void down(View fakeView, String text) { if (dropCover == null) { return; } dropCover.down(fakeView, text); } public void move(float curX, float curY) { if (dropCover == null) { return; } dropCover.move(curX, curY); } public void up() { if (dropCover == null) { return; } dropCover.up(); } public void addDropCompletedListener(DropCover.IDropCompletedListener listener) { if (dropCover != null) { dropCover.addDropCompletedListener(listener); } } public void removeDropCompletedListener(DropCover.IDropCompletedListener listener) { if (dropCover != null) { dropCover.removeDropCompletedListener(listener); } } public void setCurrentId(Object currentId) { this.currentId = currentId; } public Object getCurrentId() { return currentId; } public Paint getCirclePaint() { if (circlePaint == null) { circlePaint = new Paint(); circlePaint.setColor(Color.RED); circlePaint.setAntiAlias(true); } return circlePaint; } public TextPaint getTextPaint() { if (textPaint == null) { textPaint = new TextPaint(); textPaint.setAntiAlias(true); textPaint.setColor(Color.WHITE); textPaint.setTextAlign(Paint.Align.CENTER); textPaint.setTextSize(TEXT_SIZE); Paint.FontMetrics textFontMetrics = textPaint.getFontMetrics(); /* * drawText从baseline开始,baseline的值为0,baseline的上面为负值,baseline的下面为正值, * 即这里ascent为负值,descent为正值。 * 比如ascent为-20,descent为5,那需要移动的距离就是20 - (20 + 5)/ 2 */ textYOffset = -textFontMetrics.ascent - (-textFontMetrics.ascent + textFontMetrics.descent) / 2; } return textPaint; } public float getTextYOffset() { getTextPaint(); return textYOffset; } public int[] getExplosionResIds() { return explosionResIds; } public void setDropListener(IDropListener listener) { this.listener = listener; } }