1,现在有这样一个需求,实现显示随机随机数可能在代码中直接很简单的就实现了,但是现在我们直接自定义View来实现这个效果,那么我们来分析一波吧,我们允许开发者自己设置这个textview的大小,颜色,和初始四位随机数的文字,那么我们需要提供自定义属性,好吧,首先把自定义属性的简单使用介绍一下吧:

首先在res/values文件夹下建利attrs.xml文件,由于这次我们功能决定我们要提供三个自定义属性,分别是textTitle String类型的,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="http://schemas.android.com/apk/res/android"xmlns:custom="http://schemas.android.com/apk/res/com.qianmo.VerificationCode"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"><com.qianmo.VerificationCode.view.MyTextViewandroid: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="http://schemas.android.com/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://设置默认大小为16mTitleTextSize = 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() {@Overridepublic 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();}@Overrideprotected 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);}@Overrideprotected 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);}
}

ok,最后看一下我们的效果图

转载于:https://www.cnblogs.com/wjtaigwh/p/5957543.html

Android -- 自定义View小Demo,绘制四位数随机码(一)相关推荐

  1. 精通Android自定义View(十二)绘制圆形进度条

    1 绘图基础简析 1 精通Android自定义View(一)View的绘制流程简述 2 精通Android自定义View(二)View绘制三部曲 3 精通Android自定义View(三)View绘制 ...

  2. android自定义虚线,Android自定义view的方式绘制虚线

    Android自定义view绘制虚线 最近项目中有个需求,通过自定义view的方式绘制虚线 别的不多说先看一眼效果 这个需求在我们的开发中应该是一个很常见的需求了吧,有人会说有更简单的实现方式,对,但 ...

  3. Android自定义View之Paint绘制文字和线

    Android自定义View系列 Android自定义View注意事项 Android自定义View之图像的色彩处理 Android自定义View之Canvas Android自定义View之轻松实现 ...

  4. android多行文字正中间显示,Android自定义View五(绘制文本大小、多行多列居中)...

    一.绘制文本 在Canvas中绘制文本,使用前面文章的坐标系 1.drawText的几种方法 public void drawText (String text, float x, float y, ...

  5. Android自定义View之Canvas绘制基本图形(二)-- 自定义时钟

    前言 前面一篇主要是巩固Cavas绘制基本图形(如直线,矩形,点等等),今天同样是复习Cavas画圆,圆弧,等等,但是今天会多了一个path,以及Canvas画布的旋转.缩放.平移等等,画布的保存(s ...

  6. 【Android 自定义 View】--> 绘制时钟(表)效果

    前言 本篇文章主要介绍使用自定义 View 来实现时钟效果,灵活地使用 Android 的 Canvas,Paint, Path 的 API 以及理清 Canvas 的 save 和 restore ...

  7. android 自定义多边形,Android:自定义view之Canvas绘制图形

    前面讲解了onMeasure,接下来讲解onDraw,onDraw主要就是绘制,也就是我们真正关心的部分,使用的是Canvas绘图. @Override protected void onDraw(C ...

  8. 精通Android自定义View(十四)绘制水平向右加载的进度条

    1引言 1 精通Android自定义View(一)View的绘制流程简述 2 精通Android自定义View(二)View绘制三部曲 3 精通Android自定义View(三)View绘制三部曲综合 ...

  9. Android自定义View注意事项

    Android自定义View系列 Android自定义View之Paint绘制文字和线 Android自定义View之图像的色彩处理 Android自定义View之Canvas Android自定义V ...

最新文章

  1. ubuntu设置不同的eigen版本
  2. foxpro被什么软件取代_MATLAB可以被取代么?可以被什么软件取代?
  3. Scala集合的常用方法:sum/max/min/product
  4. JAVA网络编程之Socket
  5. 网络经济与企业管理(第 1 章:企业管理概论)
  6. OC 观察者模式(通知中心,KVO)
  7. 活动推荐|互联网3.0与区块链新时代论坛(北京)
  8. java web容器_java-实现一个简单的java Web容器
  9. DHTML【11】--DOM
  10. ROS-MikroTik-RouterOS-培训认证各种证书
  11. 爬了7000+条内衣信息,只为探究妹纸们的偏好!
  12. redis集群-局域网中两台电脑通信
  13. java jsp聊天系统_jsp 在线客服聊天源码(websocket)
  14. 基于C++的BNN推理
  15. muti-thread fork
  16. 记录: 去掉String的最后一个逗号
  17. android 音量调节框,「Best Volume Widget」手机桌面独立音量调节小工具 (Android)...
  18. Mathorcup数学建模竞赛第六届-【妈妈杯】A题:淡水养殖池塘水华发生及池水自净化研究(附一等奖获奖论文、matlab和SAS代码)
  19. Elementary Sorts
  20. 岭南学院python课程作业2-1

热门文章

  1. 关于一个跨域的小问题
  2. Docker系列五~docker安装php-fpm
  3. Session 实现、配置与使用详解
  4. netty的使用场景,线程模型以及如何在springboot中使用netty?
  5. Rust的所有权(Ownership)
  6. Onvif开发之代码框架生成篇
  7. 一文读懂 etcd 的 mvcc 实现
  8. imageview设置在最顶层_发电厂烟囱障碍照明设置要求(注电单选484)
  9. nacos服务注册与发现
  10. 物流×科技,易流如何用IoT技术加速物流业数字化升级?...