Android自定義View繪制四位數(shù)隨機(jī)碼
現(xiàn)在有這樣一個需求,實(shí)現(xiàn)顯示隨機(jī)隨機(jī)數(shù)可能在代碼中直接很簡單的就實(shí)現(xiàn)了,但是現(xiàn)在我們直接自定義View來實(shí)現(xiàn)這個效果,那么我們來分析一波吧,我們允許開發(fā)者自己設(shè)置這個textview的大小,顏色,和初始四位隨機(jī)數(shù)的文字,那么我們需要提供自定義屬性,好吧,首先把自定義屬性的簡單使用介紹一下吧:
首先在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.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>
關(guān)鍵的兩句代碼:
xmlns:custom=”http://schemas.android.com/apk/res/com.qianmo.VerificationCode” 添加自定義的空間名,com.qianmo.VerificationCode使我們的包名,使用是以custom:開頭 ,例如:custom:titleTextSize
現(xiàn)在自定義的屬性搞定了,開始我們的自定義View吧,首先選擇,我們繼承的是View還是ViewGroup,很明顯,這次我們是一個簡單的View,所以選擇繼承View,下面直接貼出來代碼了,每一步代碼里面都很詳細(xì),就不多給大家解釋了
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.
* 用于實(shí)現(xiàn)獲取隨機(jī)碼
*/
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(); //初始化顯示的數(shù)字
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:
//設(shè)置默認(rèn)大小為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);
/**
* 模仿點(diǎn)擊換驗(yàn)證碼
*/
this.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View view) {
mTitleText = randomText();
postInvalidate();
}
});
}
/**
* 獲取四位隨機(jī)數(shù)驗(yàn)證碼
*
* @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) {
/**
* 處理當(dāng)寬高都是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) {
/**
* 繪制文字和矩形
*/
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);
}
}
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- android端實(shí)現(xiàn)驗(yàn)證碼隨機(jī)生成功能
- Android 獲取隨機(jī)驗(yàn)證碼功能示例
- android隨機(jī)生成圓形云標(biāo)簽效果
- Android自定義wheelview隨機(jī)選號效果
- Android隨機(jī)生成驗(yàn)證碼
- Android自定義View編寫隨機(jī)驗(yàn)證碼
- Android自定義View繪制隨機(jī)生成圖片驗(yàn)證碼
- Android自定義View實(shí)現(xiàn)隨機(jī)驗(yàn)證碼
- Android通過自定義View實(shí)現(xiàn)隨機(jī)驗(yàn)證碼
- Android自定義控件深入學(xué)習(xí) Android生成隨機(jī)驗(yàn)證碼
相關(guān)文章
Android?Studio實(shí)現(xiàn)購買售賣系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了Android?Studio實(shí)現(xiàn)購買售賣系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-02-02
Android實(shí)現(xiàn)頁面短信驗(yàn)證功能
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)頁面短信驗(yàn)證功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-05-05
基于Viewpager2實(shí)現(xiàn)登錄注冊引導(dǎo)頁面
這篇文章主要為大家詳細(xì)介紹了基于Viewpager2實(shí)現(xiàn)登錄注冊引導(dǎo)頁面,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-09-09
Android RecyclerView區(qū)分視圖類型的Divider的實(shí)現(xiàn)
本篇文章主要介紹了Android RecyclerView區(qū)分視圖類型的Divider的實(shí)現(xiàn),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-04-04
android使用TextView實(shí)現(xiàn)跑馬燈效果
這篇文章主要為大家詳細(xì)介紹了android使用TextView實(shí)現(xiàn)跑馬燈效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2020-05-05
Android編程使用sax解析xml數(shù)據(jù)的方法詳解
這篇文章主要介紹了Android編程使用sax解析xml數(shù)據(jù)的方法,結(jié)合實(shí)例形式詳細(xì)分析了Android使用sax解析xml數(shù)據(jù)的操作步驟及界面布局、單元測試等相關(guān)操作技巧,需要的朋友可以參考下2017-07-07
Android App開發(fā)中將View或Drawable轉(zhuǎn)為Bitmap的方法
這篇文章主要介紹了Android App開發(fā)中將View或Drawable轉(zhuǎn)為Bitmap的方法,其中View轉(zhuǎn)換時作者特別提到了getDrawingCache=null問題的解決方法,需要的朋友可以參考下2016-03-03

