Android實現LED燈顯示效果

LED顯示效果

項目地址

EZLedView項目地址

效果圖a

原理

廣告牌中經常能看到上面這種顯示效果,使用LED燈實現文字甚至是圖片的顯示,那如何在Android中實現這種效果呢?

通常的做法應該是獲取字體的點陣信息,然后經過計算在對應的位置繪制圓點,但是這樣太麻煩了,于是我使用了一種比較偷懶的做法,原理是這樣的:

1.首先將文字轉換為Bitmap,既得到一張跟文字顯示效果一樣的圖片;
2.按照一定的間隔點獲取該圖片中對應的像素點是否有顏色,如果有,則在該點繪制LED燈,否則不繪制。

使用這種方法的一個好處是,即便是圖片也可以輕松轉換成LED顯示。

代碼實現

Read the fucking source code!

廢話不多說,下面看看如何具體實現代碼。

1.首先我們將要顯示的文字轉換為Bitmap

    private Bitmap renderText(CharSequence text, Paint paint) {
        Bitmap bitmap = Bitmap.createBitmap(mDrawableWidth, mDrawableHeight, Bitmap.Config.ARGB_8888);
        Canvas canvas = new Canvas(bitmap);
        int yPos = (int) ((canvas.getHeight() / 2) - ((paint.descent() + paint.ascent()) / 2));
        canvas.drawText(text.toString(),0,yPos,paint);
        return bitmap;
    }

2.根據LED燈的半徑和LED的間距,生成一個所有LED燈所在位置的List,這個List存儲我們計算好的所有LED燈的位置

   List<Point> circlePoint = new ArrayList<>();
   private void measurePoint(int width, int height) {
        int halfBound = ledRadius + ledSpace / 2;
        int x = halfBound;
        int y = halfBound;
        for (; ; ) {
            for (; ; ) {
                circlePoint.add(new Point(x, y));
                y += halfBound * 2;
                if (y > height) {
                    y = halfBound;
                    break;
                }
            }
            x += halfBound * 2;
            if (x > width) {
                break;
            }
        }
    }

3.根據已經生成的文字Bitmap和LED等的位置,生成LED圖

    // 獲取Bitmap指定位置的顏色,
    // 這個方法比較長,我簡化了一下,
    // 詳細代碼請移步項目地址查看源碼
    private int isInRange(Bitmap bitmap, int x, int y) {
        ...
        int color = bitmap.getPixel(x - ledRadius, y);
        ....
        return color;
    }

    // 根據Led等的位置和原始的TextBitmap生成LedBitmap
    private Bitmap generateLedBitmap(Bitmap src) {
        Bitmap bitmap = Bitmap.createBitmap(src.getWidth(), src.getHeight(), Bitmap.Config.ARGB_8888);
        Canvas canvas = new Canvas(bitmap);
        for (Point point : circlePoint) {
            // Detect if the px is in range of our led position
            int color = isInRange(src, point.x, point.y);
            if (color != 0) {
                    canvas.drawCircle(point.x, point.y, ledRadius, paint);
            }
        }
        return bitmap;
    }

4.最后我們在onDraw()方法中將這個Bitmap繪制到Canvas中即可,有一點需要注意的是,如果這個Bitmap的尺寸超過 4 * 1024在有的手機上會報OpenGL Texture最大尺寸不能超過4096像素的錯誤,所以在繪制的時候檢查一下Bitmap的尺寸是否超過,如果是,則將這個Bitmap拆分成多個Bitmap進行繪制。

EZLedView項目地址

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 發現 關注 消息 iOS 第三方庫、插件、知名博客總結 作者大灰狼的小綿羊哥哥關注 2017.06.26 09:4...
    肇東周閱讀 12,180評論 4 61
  • 有些事不被理解招來別人罵鄙視,罵了3年,發現你還在做,罵聲少了,疑惑應不應該罵的人開始有了,再過幾年,你還在做這事...
    ynot16閱讀 144評論 0 0
  • 這里沒有攻略,沒有感悟,只有一場超級DUANG的趴踢。 首先介紹本次聚會的主辦方:暖濕氣流,別名暖爺。來自熱帶洋面...
    騎驢漫游閱讀 338評論 0 2
  • 高考成績還未出爐,許多考生已如熱鍋上的螞蟻,著急謀劃未來。 某考生甚至在微博上求助:我的成績估計只夠上個二專學校,...
    葉敘呢閱讀 1,158評論 46 28
  • 我們不需要人人都去做商人,但每個人都需要掌握一定的商業常識。《認識商業》就是一本深入淺出的介紹基本商業原理的百科全...
    a396a0cb1190閱讀 945評論 4 28