package com.mjj.clearedittext;
import android.animation.ValueAnimator;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.PaintFlagsDrawFilter;
import android.graphics.PixelFormat;
import android.graphics.Rect;
import android.graphics.drawable.Drawable;
import android.support.v4.content.ContextCompat;
import android.support.v4.graphics.drawable.DrawableCompat;
import android.support.v7.widget.AppCompatEditText;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.animation.Animation;
import android.view.animation.CycleInterpolator;
import android.view.animation.TranslateAnimation;
/**
* Created by 家杰 on 2015/11/20.
*/
public class ClearEditText extends AppCompatEditText {
//按钮资源
private final int CLEAR = R.drawable.clearfill;
//动画时长
private final int ANIMATOR_TIME = 200;
//按钮左右间隔,单位DP
private final int INTERVAL = 5;
//清除按钮宽度,单位DP
private final int WIDTH_OF_CLEAR = 23;
//间隔记录
private int Interval;
//清除按钮宽度记录
private int mWidth_clear;
//右内边距
private int mPaddingRight;
//清除按钮的bitmap
private Bitmap mBitmap_clear;
//清除按钮出现动画
private ValueAnimator mAnimator_visible;
//消失动画
private ValueAnimator mAnimator_gone;
//是否显示的记录
private boolean isVisible = false;
//右边添加其他按钮时使用
private int mRight = 0;
public ClearEditText(final Context context) {
super(context);
init(context);
}
public ClearEditText(final Context context,final AttributeSet attrs) {
super(context, attrs);
init(context);
}
public ClearEditText(final Context context,final AttributeSet attrs,final int defStyleAttr) {
super(context, attrs, defStyleAttr);
init(context);
}
private void init(Context context) {
setSingleLine();
mBitmap_clear = createBitmap(CLEAR,context);
Interval = dp2px(INTERVAL);
mWidth_clear = dp2px(WIDTH_OF_CLEAR);
mPaddingRight = Interval + mWidth_clear + Interval ;
mAnimator_gone = ValueAnimator.ofFloat(1f, 0f).setDuration(ANIMATOR_TIME);
mAnimator_visible = ValueAnimator.ofInt(mWidth_clear + Interval,0).setDuration(ANIMATOR_TIME);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
//设置内边距
setPadding(getPaddingLeft(), getPaddingTop(), mPaddingRight+ mRight, getPaddingBottom());
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.setDrawFilter(new PaintFlagsDrawFilter(0, Paint.ANTI_ALIAS_FLAG | Paint.FILTER_BITMAP_FLAG));//抗锯齿
if (mAnimator_visible.isRunning()) {
int x = (int) mAnimator_visible.getAnimatedValue();
drawClear(x,canvas);
invalidate();
}else if (isVisible){
drawClear(0,canvas);
}
if(mAnimator_gone.isRunning()){
float scale = (float) mAnimator_gone.getAnimatedValue();
drawClearGone(scale, canvas);
invalidate();
}
}
/**
* 绘制清除按钮出现的图案
* @param translationX 水平移动距离
* @param canvas
*/
protected void drawClear( int translationX,Canvas canvas){
int right = getWidth()+getScrollX() - Interval - mRight +translationX;
int left = right-mWidth_clear;
int top = (getHeight()-mWidth_clear)/2;
int bottom = top + mWidth_clear;
Rect rect = new Rect(left,top,right,bottom);
canvas.drawBitmap(mBitmap_clear, null, rect, null);
}
/**
* 绘制清除按钮消失的图案
* @param scale 缩放比例
* @param canvas
*/
protected void drawClearGone( float scale,Canvas canvas){
int right = (int) (getWidth()+getScrollX()- Interval - mRight -mWidth_clear*(1f-scale)/2f);
int left = (int) (getWidth()+getScrollX()- Interval - mRight -mWidth_clear*(scale+(1f-scale)/2f));
int top = (int) ((getHeight()-mWidth_clear*scale)/2);
int bottom = (int) (top + mWidth_clear*scale);
Rect rect = new Rect(left,top,right,bottom);
canvas.drawBitmap(mBitmap_clear, null, rect, null);
}
/**
* 开始清除按钮的显示动画
*/
private void startVisibleAnimator() {
endAnaimator();
mAnimator_visible.start();
invalidate();
}
/**
* 开始清除按钮的消失动画
*/
private void startGoneAnimator() {
endAnaimator();
mAnimator_gone.start();
invalidate();
}
/**
* 结束所有动画
*/
private void endAnaimator(){
mAnimator_gone.end();
mAnimator_visible.end();
}
/**
* Edittext内容变化的监听
* @param text
* @param start
* @param lengthBefore
* @param lengthAfter
*/
@Override
protected void onTextChanged(CharSequence text, int start, int lengthBefore, int lengthAfter) {
super.onTextChanged(text, start, lengthBefore, lengthAfter);
if(text.length()>0) {
if (!isVisible) {
isVisible = true;
startVisibleAnimator();
}
}else{
if (isVisible) {
isVisible = false;
startGoneAnimator();
}
}
}
/**
* 触控执行的监听
* @param event
* @return
*/
@Override
public boolean onTouchEvent(MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_UP) {
boolean touchable = ( getWidth() - Interval - mRight - mWidth_clear < event.getX() ) && (event.getX() < getWidth() - Interval - mRight);
if (touchable) {
setError(null);
this.setText("");
}
}
return super.onTouchEvent(event);
}
/**
* 开始晃动动画
*/
public void startShakeAnimation(){
if(getAnimation() == null){
this.setAnimation(shakeAnimation(4));
}
this.startAnimation(getAnimation());
}
/**
* 晃动动画
* @param counts 0.5秒钟晃动多少下
* @return
*/
private Animation shakeAnimation(int counts){
Animation translateAnimation = new TranslateAnimation(0, 10, 0, 0);
translateAnimation.setInterpolator(new CycleInterpolator(counts));
translateAnimation.setDuration(500);
return translateAnimation;
}
/**
* 给图标染上当前提示文本的颜色并且转出Bitmap
* @param resources
* @param context
* @return
*/
public Bitmap createBitmap(int resources,Context context) {
final Drawable drawable = ContextCompat.getDrawable(context, resources);
final Drawable wrappedDrawable = DrawableCompat.wrap(drawable);
DrawableCompat.setTint(wrappedDrawable, getCurrentHintTextColor());
return drawableToBitamp(wrappedDrawable);
}
/**
* drawable转换成bitmap
* @param drawable
* @return
*/
private Bitmap drawableToBitamp(Drawable drawable)
{
int w = drawable.getIntrinsicWidth();
int h = drawable.getIntrinsicHeight();
Bitmap.Config config = drawable.getOpacity() != PixelFormat.OPAQUE ? Bitmap.Config.ARGB_8888 : Bitmap.Config.RGB_565;
Bitmap bitmap = Bitmap.createBitmap(w, h, config);
Canvas canvas = new C
没有合适的资源?快使用搜索试试~ 我知道了~
Android EditText带清空按钮&动画效果
共42个文件
xml:15个
png:8个
java:5个
5星 · 超过95%的资源 需积分: 10 138 下载量 3 浏览量
2015-11-22
17:52:07
上传
评论 3
收藏 103KB RAR 举报
温馨提示
博客地址:http://blog.csdn.net/tyzlmjj/article/details/49156765
资源推荐
资源详情
资源评论
收起资源包目录
ClearEditText.rar (42个子文件)
ClearEditText
.gitignore 98B
gradle
wrapper
gradle-wrapper.jar 49KB
gradle-wrapper.properties 236B
build.gradle 521B
gradlew.bat 2KB
gradlew 5KB
app
.gitignore 8B
build.gradle 697B
proguard-rules.pro 662B
app.iml 8KB
libs
src
test
java
com
mjj
clearedittext
ExampleUnitTest.java 328B
main
AndroidManifest.xml 685B
java
com
mjj
clearedittext
PasswordEditText.java 4KB
ClearEditText.java 9KB
MainActivity.java 1KB
res
values
styles.xml 394B
colors.xml 214B
strings.xml 79B
dimens.xml 216B
mipmap-xxhdpi
ic_launcher.png 8KB
layout
activity_main.xml 3KB
mipmap-xhdpi
ic_launcher.png 5KB
mipmap-hdpi
ic_launcher.png 3KB
drawable-xxhdpi
close.png 4KB
clearfill.png 3KB
open.png 2KB
mipmap-mdpi
ic_launcher.png 2KB
values-w820dp
dimens.xml 364B
mipmap-xxxhdpi
ic_launcher.png 10KB
androidTest
java
com
mjj
clearedittext
ApplicationTest.java 364B
gradle.properties 872B
.idea
runConfigurations.xml 564B
workspace.xml 15KB
vcs.xml 164B
misc.xml 832B
modules.xml 266B
.name 13B
copyright
profiles_settings.xml 76B
compiler.xml 686B
gradle.xml 524B
settings.gradle 16B
ClearEditText.iml 944B
共 42 条
- 1
资源评论
- xiao14919445382017-08-11还可以,测试看看
- richie6962016-08-07很好的例子,参考学习了一下,很有帮助。
- Lingli13905202016-12-026666,还有些,小问题
M家杰
- 粉丝: 80
- 资源: 13
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功