Android隨筆-自定義隨機(jī)數(shù)顯示

閑來無事,擼了一個自定義view隨機(jī)數(shù),也算是學(xué)習(xí)啦

class TestView : View {
    constructor(context: Context) : super(context) {
        init(context, null);
    }

    constructor(context: Context, attrs: AttributeSet?) : super(context, attrs) {
        init(context, attrs);
    }

    constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int) : super(context, attrs, defStyleAttr) {
        init(context, attrs);
    }

    private var textSize: Int = 0;
    private var textTest: String = "";
    private var textColor: Int = 0;
    private var mPain: Paint? = null;
    private var mBound: Rect? = null;
    private fun init(context: Context, attrs: AttributeSet?) {
        //獲取控件中包含的屬性
        val typeArray = context.obtainStyledAttributes(attrs, R.styleable.text_view);
        //分別獲取設(shè)置的值
        val indexCount = typeArray.indexCount
        (0..indexCount).map { typeArray.getIndex(it) }.forEach {
            when (it) {
                R.styleable.text_view_titleTextSize -> {
                    textSize = typeArray.getDimensionPixelSize(it, 16)
                }
                R.styleable.text_view_titleText -> {
                    textTest = typeArray.getString(it);
                }
                R.styleable.text_view_titleColor -> {
                    textColor = typeArray.getColor(it, Color.BLACK);
                }
            }
        }
        typeArray.recycle();    //此方法即使回收獲取屬性,避免內(nèi)存泄漏
        mPain = Paint();
        mPain!!.textSize = textSize.toFloat();
        mBound = Rect();
        mPain!!.getTextBounds(textTest, 0, textTest.length, mBound);
        //設(shè)置控件點擊事件
        setOnClickListener {
            textTest = randomText();
            postInvalidate();   //重新繪制該方法調(diào)用后只會調(diào)用onDraw方法
        }
    }

    /**
     * 處理布局文件中設(shè)置wrap_content時view滿屏問題
     * 系統(tǒng)默認(rèn)測量寬高為match_parent
     * MeasureSpec分為三種模式:
     * EXACTLY設(shè)置確切的值或Match_parent
     * AT_MOST布局限制在最大的值wrap_content
     * UNSPECIFIED 布局想要多大可以多大,一般為源碼所用
     */
    override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec)
        var width: Int;
        var height: Int;
        val widthMode = MeasureSpec.getMode(widthMeasureSpec);
        val widthSize = MeasureSpec.getSize(widthMeasureSpec);
        val heightMode = MeasureSpec.getMode(heightMeasureSpec);
        val heightSize = MeasureSpec.getSize(heightMeasureSpec);
        if (widthMode == MeasureSpec.EXACTLY) {
            width = widthSize;
        } else {
            mPain!!.textSize = textSize.toFloat();
            mPain!!.getTextBounds(textTest, 0, textTest.length, mBound);
            val textWidth = mBound!!.width();
            width = paddingLeft + textWidth + paddingRight;
        }
        if (heightMode == MeasureSpec.EXACTLY) {
            height = heightSize;
        } else {
            mPain!!.textSize = textSize.toFloat();
            mPain!!.getTextBounds(textTest, 0, textTest.length, mBound);
            val textHeight = mBound!!.height();
            height = paddingBottom + paddingTop + textHeight;
        }
        setMeasuredDimension(width, height);    //設(shè)置最終測量寬高
    }

    /**
     * 繪制界面方法
     * 盡量不要在view中做耗時操作
     */
    override fun onDraw(canvas: Canvas) {
        super.onDraw(canvas)
        mPain!!.color = Color.YELLOW    //繪制背景
        canvas.drawRect(0f, 0f, measuredWidth.toFloat(), measuredHeight.toFloat(), mPain);

        mPain!!.color = Color.GREEN //繪制文字
        canvas.drawText(textTest, (width / 2 - mBound!!.width() / 2).toFloat(), (height / 2 + mBound!!.height()/2).toFloat(), mPain)
    }

    private fun randomText(): String {
        val random = Random();
        var set = HashSet<Int>();
        while (set.size < 4){
            val randomInt = random.nextInt(10);
            set.add(randomInt)
        }
       val sb= StringBuffer();
        for (item in set){
            sb.append(""+item)
        }
        return sb.toString();
    }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌效诅,老刑警劉巖别渔,帶你破解...
    沈念sama閱讀 222,729評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件惨奕,死亡現(xiàn)場離奇詭異胖秒,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)惋增,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,226評論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來改鲫,“玉大人诈皿,你說我怎么就攤上這事∠窦” “怎么了稽亏?”我有些...
    開封第一講書人閱讀 169,461評論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長缕题。 經(jīng)常有香客問我截歉,道長,這世上最難降的妖魔是什么烟零? 我笑而不...
    開封第一講書人閱讀 60,135評論 1 300
  • 正文 為了忘掉前任怎披,我火速辦了婚禮胸嘁,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘凉逛。我一直安慰自己性宏,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 69,130評論 6 398
  • 文/花漫 我一把揭開白布状飞。 她就那樣靜靜地躺著毫胜,像睡著了一般。 火紅的嫁衣襯著肌膚如雪诬辈。 梳的紋絲不亂的頭發(fā)上酵使,一...
    開封第一講書人閱讀 52,736評論 1 312
  • 那天,我揣著相機(jī)與錄音焙糟,去河邊找鬼口渔。 笑死,一個胖子當(dāng)著我的面吹牛穿撮,可吹牛的內(nèi)容都是我干的缺脉。 我是一名探鬼主播,決...
    沈念sama閱讀 41,179評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼悦穿,長吁一口氣:“原來是場噩夢啊……” “哼攻礼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起栗柒,我...
    開封第一講書人閱讀 40,124評論 0 277
  • 序言:老撾萬榮一對情侶失蹤礁扮,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后瞬沦,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體太伊,經(jīng)...
    沈念sama閱讀 46,657評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,723評論 3 342
  • 正文 我和宋清朗相戀三年逛钻,在試婚紗的時候發(fā)現(xiàn)自己被綠了倦畅。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,872評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡绣的,死狀恐怖叠赐,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情屡江,我是刑警寧澤芭概,帶...
    沈念sama閱讀 36,533評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站惩嘉,受9級特大地震影響罢洲,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,213評論 3 336
  • 文/蒙蒙 一惹苗、第九天 我趴在偏房一處隱蔽的房頂上張望殿较。 院中可真熱鬧,春花似錦桩蓉、人聲如沸淋纲。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,700評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽洽瞬。三九已至,卻和暖如春业汰,著一層夾襖步出監(jiān)牢的瞬間伙窃,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,819評論 1 274
  • 我被黑心中介騙來泰國打工样漆, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留为障,地道東北人。 一個月前我還...
    沈念sama閱讀 49,304評論 3 379
  • 正文 我出身青樓放祟,卻偏偏與公主長得像鳍怨,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子舞竿,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,876評論 2 361

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,332評論 25 707
  • 你見沒見過那種長得很妖艷的女孩?一看就不是正經(jīng)人家出生的那種窿冯。 我有一個家境不錯的朋友骗奖,大學(xué)就讀的學(xué)校是省里出了名...
    BIindly閱讀 813評論 22 16
  • 中心小學(xué) 502 代旭曼 2018年二月十八日 第十五篇 ...
    哈哈涂涂閱讀 143評論 0 0
  • 一葉東吳的舞步, 用漂泊的角度醒串, 拼湊夢的輕忽执桌, 聽,霓虹里二胡的低訴芜赌。 一根青筱的聲音仰挣, 用和鳴的竹琴, 輕敲心...
    茗香酒影閱讀 100評論 2 1
  • “活到老缠沈,學(xué)到老”是一種信念膘壶、一種執(zhí)行力。 不知道讀書的大人們洲愤,是否有這樣的過程:每聽一次課程颓芭,都會做好筆記,有些...
    妙丫丫POI閱讀 177評論 0 0