成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

Android二維碼掃描

hover_lew / 2613人閱讀

摘要:前言微信的二維碼掃描用的越來(lái)越多,所以最近就想弄明白它的實(shí)現(xiàn),于是找了點(diǎn)資料,發(fā)現(xiàn)都是說(shuō)使用的開(kāi)源庫(kù)??炊嗔宋⑿诺亩S碼掃描,一下看這么我實(shí)在是看不慣。

前言

微信的二維碼掃描用的越來(lái)越多,所以最近就想弄明白它的實(shí)現(xiàn),于是找了點(diǎn)資料,發(fā)現(xiàn)都是說(shuō)使用zxing的開(kāi)源庫(kù)。這是一個(gè)很強(qiáng)大的開(kāi)源項(xiàng)目,引用該項(xiàng)目只要簡(jiǎn)單的幾步代碼就能實(shí)現(xiàn)一個(gè)簡(jiǎn)單的二維碼掃描與生成的效果。這里做點(diǎn)筆記記下,還不知道如何實(shí)現(xiàn)的也可以來(lái)學(xué)習(xí)下。

準(zhǔn)備工作

先下載zxing項(xiàng)目,不過(guò)推薦下載精簡(jiǎn)版,BarCodeTest這個(gè)就足夠?qū)崿F(xiàn)該功能了。把下載的項(xiàng)目添加到自己項(xiàng)目的依賴中,引用該項(xiàng)目。如何添加Module這里就不多說(shuō)了相信大家都能自己解決。下面進(jìn)行實(shí)現(xiàn)操作。

掃描二維碼

因?yàn)槭且脛e人的開(kāi)源項(xiàng)目,所以我們能很簡(jiǎn)單的使用別人定義好的類來(lái)實(shí)現(xiàn)該功能,這里用到的主要是CaptureActivit類,當(dāng)我們要掃描時(shí)跳轉(zhuǎn)到該類開(kāi)啟掃描功能:

//打開(kāi)掃描界面掃描條形碼或二維碼
Intent openCameraIntent = new Intent(BarCodeTestActivity.this,CaptureActivity.class);
                startActivityForResult(openCameraIntent, 0);

重寫onActivityResult方法,通過(guò)TextView顯示出掃描的結(jié)果:

@Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        //處理掃描結(jié)果(在界面上顯示)
        if (resultCode == RESULT_OK) {
            Bundle bundle = data.getExtras();
            String scanResult = bundle.getString("result");
            resultTextView.setText(scanResult);
        }
    }

這里直接通過(guò)bundle.getString("result")就可以獲取掃描的結(jié)果,因?yàn)樵?strong>CaptureActivity中的handleDecode已經(jīng)對(duì)其做了處理:

public void handleDecode(Result result, Bitmap barcode) {
        inactivityTimer.onActivity();
        playBeepSoundAndVibrate();
        String resultString = result.getText();
        //FIXME
        if (resultString.equals("")) {
            Toast.makeText(CaptureActivity.this, "Scan failed!", Toast.LENGTH_SHORT).show();
        }else {
//            System.out.println("Result:"+resultString);
            Intent resultIntent = new Intent();
            Bundle bundle = new Bundle();
            bundle.putString("result", resultString);
            resultIntent.putExtras(bundle);
            this.setResult(RESULT_OK, resultIntent);
        }
        CaptureActivity.this.finish();
    }
掃描的功能到這里就結(jié)束了
生成二維碼

這里生成二維碼也很簡(jiǎn)單,只是要調(diào)用該開(kāi)源項(xiàng)目的EncodingHandlercreateQRCode方法生成Bitmap對(duì)象,通過(guò)ImageView顯示出來(lái):

try {
                    String contentString = qrStrEditText.getText().toString();
                    if (!contentString.equals("")) {
                        //根據(jù)字符串生成二維碼圖片并顯示在界面上,第二個(gè)參數(shù)為圖片的大?。?50*450)
                        Bitmap qrCodeBitmap = EncodingHandler.createQRCode(contentString, 450);
                        qrImgImageView.setImageBitmap(qrCodeBitmap);
                    } else {
                        Toast.makeText(BarCodeTestActivity.this, "Text can not be empty", Toast.LENGTH_SHORT).show();
                    }
                } catch (WriterException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
是不是感覺(jué)太簡(jiǎn)單了,沒(méi)錯(cuò)就是這么簡(jiǎn)單,其實(shí)剛開(kāi)始了解的時(shí)候也驚呆了,不禁感嘆開(kāi)源真是牛叉?。?/em>
界面修改

其實(shí)通過(guò)上面的實(shí)現(xiàn)你會(huì)發(fā)現(xiàn)功能是實(shí)現(xiàn)了,但界面真是看不過(guò)去了,感覺(jué)瞬間回到了解放前似得,有木有這種感覺(jué)??炊嗔宋⑿诺亩S碼掃描,一下看這么low我實(shí)在是看不慣。我們可以簡(jiǎn)單的做下修改。首先我們找到CameraManager類,在該類中我們主要是修改下掃描框的大?。ㄔ瓉?lái)的實(shí)在是感覺(jué)太小氣了)把相應(yīng)的參數(shù)改大點(diǎn)就可以了,下面是我自己修改的大小:

private static final int MIN_FRAME_WIDTH = 400;
private static final int MIN_FRAME_HEIGHT = 400;
private static final int MAX_FRAME_WIDTH = 600;
private static final int MAX_FRAME_HEIGHT = 600;

下面要該的就是添加跟微信一樣的移動(dòng)激光條、四個(gè)角的簡(jiǎn)單裝飾與文字顯示。我們要找到ViewfinderView類,在onDraw方法中做繪制的修改。首先把原來(lái)的描邊的顏色改成灰色:

paint.setColor(Color.GRAY);
      canvas.drawRect(frame.left, frame.top, frame.right + 1, frame.top + 2, paint);
      canvas.drawRect(frame.left, frame.top + 2, frame.left + 2, frame.bottom - 1, paint);
      canvas.drawRect(frame.right - 1, frame.top, frame.right + 1, frame.bottom - 1, paint);
      canvas.drawRect(frame.left, frame.bottom - 1, frame.right + 1, frame.bottom + 1, paint);

默認(rèn)為綠色,因?yàn)橄旅嫖覀円嫺⑿乓粯拥木G色的四個(gè)角,顏色一樣就有點(diǎn)不協(xié)調(diào)了。

//畫掃描框的四個(gè)裝飾角
      paint.setColor(FRAME_COLOR);
      canvas.drawRect(frame.left, frame.top, frame.left + FRAME_WIDTH, frame.top + FRAME_HEIGHT, paint);
      canvas.drawRect(frame.left, frame.top, frame.left + FRAME_HEIGHT, frame.top + FRAME_WIDTH, paint);
      canvas.drawRect(frame.right - FRAME_WIDTH, frame.top, frame.right, frame.top + FRAME_HEIGHT, paint);
      canvas.drawRect(frame.right - FRAME_HEIGHT, frame.top, frame.right, frame.top + FRAME_WIDTH, paint);
      canvas.drawRect(frame.right - FRAME_HEIGHT, frame.bottom - FRAME_WIDTH, frame.right, frame.bottom, paint);
      canvas.drawRect(frame.right - FRAME_WIDTH, frame.bottom - FRAME_HEIGHT, frame.right, frame.bottom, paint);
      canvas.drawRect(frame.left,frame.bottom-FRAME_WIDTH,frame.left+FRAME_HEIGHT,frame.bottom,paint);
      canvas.drawRect(frame.left,frame.bottom-FRAME_HEIGHT,frame.left+FRAME_WIDTH,frame.bottom,paint);

這里主要的根據(jù)frametopleft、rightbottom參數(shù)來(lái)繪制,每個(gè)角要繪制兩次。FRAME_HEIGHTFRAME_WIDTH分別為自己設(shè)置的角的寬高??梢阅梦⑿诺膶?duì)照。
下面修改激光線,把原來(lái)的激光繪制去掉添加如下代碼:

//初始化laser
      if (!isStart){
        isStart = true;
        laserTop = frame.top;
        laserBottom = frame.bottom;
      }
//繪制laser
      laserTop += LASER_SPEED;//每次的移動(dòng)距離
      if (laserTop >= frame.bottom){
        laserTop = frame.top;
      }
      canvas.drawRect(frame.left + LASER_WIDTH, laserTop - LASER_WIDTH / 2, frame.right - LASER_WIDTH, laserTop + LASER_WIDTH / 2, paint);
      //更新laser實(shí)現(xiàn)移動(dòng)
      postInvalidateDelayed(ANIMATION_DELAY, frame.left, frame.top, frame.right, frame.bottom);

至于文字的繪制也是響應(yīng)的原理,找到要繪制的坐標(biāo),調(diào)用canvas.drawText就可以了,不過(guò)畫筆paint.setTextSize()單位是px(像素),這點(diǎn)感覺(jué)有點(diǎn)麻煩,在不同的分辨率的機(jī)型下字體的大小會(huì)相差很大。。有點(diǎn)蛋疼。希望有好的解決的方法可以告訴我。

效果圖
文字我沒(méi)有調(diào),自己可以調(diào)下。我是按我手機(jī)居中來(lái)調(diào)的,這個(gè)是768 x 1280的,文字完全變樣了。。。 

其他分享:https://idisfkj.github.io/

關(guān)注

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/65793.html

相關(guān)文章

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<