Android 自定義控件之騰訊安全衛(wèi)士掃描

該文章同步發(fā)布到CSDN,轉(zhuǎn)載請(qǐng)注明出處

簡(jiǎn)書:http://blog.csdn.net/ling9400/article/details/70182583

這篇博客應(yīng)該算是博主真正意義上的第一篇自定義控件的博客魔熏,所以寫出這個(gè)控件之后第一時(shí)間進(jìn)行記錄,廢話不多說(shuō)钩杰,先上效果圖:


這里寫圖片描述

這個(gè)圖在我CSDN博客的上一篇文章中已經(jīng)上過(guò)了的逝慧,在上篇文章中就說(shuō)明要做出這個(gè)效果。
自定義控件無(wú)非就是那幾個(gè)步驟:

  1. onMeasure
  2. onLayout(ViewGroup中會(huì)重寫苔严,這里直接集成View甩恼,所以不會(huì)重寫)
  3. onDraw(所有自定義View的重要步驟)

現(xiàn)在根據(jù)上面的幾個(gè)步驟簡(jiǎn)要說(shuō)明一下:
首先蟀瞧,看下屬性:


這里寫圖片描述

然后是控件的構(gòu)造方法以及初始化操作和自定義屬性的取值:


這里寫圖片描述

自定義屬性在這:


這里寫圖片描述

然后在是重點(diǎn)步驟————onMeasure


這里寫圖片描述

onLayout這里就不需要重寫了沉颂,所以直接來(lái)到onDraw,直接上代碼

protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    //先畫兩個(gè)外圓
    mPaint.setStrokeWidth(1);
    mPaint.setColor(Color.BLUE);
    canvas.drawCircle(mWidth/2, mHeight/2, wRadius, mPaint);
    canvas.drawCircle(mWidth/2, mHeight/2, nRadius, mPaint);
    //背景圖片
    Bitmap bgMap = BitmapFactory.decodeResource(getResources(), mapBg);
    float scaleWidth = (float) (nRadius*2 - 80)/bgMap.getWidth();
    float scaleHeight = (float) (nRadius*2 - 50)/bgMap.getHeight();
    //縮放圖片
    Matrix mMatrix = new Matrix();
    mMatrix.postScale(scaleWidth, scaleHeight);
    Bitmap bgNew = Bitmap.createBitmap(bgMap, 0,0, bgMap.getWidth(), bgMap.getHeight(), mMatrix, true);
    canvas.drawBitmap(bgNew, mWidth/2 - bgNew.getWidth()/2 , mHeight/2 - bgNew.getHeight()/2 , mPaint);
    //縮放掃描的背景圖片
    Matrix scanMa = new Matrix();
    Bitmap scaningMap = BitmapFactory.decodeResource(getResources(), mapScaning);
    scanMa.postScale(0.8f, 0.8f);
    Bitmap newScan = Bitmap.createBitmap(scaningMap,0,0,scaningMap.getWidth(),scaningMap.getHeight(),scanMa, true);`

    //滾動(dòng)圓滾動(dòng)的矩形
    mPaint.setStrokeWidth(gWidth);
    loadingRectF = new RectF(mWidth/2 - gRadius, mWidth/2 -gRadius,
            mWidth/2 +gRadius, mWidth/2 + gRadius);

    //掃描bitmap
    if(!isFirst){
        isFirst = true;
        scanRect = new Rect(mWidth/2 - gRadius + 20, mWidth/2 - gRadius + 20,
                mWidth/2 +gRadius - 20, mWidth/2 + gRadius - 20);
    }
    //開(kāi)始掃描
    if(isStart && !isEnd){
        canvas.drawBitmap(newScan, mWidth/2 - newScan.getWidth()/2, mHeight/2 - newScan.getHeight()/2, mPaint);

        mPaint.setColor(Color.RED);
        //畫三個(gè)滾動(dòng)的圓弧
        canvas.drawArc(loadingRectF, topDegree, arc, false, mPaint);
        canvas.drawArc(loadingRectF, bottomDegree, arc, false, mPaint);
        canvas.drawArc(loadingRectF, thirdDegree, arc, false, mPaint);

        mPaint.setColor(Color.GRAY);
        //畫掃描線 -- 通過(guò)修改top值來(lái)實(shí)現(xiàn)一直往下掃描效果
        canvas.drawRect(scanRect.left, scanRect.top, scanRect.right, scanRect.top + 1, mPaint);
        scanRect.top += scanDis;
        if(scanRect.top >= scanRect.bottom){
            scanRect.top = (int) loadingRectF.top + 20;
        }
        //圓弧滾動(dòng) -- 通過(guò)修改圓弧的初始值來(lái)實(shí)現(xiàn)滾動(dòng)
        startRotating();
    }else{//結(jié)束掃描  完成掃描
        Bitmap downMap = BitmapFactory.decodeResource(getResources(), mapDown);
        Matrix downMatrix = new Matrix();
        downMatrix.postScale(2.0f, 2.0f);
        Bitmap newDownMap = Bitmap.createBitmap(downMap, 0,0, downMap.getWidth(), downMap.getHeight(),
                downMatrix, true);
        canvas.drawBitmap(newDownMap, mWidth/2 - newDownMap.getWidth()/2, mHeight/2 - newDownMap.getHeight()/2, mPaint);
    }

}

代碼里面都注釋的很清楚了悦污,我想不需要另外在說(shuō)明了铸屉。還有幾個(gè)方法就是圓弧滾動(dòng)的實(shí)現(xiàn)以及開(kāi)始掃描和完成掃描


這里寫圖片描述
這里寫圖片描述

最后,通過(guò)調(diào)用startScan方法即可執(zhí)行掃描切端,調(diào)用stopScan完成掃描彻坛。

PS:最后說(shuō)明一句,由于開(kāi)始掃描和完成掃描沒(méi)有實(shí)現(xiàn)動(dòng)畫效果感覺(jué)有點(diǎn)突兀踏枣,希望懂的朋友可以指點(diǎn)或者幫忙實(shí)現(xiàn)下也是可以滴昌屉,哈哈···

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市茵瀑,隨后出現(xiàn)的幾起案子间驮,更是在濱河造成了極大的恐慌,老刑警劉巖马昨,帶你破解...
    沈念sama閱讀 207,248評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件竞帽,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡鸿捧,警方通過(guò)查閱死者的電腦和手機(jī)屹篓,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)笛谦,“玉大人抱虐,你說(shuō)我怎么就攤上這事〖⒛裕” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 153,443評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵懦冰,是天一觀的道長(zhǎng)灶轰。 經(jīng)常有香客問(wèn)我,道長(zhǎng)刷钢,這世上最難降的妖魔是什么笋颤? 我笑而不...
    開(kāi)封第一講書人閱讀 55,475評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮内地,結(jié)果婚禮上伴澄,老公的妹妹穿的比我還像新娘。我一直安慰自己阱缓,他們只是感情好非凌,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,458評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著荆针,像睡著了一般敞嗡。 火紅的嫁衣襯著肌膚如雪颁糟。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 49,185評(píng)論 1 284
  • 那天喉悴,我揣著相機(jī)與錄音棱貌,去河邊找鬼。 笑死箕肃,一個(gè)胖子當(dāng)著我的面吹牛婚脱,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播勺像,決...
    沈念sama閱讀 38,451評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼障贸,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了咏删?” 一聲冷哼從身側(cè)響起惹想,我...
    開(kāi)封第一講書人閱讀 37,112評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎督函,沒(méi)想到半個(gè)月后嘀粱,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,609評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡辰狡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,083評(píng)論 2 325
  • 正文 我和宋清朗相戀三年锋叨,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片宛篇。...
    茶點(diǎn)故事閱讀 38,163評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡娃磺,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出叫倍,到底是詐尸還是另有隱情偷卧,我是刑警寧澤,帶...
    沈念sama閱讀 33,803評(píng)論 4 323
  • 正文 年R本政府宣布吆倦,位于F島的核電站听诸,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏蚕泽。R本人自食惡果不足惜晌梨,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,357評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望须妻。 院中可真熱鬧仔蝌,春花似錦、人聲如沸荒吏。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,357評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)司倚。三九已至豆混,卻和暖如春篓像,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背皿伺。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 31,590評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工员辩, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人鸵鸥。 一個(gè)月前我還...
    沈念sama閱讀 45,636評(píng)論 2 355
  • 正文 我出身青樓奠滑,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親妒穴。 傳聞我的和親對(duì)象是個(gè)殘疾皇子宋税,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,925評(píng)論 2 344

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