一、 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』反射取子类、父类 属性
  3. API 25 (Android 7.1.1 API) widget.ImageView——属性分析
  4. android:taskAffinity属性的简单测试
  5. jni 获得 android 系统属性
  6. Android的contentDescription属性是什么?
  7. android设置Webview的滚动条属性

随机推荐

  1. [Android 数据库] Android数据库总结
  2. Android(安卓)studio 入门教程(案例)
  3. Android(安卓)java调用go语言,.go文件生成
  4. android菜单
  5. Android Property System | Android属性
  6. android 条形码的应用
  7. 程序猿214情人节专题----基于GitHub打造
  8. Android布局优化(一)LayoutInflate — 从布
  9. Android基础笔记(一)-快速入门
  10. 让android支持RTSP及live555分析