一、 attrs.xml 添加新的属性样式

                        

二、java代码,设置新的文本框信息

package com.autonavi.yuexing.view;import com.autonavi.xmgd.icar2.R;import android.content.Context;import android.content.res.TypedArray;import android.graphics.Canvas;import android.graphics.Rect;import android.graphics.drawable.Drawable;import android.text.Editable;import android.text.TextUtils;import android.text.TextWatcher;import android.util.AttributeSet;import android.view.MotionEvent;import android.view.View;import android.widget.EditText;import android.widget.ImageView;public class EditTextEx extends EditText {private Context mContext;private Drawable mDelBk;private int mDelOffset;private ImageView mDelButton;private boolean mDelButtonFocused;public EditTextEx(Context context) {super(context);mContext = context;}public EditTextEx(Context context, AttributeSet attrs) {super(context, attrs);mContext = context;TypedArray a = context.obtainStyledAttributes(attrs,R.styleable.EditTextEx);mDelBk = a.getDrawable(R.styleable.EditTextEx_delBk);mDelOffset = a.getDimensionPixelSize(R.styleable.EditTextEx_delOffset,8);a.recycle();this.addTextChangedListener(mEditWatcher);creatDelbutton(mContext);}private void creatDelbutton(Context context) {mDelButton = new ImageView(context);mDelButton.setBackgroundColor(0x00000000);mDelButton.setImageDrawable(mDelBk);mDelButton.setOnClickListener(mDelButtonClick);checkDelButton();}public void setDelButtonVisibility(int visibility) {mDelButton.setVisibility(visibility);invalidate();}OnClickListener mDelButtonClick = new OnClickListener() {@Overridepublic void onClick(View v) {setText("");invalidate();}};TextWatcher mEditWatcher = new TextWatcher() {@Overridepublic void onTextChanged(CharSequence s, int start, int before,int count) {}@Overridepublic void beforeTextChanged(CharSequence s, int start, int count,int after) {}@Overridepublic void afterTextChanged(Editable s) {checkDelButton();}};private void checkDelButton() {String textEdit = getText().toString();mDelButton.setVisibility(TextUtils.isEmpty(textEdit) ? View.GONE: View.VISIBLE);}public void setDelDrawable(Drawable drawable) {mDelBk = drawable;mDelButton.setBackgroundColor(0x00000000);mDelButton.setImageDrawable(mDelBk);invalidate();}public Drawable getDelDrawable() {return mDelBk;}public void setDelOff(int offset) {mDelOffset = offset;}public int getDelOff() {return mDelOffset;}@Overridepublic int getCompoundPaddingRight() {Rect paddingBk = new Rect();getBackground().getPadding(paddingBk);return super.getCompoundPaddingRight() + mDelButton.getWidth()+ mDelOffset - paddingBk.right;}@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {mDelButton.measure(0, 0);super.onMeasure(widthMeasureSpec, heightMeasureSpec);}@Overrideprotected void onLayout(boolean changed, int left, int top, int right,int bottom) {super.onLayout(changed, left, top, right, bottom);int edit_w = getWidth();int edit_h = getHeight();int delButton_w = mDelButton.getMeasuredWidth();int delButton_h = mDelButton.getMeasuredHeight();mDelButton.layout(edit_w - delButton_w - mDelOffset,(edit_h - delButton_h) / 2, edit_w - mDelOffset, edit_h- (edit_h - delButton_h) / 2);}@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);if (mDelButton.getVisibility() != View.GONE&& mDelButton.getVisibility() != View.INVISIBLE) {canvas.save();canvas.translate(getScrollX() + mDelButton.getLeft(), getScrollY()+ mDelButton.getTop());mDelButton.draw(canvas);canvas.restore();}}@Overridepublic boolean dispatchTouchEvent(MotionEvent event) {if (event.getAction() == MotionEvent.ACTION_DOWN) {if (isDelButtonHit(event)) {mDelButtonFocused = true;if (!mDelButton.isPressed()) {mDelButton.setPressed(true);invalidate();}return true;}} else if (event.getAction() == MotionEvent.ACTION_MOVE) {if (mDelButtonFocused) {boolean hit = isDelButtonHit(event);if (mDelButton.isPressed() != hit) {mDelButton.setPressed(hit);invalidate();}return true;}} else if (event.getAction() == MotionEvent.ACTION_CANCEL) {if (mDelButtonFocused) {boolean hit = isDelButtonHit(event);if (mDelButton.isPressed() != hit) {mDelButton.setPressed(hit);invalidate();}mDelButtonFocused = false;return true;}} else if (event.getAction() == MotionEvent.ACTION_UP) {if (mDelButtonFocused) {if (mDelButton.isPressed() && mDelButtonClick != null)mDelButtonClick.onClick(mDelButton);if (mDelButton.isPressed()) {mDelButton.setPressed(false);invalidate();}mDelButtonFocused = false;return mDelButton.isPressed();}}return super.dispatchTouchEvent(event);}private boolean isDelButtonHit(MotionEvent event) {final Rect frame = new Rect();mDelButton.getHitRect(frame);return frame.contains((int) event.getX(), (int) event.getY());}}

三、布局文件调用自定义文本框

        



更多相关文章

  1. Android(安卓)属性动画中心点无限循环
  2. Android之View的视图测量过程
  3. Android(安卓)关机(reboot)流程
  4. android 如何调用系统自带的程序安装器安装程序
  5. ADT-abundle-使用过程中不断出现的错误
  6. android点滴3
  7. 【工具类】Android判断SD卡状态
  8. AndroidManifest.xml文件详解(supports-screens)
  9. 出错:PhoneFactory.getDefaultPhone must be called from Looper

随机推荐

  1. Mysql数据库从5.6.28版本升到8.0.11版本
  2. Mysql 常用的时间日期及转换函数小结
  3. Mysql注入中的outfile、dumpfile、load_f
  4. MYSQL的存储过程和函数简单写法
  5. win10 下安装mysql服务器社区版本mysql 5
  6. 教你如何在Mac上安装mysql数据库
  7. MySql中如何使用 explain 查询 SQL 的执
  8. Mac 下 MySQL5.7.22的安装过程
  9. JDBC连接MySQL5.7的方法
  10. MySQL 8 新特性之Invisible Indexes