package com.zhang.diyview;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.RectF;
import android.graphics.Paint.FontMetrics;
import android.graphics.Rect;
import android.util.AttributeSet;
import android.view.Gravity;
import android.widget.EditText;
/**
* 一个可以再editText上方显示小提示的自定义输入框
*
* @author Mr-Zhang
*
*/
public class PopEditText extends EditText {
private Context context;
private float ruleTextSize;// 字体大小
private int ruleTextColor;// 提示框内文字颜色
private String ruleText = "";// 提示框内文字内容
private Paint ruleTextPaint = new Paint();// 提示字的画笔
private int popColor;// 提示框颜色
private Paint popPaint = new Paint();// 提示框的画笔
private int popWidth;// 提示框宽
private int popHeight;// 提示框高
private int blankWidth;
private int blankHeight;
private int popPaintAlpha = 255;
private int ruleTextPaintAlpha = 255;
private RectF popRectF;
private final int PADDINTLEFT = 50;
private Path sanJiaoPath = new Path();
public PopEditText(Context context, AttributeSet attributeSet) {
super(context, attributeSet);
this.context = context;
init();
}
public PopEditText(Context context) {
super(context);
this.context = context;
init();
}
public PopEditText(Context context, AttributeSet attributeSet, int defStyle) {
super(context, attributeSet, defStyle);
this.context = context;
init();
}
private void initSanJiaoPath() {
sanJiaoPath.moveTo(PADDINTLEFT + 45, popHeight - 10);
sanJiaoPath.lineTo(PADDINTLEFT + 90, popHeight - 10);
sanJiaoPath.lineTo(PADDINTLEFT + 5, popHeight + 10);
sanJiaoPath.close();
}
private void initRuleTextPaint() {
// 初始化画笔 ruleTextPaint 提示文字画笔
ruleTextPaint.setColor(ruleTextColor);
ruleTextPaint.setAlpha(ruleTextPaintAlpha);
ruleTextPaint.setTextSize(ruleTextSize);
ruleTextPaint.setAntiAlias(true);
}
private void initPopPaint() {
// 初始化画笔 popPaint 提示框画笔
popPaint.setColor(popColor);
popPaint.setAlpha(popPaintAlpha);
popPaint.setAntiAlias(true);
// 设置画笔遮罩滤镜
// popPaint.setMaskFilter(new BlurMaskFilter(20,
// BlurMaskFilter.Blur.SOLID));
popWidth = getStringWidth(ruleTextPaint, ruleText) + 100;
popHeight = getStringHeigh(ruleTextPaint, ruleText) + 50;
}
/**
*
*/
private void init() {
setGravity(Gravity.BOTTOM);
setLayerType(LAYER_TYPE_SOFTWARE, null);
ruleTextColor = Color.BLACK;
popColor = Color.WHITE;
initRuleTextPaint();
initPopPaint();
initPopRectF();
popPaint.setShadowLayer(20, 0, 0, Color.GRAY);
}
private void initPopRectF() {
popRectF = new RectF(0, 0, getWidth(), getHeight());
}
@Override
protected void onDraw(Canvas canvas) {
initSanJiaoPath();
popRectF.set(5 + PADDINTLEFT, 25, popWidth - 10 + PADDINTLEFT,
popHeight - 10);
// 画圆角矩形
canvas.drawRoundRect(popRectF, 40, 40, popPaint);
// 画直角三角形
canvas.drawPath(sanJiaoPath, popPaint);
// 显示文字
canvas.drawText(ruleText, 50 + PADDINTLEFT,
popHeight - getStringBlank(ruleTextPaint, ruleText) - 25,
ruleTextPaint);
super.onDraw(canvas);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
blankWidth = getMeasuredWidth();// 获取width原值
blankHeight = getMeasuredHeight();// 获取height原值
setMeasuredDimension(blankWidth, blankHeight + popHeight);// 重设width与height
}
@Override
protected void onFocusChanged(boolean focused, int direction,
Rect previouslyFocusedRect) {
super.onFocusChanged(focused, direction, previouslyFocusedRect);
if (focused) {
// 显示气泡
if (popPaintAlpha <= 255) {
Thread showPopThread = new Thread(new ShowPop());
showPopThread.start();
}
} else {
// 气泡消失
if (popPaintAlpha >= 0) {
Thread dissPopThread = new Thread(new DissMissPop());
dissPopThread.start();
}
}
}
/**
* 显示pop
*/
class ShowPop implements Runnable {
@Override
public void run() {
for (int i = 0; i < 51; i++) {
try {
if (popPaintAlpha < 255) {
popPaintAlpha = popPaintAlpha + 5;
}
if (ruleTextPaintAlpha < 255) {
ruleTextPaintAlpha = ruleTextPaintAlpha + 5;
}
initPopPaint();
initRuleTextPaint();
postInvalidate();
Thread.sleep(5);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
/**
* 消除pop 通过控制Paint的Alpha值来控制pop的显示与隐藏
*/
class DissMissPop implements Runnable {
@Override
public void run() {
for (int i = 0; i < 51; i++) {
try {
if (popPaintAlpha > 0) {
popPaintAlpha = popPaintAlpha - 5;
}
if (ruleTextPaintAlpha > 0) {
ruleTextPaintAlpha = popPaintAlpha - 5;
}
initPopPaint();
initRuleTextPaint();
postInvalidate();
Thread.sleep(5);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
/**
* 获取字长
*
* @param paint
* @param string
* @return
*/
public int getStringWidth(Paint paint, String string) {
return (int) paint.measureText(string);
}
/**
* 获取字高
*
* @param paint
* @param string
* @return
*/
public int getStringHeigh(Paint paint, String string) {
FontMetrics fr = paint.getFontMetrics();
return (int) Math.ceil(fr.descent - fr.ascent);
}
/**
* 获取文字里面的空白部分
*
* @param paint
* @param string
* @return
*/
public int getStringBlank(Paint paint, String string) {
FontMetrics fr = paint.getFontMetrics();
return (int) Math.ceil(fr.ascent - fr.top);
}
public float getRuleTextSize() {
return ruleTextSize;
}
/**
* 设置提示文字的大小
*
* @param ruleTextSize
*/
public void setRuleTextSize(float ruleTextSize) {
this.ruleTextSize = ruleTextSize;
initRuleTextPaint();
invalidate();
}
public int getRuleTextColor() {
return ruleTextColor;
}
/**
* 设置提示的字体颜色
*
* @param ruleTextColor
*/
public void setRuleTextColor(int ruleTextColor) {
this.ruleTextColor = ruleTextColor;
initRuleTextPaint();
invalidate();
}
public String getRuleText() {
return ruleText;
}
/**
* 设置提示的文字的内容
*
* @param ruleText
*/
public void setRuleText(String ruleText) {
this.ruleText = ruleText;
initRuleTextPaint();
invalidate();
}
public int getPopColor() {
return popColor;
}
/**
* 设置提示框的颜色
*
* @param popColor
*/
public void setPopColor(int popColor) {
this.popColor = popColor;
initRuleTextPaint();
invalidate();
}
}