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();
}
}
没有合适的资源?快使用搜索试试~ 我知道了~
带有提示框的EditText
共1个文件
java:1个
需积分: 10 19 下载量 93 浏览量
2016-02-22
14:30:29
上传
评论
收藏 2KB ZIP 举报
温馨提示
自定义的EditText,具体实现效果:当控件获取焦点的时候,在其上方会显示开发者所设定的输入规则
资源推荐
资源详情
资源评论
收起资源包目录
PopEditText.zip (1个子文件)
PopEditText.java 7KB
共 1 条
- 1
资源评论
踏破铁鞋5寻花
- 粉丝: 4
- 资源: 1
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功