Android登录实例——计时显示“隐视密码*”

本文介绍如何在Android应用中实现一个登录功能,通过倒计时短暂显示密码,提高用户体验。用户长按小眼图标后,密码会在2秒内变为明文,方便检查错误。教程包括创建倒计时内部类、自定义长按事件以及在触发窗口中调用这些功能。

利用倒计时类短暂显视“隐视密码*”

一、前言

        用户体验度是经久不息的话题,学习、继承。

        多数密码框的输入采用密文“*”代为显示,这很大提高了安全度,但有些时候,设置的密码特别的长,如果输错,难以知道是其中哪个位置错了(主要是倒数第几个错了),那就可以只删除错误及其后的地方,接着前面的继续输;或仅仅改正那么一两个错误。完成正确输入。能考虑的尽量考虑,能做到的努怒力去做到,提高用户体验度。

效果如下图,点击/长按小眼2秒,密码由*变为明码(输入的字母或数字):上与下同(上面是“首次输入”,下面是“再次密码确认”)

    

只需要三个步骤:

(1)新建一个”倒计时的内部类“;

(2)新建一个“自定义 长按/长点击 事件”类;

(3)在我们触发窗口调用。

二、内部类继承倒计时类,重写里面的onTick()和onFinish()方法,实现短暂的复现明码密码(显视密码)。

        /* 
	 * 定义一个倒计时的内部类
	 * 
	 *  @param millisInFuture 总时长
	 *  @param countDownInterval 时间间隔
	 *  @param id 使用倒计时的控件id
	 *  */
	class TimeCount extends CountDownTimer {
		private int id;

		public TimeCount(long millisInFuture, long countDownInterval, int id) {
			super(millisInFuture, countDownInterval);// 参数依次为总时长,和计时的时间间隔
			// 传入控件的id
			this.id = id;
		}

		@Override
		public void onFinish() {// 计时完毕时触发
			// 密码输入框
			textView = (TextView) findViewById(id);
			// 密码隐视
			textView.setTransformationMethod(PasswordTransformationMethod
					.getInstance());
		}

		@Override
		public void onTick(long millisUntilFinished) {// 计时过程显示
			// 密码输入框
			textView = (TextView) findViewById(id);
			// 密码可视
			textView.setTransformationMethod(HideReturnsTransformationMethod
					.getInstance());

		}
		

	}

三、我们需要在用户长按”显视密码“按钮时,才触发密码的明码短暂显示:因而,需要建立一个”自定义 长按/长点击 事件类“

package com.cn.example.eventhandling;

import android.content.Context;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewConfiguration;

/**
 * 自定义 长按/长点击 事件类
 * 
 * @author WQB
 * 
 */
public class LongPressView extends View {
	private static final String TAG = "LongPressView";

	private int mLastMotionX, mLastMotionY;
	private boolean isMoved;
	// 长按的runnable
	private Runnable mLongPressRunnable;
	// 移动的阈值
	private static final int TOUCH_SLOP = 20;

	public LongPressView(final Context context) {
		super(context);

		mLongPressRunnable = new Runnable() {
			@Override
			public void run() {

				Log.i(TAG, "mLongPressRunnable excuted");

				performLongClick(); // 执行长按事件(如果有定义的话)
			}
		};
	}

	/**
	 * 
	 * 1)在down的时候,让一个Runnable在设定时间后执行, 如果设定时间到了,没有移动超过定义的阈值,也没有释放,则触发长按事件
	 * 
	 * 2)在移动超过阈值和释放之后,会将Runnable从事件队列中remove掉,长按事件也就不会再触发了
	 */
	public boolean dispatchTouchEvent(MotionEvent event) {
		int x = (int) event.getX();
		int y = (int) event.getY();

		switch (event.getAction()) {
		case MotionEvent.ACTION_DOWN:

			mLastMotionX = x;
			mLastMotionY = y;
			isMoved = false;
			/*
			 * 将mLongPressRunnable放进任务队列中,到达设定时间后开始执行 这里的长按时间采用系统标准长按时间
			 */
			postDelayed(mLongPressRunnable,
					ViewConfiguration.getLongPressTimeout());
			break;
		case MotionEvent.ACTION_MOVE:

			if (isMoved)
				break;

			if (Math.abs(mLastMotionX - x) > TOUCH_SLOP
					|| Math.abs(mLastMotionY - y) > TOUCH_SLOP) {
				// 移动超过阈值,则表示移动了
				isMoved = true;
				removeCallbacks(mLongPressRunnable);
			}
			break;
		case MotionEvent.ACTION_UP:
			// 释放了
			removeCallbacks(mLongPressRunnable);
			break;
		}
		return true;
	}
}

四、在我们触发窗口调用:(按钮的绑定事件中)

import com.cn.example.eventhandling.LongPressView;

public class MainActivity extends ActionBarActivity {
	
	// 声明并定义‘倒计时内部类’对象
	public TimeCount timeCount;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
	
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
	
		// 明码显示密码
		// 自定义 长按/长点击 事件类
		View mLongPressViewOne = new LongPressView(this);
		// 获取显视控件 visualBtn为控件id
		mLongPressViewOne = (Button) findViewById(R.id.visualBtn);
		mLongPressViewOne.setOnLongClickListener(new OnLongClickListener() {
			@Override
			public boolean onLongClick(View v) {
				// 传入控件id,调用成员变量,内部类,获取倒计时对象
				timeCount = new TimeCount(3000, 1000, R.id.passwordText);
				// 开始倒计时
				timeCount.start();
	
				return false;
			}
	
		});
	}
}

Yes,finish.

运用于项目:便捷简洁的企业官网

评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值