Android自定义View编写随机验证码_Android

很多的Android入门程序猿来说对于Android自定义View,可能都是比较恐惧的,但是这又是高手进阶的必经之路,所有准备在自定义View上面花一些功夫,多写一些文章。先总结下自定义View的步骤:
1、自定义View的属性
2、在View的构造方法中获得我们自定义的属性
[ 3、重写onMesure ]
4、重写onDraw

我把3用[]标出了,所以说3不一定是必须的,当然了大部分情况下还是需要重写的。

1、自定义View的属性,首先在res/values/  下建立一个attrs.xml , 在里面定义我们的属性和声明我们的整个样式。

<?xml version="1.0" encoding="utf-8"?>
<resources> 

 <attr name="titleText" format="string" />
 <attr name="titleTextColor" format="color" />
 <attr name="titleTextSize" format="dimension" /> 

 <declare-styleable name="CustomTitleView">
 <attr name="titleText" />
 <attr name="titleTextColor" />
 <attr name="titleTextSize" />
 </declare-styleable> 

</resources>

我们定义了字体,字体颜色,字体大小3个属性,format是值该属性的取值类型:
一共有:string,color,demension,integer,enum,reference,float,boolean,fraction,flag;不清楚的可以google一把。
然后在布局中声明我们的自定义View

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
 xmlns:tools="http://schemas.android.com/tools"
 xmlns:custom="http://schemas.android.com/apk/res/com.example.customview01"
 android:layout_width="match_parent"
 android:layout_height="match_parent" > 

 <com.example.customview01.view.CustomTitleView
 android:layout_width="200dp"
 android:layout_height="100dp"
 custom:titleText="3712"
 custom:titleTextColor="#ff0000"
 custom:titleTextSize="40sp" /> 

</RelativeLayout>

一定要引入 xmlns:custom="http://schemas.android.com/apk/res/com.example.customview01"我们的命名空间,后面的包路径指的是项目的package

2、在View的构造方法中,获得我们的自定义的样式

/**
 * 文本
 */
 private String mTitleText;
 /**
 * 文本的颜色
 */
 private int mTitleTextColor;
 /**
 * 文本的大小
 */
 private int mTitleTextSize; 

 /**
 * 绘制时控制文本绘制的范围
 */
 private Rect mBound;
 private Paint mPaint; 

 public CustomTitleView(Context context, AttributeSet attrs)
 {
 this(context, attrs, 0);
 } 

 public CustomTitleView(Context context)
 {
 this(context, null);
 } 

 /**
 * 获得我自定义的样式属性
 *
 * @param context
 * @param attrs
 * @param defStyle
 */
 public CustomTitleView(Context context, AttributeSet attrs, int defStyle)
 {
 super(context, attrs, defStyle);
 /**
 * 获得我们所定义的自定义样式属性
 */
 TypedArray a = context.getTheme().obtainStyledAttributes(attrs, R.styleable.CustomTitleView, defStyle, 0);
 int n = a.getIndexCount();
 for (int i = 0; i < n; i++)
 {
 int attr = a.getIndex(i);
 switch (attr)
 {
 case R.styleable.CustomTitleView_titleText:
 mTitleText = a.getString(attr);
 break;
 case R.styleable.CustomTitleView_titleTextColor:
 // 默认颜色设置为黑色
 mTitleTextColor = a.getColor(attr, Color.BLACK);
 break;
 case R.styleable.CustomTitleView_titleTextSize:
 // 默认设置为16sp,TypeValue也可以把sp转化为px
 mTitleTextSize = a.getDimensionPixelSize(attr, (int) TypedValue.applyDimension(
  TypedValue.COMPLEX_UNIT_SP, 16, getResources().getDisplayMetrics()));
 break; 

 } 

 }
 a.recycle(); 

 /**
 * 获得绘制文本的宽和高
 */
 mPaint = new Paint();
 mPaint.setTextSize(mTitleTextSize);
 // mPaint.setColor(mTitleTextColor);
 mBound = new Rect();
 mPaint.getTextBounds(mTitleText, 0, mTitleText.length(), mBound); 

 }

我们重写了3个构造方法,默认的布局文件调用的是两个参数的构造方法,所以记得让所有的构造调用我们的三个参数的构造,我们在三个参数的构造中获得自定义属性。

3、我们重写onDraw,onMesure调用系统提供的:

@Override
 protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec)
 {
 super.onMeasure(widthMeasureSpec, heightMeasureSpec);
 } 

 @Override
 protected void onDraw(Canvas canvas)
 {
 mPaint.setColor(Color.YELLOW);
 canvas.drawRect(0, 0, getMeasuredWidth(), getMeasuredHeight(), mPaint); 

 mPaint.setColor(mTitleTextColor);
 canvas.drawText(mTitleText, getWidth() / 2 - mBound.width() / 2, getHeight() / 2 + mBound.height() / 2, mPaint);
 }

此时的效果是:

是不是觉得还不错,基本已经实现了自定义View。但是此时如果我们把布局文件的宽和高写成wrap_content,会发现效果并不是我们的预期:

系统帮我们测量的高度和宽度都是MATCH_PARNET,当我们设置明确的宽度和高度时,系统帮我们测量的结果就是我们设置的结果,当我们设置为WRAP_CONTENT,或者MATCH_PARENT系统帮我们测量的结果就是MATCH_PARENT的长度。
所以,当设置了WRAP_CONTENT时,我们需要自己进行测量,即重写onMesure方法”:
重写之前先了解MeasureSpec的specMode,一共三种类型:

EXACTLY:一般是设置了明确的值或者是MATCH_PARENT
AT_MOST:表示子布局限制在一个最大值内,一般为WARP_CONTENT
UNSPECIFIED:表示子布局想要多大就多大,很少使用

下面是我们重写onMeasure代码:

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec)
{
 int widthMode = MeasureSpec.getMode(widthMeasureSpec);
 int widthSize = MeasureSpec.getSize(widthMeasureSpec);
 int heightMode = MeasureSpec.getMode(heightMeasureSpec);
 int heightSize = MeasureSpec.getSize(heightMeasureSpec);
 int width;
 int height ;
 if (widthMode == MeasureSpec.EXACTLY)
 {
 width = widthSize;
 } else
 {
 mPaint.setTextSize(mTitleTextSize);
 mPaint.getTextBounds(mTitle, 0, mTitle.length(), mBounds);
 float textWidth = mBounds.width();
 int desired = (int) (getPaddingLeft() + textWidth + getPaddingRight());
 width = desired;
 } 

 if (heightMode == MeasureSpec.EXACTLY)
 {
 height = heightSize;
 } else
 {
 mPaint.setTextSize(mTitleTextSize);
 mPaint.getTextBounds(mTitle, 0, mTitle.length(), mBounds);
 float textHeight = mBounds.height();
 int desired = (int) (getPaddingTop() + textHeight + getPaddingBottom());
 height = desired;
 } 

 setMeasuredDimension(width, height);
} 

现在我们修改下布局文件:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
 xmlns:tools="http://schemas.android.com/tools"
 xmlns:custom="http://schemas.android.com/apk/res/com.example.customview01"
 android:layout_width="match_parent"
 android:layout_height="match_parent" > 

 <com.example.customview01.view.CustomTitleView
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 custom:titleText="3712"
 android:padding="10dp"
 custom:titleTextColor="#ff0000"
 android:layout_centerInParent="true"
 custom:titleTextSize="40sp" /> 

</RelativeLayout>

现在的效果是:

完全复合我们的预期,现在我们可以对高度、宽度进行随便的设置了,基本可以满足我们的需求。
当然了,这样下来我们这个自定义View与TextView相比岂不是没什么优势,所有我们觉得给自定义View添加一个事件:
在构造中添加:

this.setOnClickListener(new OnClickListener()
 { 

 @Override
 public void onClick(View v)
 {
 mTitleText = randomText();
 postInvalidate();
 } 

 });
private String randomText()
 {
 Random random = new Random();
 Set<Integer> set = new HashSet<Integer>();
 while (set.size() < 4)
 {
 int randomInt = random.nextInt(10);
 set.add(randomInt);
 }
 StringBuffer sb = new StringBuffer();
 for (Integer i : set)
 {
 sb.append("" + i);
 } 

 return sb.toString();
 } 

下面再来运行:

我们添加了一个点击事件,每次让它随机生成一个4位的随机数,有兴趣的可以在onDraw中添加一点噪点,然后改写为验证码,是不是感觉很不错。

源码下载:http://xiazai.jb51.net/201610/yuanma/AndroidCustomView(jb51.net).rar

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索android
, view
验证码
自定义验证码输入view、随机验证码、java 随机验证码、js随机生成验证码图片、js随机生成验证码,以便于您获取更多的相关知识。

时间: 2024-10-24 01:20:56

Android自定义View编写随机验证码_Android的相关文章

Android自定义View实现随机验证码_Android

对于android开发来说自定义View还是一个比较重要的技能,所以在这里写一篇自定义View入门的文章,也是实现一个相对简单的随机产生验证码的功能: 自定义View主要也就分为几步 1.自定义View的属性  2.在我们的自定义的布局中获取自定义属性  3.重写onMesure方法  4.重写onDraw方法 好现在我们就一步一步的来,首先创建我们的View属性 在valuse目录下创建一个attrs.xml的文件,然后: <?xml version="1.0" encodin

Android通过自定义View实现随机验证码_Android

很多的Android入门程序猿来说对于Android自定义View,可能都是比较恐惧的,但是这又是高手进阶的必经之路,所有准备在自定义View上面花一些功夫,多写一些文章. 一.问题描述 熟悉web开发中童鞋们都知道为了防止恶意破解.恶意提交.刷票等我们在提交表单数据时,都会使用随机验证码功能.在Android应用中我们同样需要这一功能,该如何实现呢,下面我们就自定义一个随机验证码View控件实现这一需求,并且具备通用性,需要的时候在界面中直接加入这个View组件即可. 二.案例介绍 案例运行效

Android自定义View实现随机验证码

对于android开发来说自定义View还是一个比较重要的技能,所以在这里写一篇自定义View入门的文章,也是实现一个相对简单的随机产生验证码的功能: 自定义View主要也就分为几步  1.自定义View的属性  2.在我们的自定义的布局中获取自定义属性  3.重写onMesure方法  4.重写onDraw方法 好现在我们就一步一步的来,首先创建我们的View属性 在valuse目录下创建一个attrs.xml的文件,然后: <?xml version="1.0" encodi

Android自定义View绘制随机生成图片验证码_Android

本篇文章讲的是Android自定义View之随机生成图片验证码,开发中我们会经常需要随机生成图片验证码,但是这个是其次,主要还是想总结一些自定义View的开发过程以及一些需要注意的地方. 按照惯例先看看效果图: 一.先总结下自定义View的步骤: 1.自定义View的属性 2.在View的构造方法中获得我们自定义的属性 3.重写onMesure 4.重写onDraw 其中onMesure方法不一定要重写,但大部分情况下还是需要重写的 二.View 的几个构造函数 1.public CustomV

Android通过自定义View实现随机验证码

很多的Android入门程序猿来说对于Android自定义View,可能都是比较恐惧的,但是这又是高手进阶的必经之路,所有准备在自定义View上面花一些功夫,多写一些文章. 一.问题描述 熟悉web开发中童鞋们都知道为了防止恶意破解.恶意提交.刷票等我们在提交表单数据时,都会使用随机验证码功能.在Android应用中我们同样需要这一功能,该如何实现呢,下面我们就自定义一个随机验证码View控件实现这一需求,并且具备通用性,需要的时候在界面中直接加入这个View组件即可. 二.案例介绍 案例运行效

Android自定义View制作仪表盘界面_Android

前言 最近我跟自定义View杠上了,甚至说有点上瘾到走火入魔了.身为菜鸟的我自然要查阅大量的资料,学习大神们的代码,这不,前两天正好在郭神在微信公众号里推送一片自定义控件的文章--一步步实现精美的钟表界面.正适合我这种菜鸟来学习,闲着没事,我就差不多依葫芦画瓢也写了一个自定义表盘View,现在纯粹最为笔记记录下来.先展示下效果图: 下面进入正题 自定义表盘属性 老规矩,先在attrs文件里添加表盘自定义属性 <declare-styleable name="WatchView"&

Android自定义View实现打字机效果_Android

一.先来看看效果演示 二.实现原理: 这个其实不难实现,通过一个定时器不断调用TextView的setText就行了,在setText的时候播放打字的音效. 具体代码如下: import java.util.Timer; import java.util.TimerTask; import android.content.Context; import android.media.MediaPlayer; import android.text.TextUtils; import android

Android自定义View获取注册验证码倒计时按钮_Android

在Android开发中,我们不可避免的会做到注册功能,而现在的注册大多数都是用手机去注册的,那么注册的时候都会要求用获取验证码的方式去验证,我们接下来就来实战一下自定义获取验证码倒计时按钮: 1.先看效果图 2.我们涉及到的变量 //倒计时时长,可设置 /** * 倒计时时长,默认倒计时时间60秒: */ private long length = 60 * 1000; //在点击按钮之前按钮所显示的文字 /** * 在点击按钮之前按钮所显示的文字,默认是获取验证码 */ private Str

Android自定义View实现角度选择器_Android

首先来看一下Google Photos的效果 实现最终的效果: 实现思路 仔细观察这个效果,先分析构成结构,我把它分成三部分:     1.表示刻度的点     2.相应点上方的数字     3.控件中央的当前刻度与三角 可以看出,构成元素十分简单,不涉及图片,Drawable,那么只需要用Canvas画出来就好了. 接下来观察手势的操作,查看随着手指滑动,控件做出的变化,这里的变化有:      1.手指按上去时,部分区域变亮(部分区域即为可见区域)      2.随着手指滑动,相应的数字发生