通过自定义View绘制显示密码按钮,当点击密码按钮的时候调用setInputType来更改属性。
package com.finals.view; import com.example.test.R; import android.content.Context; import android.content.res.TypedArray; import android.graphics.Bitmap; import android.graphics.Bitmap.Config; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.Paint.Style; import android.graphics.RectF; import android.graphics.drawable.Drawable; import android.util.AttributeSet; import android.view.MotionEvent; import android.view.inputmethod.EditorInfo; import android.widget.EditText; public class PassEditText extends EditText { int mThumbWidth; int mThumbHeight; int offsetX; int offsetY; boolean isShowPass = false; Drawable mThumbDrawable; Bitmap mThumbDefault; public PassEditText(Context context, AttributeSet attrs) { super(context, attrs); InitDrawable(context, attrs); } public PassEditText(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); InitDrawable(context, attrs); } private void InitDrawable(Context context, AttributeSet attrs) { float density = context.getResources().getDisplayMetrics().density; TypedArray mTypedArray = context.obtainStyledAttributes(attrs, R.styleable.windows); mThumbDrawable = mTypedArray.getDrawable(R.styleable.windows_thumb); mThumbWidth = (int) mTypedArray.getDimension(R.styleable.windows_thumb_width, 20 * density); mThumbHeight = (int) mTypedArray.getDimension(R.styleable.windows_thumb_height, 20 * density); if (mThumbDrawable == null) { mThumbDefault = getThumbDefault(); } else { mThumbDrawable.setBounds(0, 0, (int) mThumbWidth, (int) mThumbHeight); } mTypedArray.recycle(); if (getInputType() != (EditorInfo.TYPE_TEXT_VARIATION_PASSWORD | EditorInfo.TYPE_CLASS_TEXT)) { isShowPass = true; } } @Override public int getCompoundPaddingRight() { return super.getCompoundPaddingRight() + mThumbWidth; } @Override public void draw(Canvas canvas) { super.draw(canvas); drawThumb(canvas); } void drawThumb(Canvas canvas) { offsetX = getWidth() - mThumbWidth - getPaddingRight(); offsetY = (getHeight() - mThumbHeight) / 2; if (mThumbDrawable != null) { canvas.save(); canvas.translate(getScrollX() + offsetX, getScrollY() + offsetY); mThumbDrawable.draw(canvas); canvas.restore(); } else if (mThumbDefault != null) { canvas.drawBitmap(mThumbDefault, getScrollX() + offsetX, getScrollY() + offsetY, null); } } @Override public boolean onTouchEvent(MotionEvent event) { int action = event.getAction(); switch (action) { case MotionEvent.ACTION_DOWN: checkThumb(event); break; default: break; } return super.onTouchEvent(event); } void checkThumb(MotionEvent event) { float x = event.getX(); float y = event.getY(); if (x > offsetX && x < offsetX + mThumbWidth && y > offsetY && y < offsetY + mThumbHeight) { if (!isShowPass) { isShowPass = true; this.setInputType(EditorInfo.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD); } else { isShowPass = false; this.setInputType(EditorInfo.TYPE_TEXT_VARIATION_PASSWORD | EditorInfo.TYPE_CLASS_TEXT); } } } @Override protected void onAttachedToWindow() { if (mThumbDrawable == null) { mThumbDefault = getThumbDefault(); } super.onAttachedToWindow(); } @Override protected void onDetachedFromWindow() { if (mThumbDefault != null) { mThumbDefault.recycle(); mThumbDefault = null; } super.onDetachedFromWindow(); } /** * 创建默认图片 * * @return */ private Bitmap getThumbDefault() { float density = getContext().getResources().getDisplayMetrics().density; int stokenWidth = (int) (3 * density); Paint mPaint = new Paint(); mPaint.setColor(Color.BLACK); mPaint.setStyle(Style.FILL); mPaint.setAntiAlias(true); Bitmap mBitmap = Bitmap.createBitmap(mThumbWidth, mThumbHeight, Config.ARGB_4444); Canvas mCanvas = new Canvas(mBitmap); mCanvas.drawCircle(mThumbWidth / 2, mThumbHeight / 2, mThumbWidth * 0.30F - stokenWidth, mPaint); mPaint.setStyle(Style.STROKE); mPaint.setStrokeWidth(stokenWidth); RectF oval = new RectF(stokenWidth, stokenWidth, mThumbWidth - stokenWidth, mThumbHeight - stokenWidth); mCanvas.drawArc(oval, -175, 170, false, mPaint); return mBitmap; } public boolean isShowPassword() { return isShowPass; } }
[Android]实现带显示密码按钮的EditText(无内存泄露)
原文:http://blog.csdn.net/windowsxp2014/article/details/45271517