版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
【移动应用开发技术】怎么在Android中通过自定义View绘制一个四位数随机码
怎么在Android中通过自定义View绘制一个四位数随机码?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。首先在res/values文件夹下建利attrs.xml文件,由于这次我们功能决定我们要提供三个自定义属性,分别是textTitleString类型的,textColor是color类型的,textSize是dimetion类型,代码如下:<?xml
version="1.0"
encoding="utf-8"?>
<resources>
<declare-styleable
name="MyTextView">
<attr
name="titleText"
format="string"/>
<attr
name="titleTextColor"
format="color"/>
<attr
name="titleTextSize"
format="dimension"/>
</declare-styleable>
</resources>再来看看我们怎么在布局文件中的自定义控件中去使用我们自定义的属性<?xml
version="1.0"
encoding="utf-8"?>
<RelativeLayout
xmlns:android="/apk/res/android"
xmlns:custom="/apk/res/com.qianmo.VerificationCode"
xmlns:tools="/tools"
android:layout_width="match_parent"
android:layout_height="match_parent">
<com.qianmo.VerificationCode.view.MyTextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="100dp"
custom:titleText="3712"
custom:titleTextColor="#ff0000"
android:layout_centerInParent="true"
custom:titleTextSize="40sp"/>
</RelativeLayout>关键的两句代码:xmlns:custom=”/apk/res/com.qianmo.VerificationCode”添加自定义的空间名,com.qianmo.VerificationCode使我们的包名,使用是以custom:开头,例如:custom:titleTextSize现在自定义的属性搞定了,开始我们的自定义View吧,首先选择,我们继承的是View还是ViewGroup,很明显,这次我们是一个简单的View,所以选择继承View,下面直接贴出来代码了,每一步代码里面都很详细,就不多给大家解释了package
com.qianmo.VerificationCode.view;
import
android.content.Context;
import
android.content.res.TypedArray;
import
android.graphics.Canvas;
import
android.graphics.Color;
import
android.graphics.Paint;
import
android.graphics.Rect;
import
android.util.AttributeSet;
import
android.util.Log;
import
android.util.TypedValue;
import
android.view.View;
import
com.qianmo.VerificationCode.R;
import
java.util.HashSet;
import
java.util.Random;
import
java.util.Set;
/**
*
Created
by
wangjitao
on
2016/10/13
0013.
*
用于实现获取随机码
*/
public
class
MyTextView
extends
View
{
/**
*
由于是自定义的View,首先我们要确定那些属性是用户可以自己定义的
*
1,View里面显示的字
*
2,显示字的大小
*
3,显示字的颜色
*/
private
String
mTitleText;
private
int
mTitleTextColor;
private
int
mTitleTextSize;
/**
*
画笔
*/
private
Paint
mPaint;
/**
*
view的矩形背景
*/
private
Rect
mBound;
public
MyTextView(Context
context)
{
this(context,
null);
}
public
MyTextView(Context
context,
AttributeSet
attrs)
{
this(context,
attrs,
0);
}
/**
*
获得自定义的属性
*
*
@param
context
*
@param
attrs
*
@param
defStyleAttr
*/
public
MyTextView(Context
context,
AttributeSet
attrs,
int
defStyleAttr)
{
super(context,
attrs,
defStyleAttr);
/**
*
获得我们自定义的一些属性
*/
TypedArray
a
=
context.getTheme().obtainStyledAttributes(attrs,
R.styleable.MyTextView,
defStyleAttr,
0);
mTitleText
=
randomText();
//初始化显示的数字
for
(int
i
=
0;
i
<
a.getIndexCount();
i++)
{
int
attr
=
a.getIndex(i);
switch
(attr)
{
case
R.styleable.MyTextView_titleText:
mTitleText
=
a.getString(attr);
break;
case
R.styleable.MyTextView_titleTextColor:
mTitleTextColor
=
a.getColor(attr,
Color.BLACK);
break;
case
R.styleable.MyTextView_titleTextSize:
//设置默认大小为16
mTitleTextSize
=
a.getDimensionPixelSize(attr,
(int)
TypedValue.applyDimension(
TypedValue.COMPLEX_UNIT_SP,
16,
getResources().getDisplayMetrics()));
break;
}
}
//将TypedArray对象回收
a.recycle();
/**
*
初始化画笔
*/
mPaint
=
new
Paint();
mPaint.setAntiAlias(true);
mPaint.setTextSize(mTitleTextSize);
mPaint.setColor(mTitleTextColor);
mBound
=
new
Rect();
mPaint.getTextBounds(mTitleText,
0,
mTitleText.length(),
mBound);
/**
*
模仿点击换验证码
*/
this.setOnClickListener(new
OnClickListener()
{
@Override
public
void
onClick(View
view)
{
mTitleText
=
randomText();
postInvalidate();
}
});
}
/**
*
获取四位随机数验证码
*
*
@return
*/
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();
}
@Override
protected
void
onMeasure(int
widthMeasureSpec,
int
heightMeasureSpec)
{
/**
*
处理当宽高都是wrap_content的情况
*/
int
widthMode
=
MeasureSpec.getMode(widthMeasureSpec);
int
widthSize
=
MeasureSpec.getSize(widthMeasureSpec);
int
heightMode
=
MeasureSpec.getMode(heightMeasureSpec);
int
heightSize
=
MeasureSpec.getSize(heightMeasureSpec);
int
width
=
0;
int
height
=
0;
if
(widthMode
==
MeasureSpec.EXACTLY)
{
width
=
widthSize;
}
else
{
mPaint.setTextSize(mTitleTextSize);
mPaint.getTextBounds(mTitleText,
0,
mTitleText.length(),
mBound);
float
textWidth
=
mBound.width();
int
desired
=
(int)
(getPaddingLeft()
+
textWidth
+
getPaddingRight());
width
=
desired;
}
if
(heightMode
==
MeasureSpec.EXACTLY)
{
height
=
heightSize;
}
else
{
mPaint.setTextSize(mTitleTextSize);
mPaint.getTextBounds(mTitleText,
0,
mTitleText.length(),
mBound);
float
textWidth
=
mBound.height();
int
desired
=
(int)
(getPaddingTop()
+
textWidth
+
getPaddingBottom());
height
=
desired;
}
setMeasuredDimension(width,
height);
}
@Override
protected
void
onDraw(Canvas
canvas)
{
/**
*
绘
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2023年九年级生物上册期末试卷【带答案】
- 2022-2023年人教版四年级数学上册期末试卷及答案【汇编】
- 2022年人教版七年级数学上册期末模拟考试含答案
- 部编版六年级数学下册期中试卷【及参考答案】
- 2023年八年级化学上册期末考试题(及参考答案)
- 2022年部编人教版七年级数学上册期末考试题及参考答案
- 2023年部编版八年级数学下册期中考试卷(下载)
- 《小巴掌童话》阅读测试题级及答案
- 人教版七年级上册《生物》期末模拟考试(及答案)
- 新人教版四年级数学下册期中考试题(A4打印版)
- GB/T 24352-2009饲料加工设备图形符号
- GB/T 1817-2017硬质合金常温冲击韧性试验方法
- 小学三年级上册综合实践活动-.来之不易的粮食-(24张)ppt
- 预防中心静脉导管相关血流感染CLABSI考核试题及答案
- 技术核定单样本
- 六年级下册数学整理和复习《数的认识》说课稿
- VTE预防优质课件
- 走美杯第12届5年级初赛
- 《诚信合规培训》教学课件
- MDS帕金森病临床诊疗标准
- 《中国古代文学史二》考试复习题库(含答案)
评论
0/150
提交评论