Android自定義View繪制四位數(shù)隨機(jī)碼
現(xiàn)在有這樣一個(gè)需求,實(shí)現(xiàn)顯示隨機(jī)隨機(jī)數(shù)可能在代碼中直接很簡(jiǎn)單的就實(shí)現(xiàn)了,但是現(xiàn)在我們直接自定義View來實(shí)現(xiàn)這個(gè)效果,那么我們來分析一波吧,我們?cè)试S開發(fā)者自己設(shè)置這個(gè)textview的大小,顏色,和初始四位隨機(jī)數(shù)的文字,那么我們需要提供自定義屬性,好吧,首先把自定義屬性的簡(jiǎn)單使用介紹一下吧:
首先在res/values文件夾下建利attrs.xml文件,由于這次我們功能決定我們要提供三個(gè)自定義屬性,分別是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>
再來看看我們?cè)趺丛诓季治募械淖远x控件中去使用我們自定義的屬性
<?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,很明顯,這次我們是一個(gè)簡(jiǎn)單的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對(duì)象回收 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); } }
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- android端實(shí)現(xiàn)驗(yàn)證碼隨機(jī)生成功能
- Android 獲取隨機(jī)驗(yàn)證碼功能示例
- android隨機(jī)生成圓形云標(biāo)簽效果
- Android自定義wheelview隨機(jī)選號(hào)效果
- 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)文章
關(guān)于Android Fragment對(duì)回退棧的詳細(xì)理解
這篇文章主要介紹了Android Fragment的回退棧示例詳細(xì)介紹的相關(guān)資料,在Android中Fragment回退棧是由Activity管理的,每個(gè)Activity都有自己的回退棧,其中保存了已經(jīng)停止(處于后臺(tái))的Fragment實(shí)例,需要的朋友可以參考下2016-12-12mac開發(fā)android環(huán)境搭建步驟圖解
這里比較詳細(xì)的來總結(jié)下mac開發(fā)android的環(huán)境搭建步驟安裝過程,希望對(duì)一些正準(zhǔn)備配置Android開發(fā)環(huán)境的小伙伴們有一定幫助2014-01-01android 預(yù)加載進(jìn)程的實(shí)現(xiàn)方法
這篇文章主要介紹了android 預(yù)加載進(jìn)程的實(shí)現(xiàn)方法,大家需要注意清單文件中注冊(cè)并制定 android:process 要預(yù)加載的進(jìn)程,需要的朋友可以參考下2024-05-05Android通過多點(diǎn)觸控的方式對(duì)圖片進(jìn)行縮放的實(shí)例代碼
這篇文章主要介紹了Android通過多點(diǎn)觸控的方式對(duì)圖片進(jìn)行縮放的實(shí)例代碼,完成了點(diǎn)擊圖片就能瀏覽大圖的功能,并且在瀏覽大圖的時(shí)候還可以通過多點(diǎn)觸控的方式對(duì)圖片進(jìn)行縮放。2018-05-05使用SharedPreferences在Android存儲(chǔ)對(duì)象詳細(xì)代碼
這篇文章主要介紹了使用SharedPreferences在Android存儲(chǔ)對(duì)象并附上詳細(xì)代碼,下面文章內(nèi)容較少,大多以代碼的形式體現(xiàn),需要的小伙伴可以參考一下,希望對(duì)你有所幫助2021-11-11Android 8.0升級(jí)不跳轉(zhuǎn)應(yīng)用安裝頁(yè)面的解決方法
這篇文章主要為大家詳細(xì)介紹了Android 8.0升級(jí)不跳轉(zhuǎn)應(yīng)用安裝頁(yè)面的解決方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-06-06