最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Android自定義View繪制四位數(shù)隨機(jī)碼

 更新時(shí)間:2017年10月23日 10:11:56   作者:飛鳥96  
這篇文章主要介紹了Android自定義View繪制四位數(shù)隨機(jī)碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

現(xiàn)在有這樣一個(gè)需求,實(shí)現(xiàn)顯示隨機(jī)隨機(jī)數(shù)可能在代碼中直接很簡單的就實(shí)現(xiàn)了,但是現(xiàn)在我們直接自定義View來實(shí)現(xiàn)這個(gè)效果,那么我們來分析一波吧,我們允許開發(fā)者自己設(shè)置這個(gè)textview的大小,顏色,和初始四位隨機(jī)數(shù)的文字,那么我們需要提供自定義屬性,好吧,首先把自定義屬性的簡單使用介紹一下吧:

首先在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>

再來看看我們怎么在布局文件中的自定義控件中去使用我們自定義的屬性

<?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è)簡單的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í)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Android?Studio實(shí)現(xiàn)購買售賣系統(tǒng)

    Android?Studio實(shí)現(xiàn)購買售賣系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了Android?Studio實(shí)現(xiàn)購買售賣系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • Android實(shí)現(xiàn)頁面短信驗(yàn)證功能

    Android實(shí)現(xiàn)頁面短信驗(yàn)證功能

    這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)頁面短信驗(yàn)證功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-05-05
  • Android開發(fā)中滑動(dòng)分頁功能實(shí)例詳解

    Android開發(fā)中滑動(dòng)分頁功能實(shí)例詳解

    這篇文章主要介紹了Android開發(fā)中滑動(dòng)分頁功能,結(jié)合實(shí)例形式詳細(xì)分析了Android滑動(dòng)分頁功能的具體步驟與相關(guān)實(shí)現(xiàn)技巧,代碼中備有詳盡的注釋便于理解,需要的朋友可以參考下
    2017-10-10
  • Android仿QQ好友詳情頁下拉頂部圖片縮放效果

    Android仿QQ好友詳情頁下拉頂部圖片縮放效果

    這篇文章主要為大家詳細(xì)介紹了Android仿QQ好友詳情頁下拉頂部圖片縮放效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-12-12
  • 基于Viewpager2實(shí)現(xiàn)登錄注冊引導(dǎo)頁面

    基于Viewpager2實(shí)現(xiàn)登錄注冊引導(dǎo)頁面

    這篇文章主要為大家詳細(xì)介紹了基于Viewpager2實(shí)現(xiàn)登錄注冊引導(dǎo)頁面,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-09-09
  • Android RecyclerView區(qū)分視圖類型的Divider的實(shí)現(xiàn)

    Android RecyclerView區(qū)分視圖類型的Divider的實(shí)現(xiàn)

    本篇文章主要介紹了Android RecyclerView區(qū)分視圖類型的Divider的實(shí)現(xiàn),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-04-04
  • android使用TextView實(shí)現(xiàn)跑馬燈效果

    android使用TextView實(shí)現(xiàn)跑馬燈效果

    這篇文章主要為大家詳細(xì)介紹了android使用TextView實(shí)現(xiàn)跑馬燈效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-05-05
  • Android編程使用sax解析xml數(shù)據(jù)的方法詳解

    Android編程使用sax解析xml數(shù)據(jù)的方法詳解

    這篇文章主要介紹了Android編程使用sax解析xml數(shù)據(jù)的方法,結(jié)合實(shí)例形式詳細(xì)分析了Android使用sax解析xml數(shù)據(jù)的操作步驟及界面布局、單元測試等相關(guān)操作技巧,需要的朋友可以參考下
    2017-07-07
  • Android路由框架ARouter的使用示例

    Android路由框架ARouter的使用示例

    組件化或者模塊化開發(fā)模式,已逐漸成為熱浪的形式,使用這些模式可以讓我們程序更容易的擴(kuò)展、更方便的維護(hù)、更快捷的同步開發(fā)與更簡單的單獨(dú)調(diào)試,而ARouter的出現(xiàn)就是讓組件間、模塊間是實(shí)現(xiàn)完全的獨(dú)立。ARouter主要解決組件間、模塊間的界面跳轉(zhuǎn)問題。
    2021-06-06
  • Android App開發(fā)中將View或Drawable轉(zhuǎn)為Bitmap的方法

    Android App開發(fā)中將View或Drawable轉(zhuǎn)為Bitmap的方法

    這篇文章主要介紹了Android App開發(fā)中將View或Drawable轉(zhuǎn)為Bitmap的方法,其中View轉(zhuǎn)換時(shí)作者特別提到了getDrawingCache=null問題的解決方法,需要的朋友可以參考下
    2016-03-03

最新評論

白山市| 临邑县| 丰镇市| 庆云县| 紫金县| 汝阳县| 乳源| 黑水县| 洪雅县| 桃园市| 长白| 宁海县| 甘谷县| 霞浦县| 崇州市| 和硕县| 博白县| 错那县| 黔西| 连南| 紫云| 海晏县| 青冈县| 巴彦淖尔市| 哈巴河县| 玛曲县| 聊城市| 宁武县| 贞丰县| 武城县| 伊吾县| 澄迈县| 潍坊市| 扎囊县| 崇明县| 蒙自县| 石屏县| 常州市| 石嘴山市| 浦东新区| 南江县|