機頂盒開發 筆記

一、 運行和調試

1、adb connect [ip]
連接指定ip的設備

2、abd disconnect[ip]
斷開連接

3、adb uninstall [package]
卸載應用

4、abd shell input text **
調試程序是,用於輸入文字。

二、焦點控制

而在電視機(機頂盒)上做開發時,每個控件只有獲得了焦點,才能對其進行操作,因此,確保需要操作的控件能夠獲得焦點。

1、控制控件是否可獲得焦點

android:focusable = "true/false"

當這個屬性置爲true 時,表示當前控件可以獲得焦點,false 則表示不可獲得焦點。相應的,也可以在程序中通過代碼設置:

v.setFocusable(true/false);

2、 控制按遙控器上下左右時下一個獲得焦點的控件

android:nextFocusUp = "@+id/..."
android:nextFocusDown = "@+id/..."
android:nextFocusleft = "@+id/..."
android:nextFocusRight = "@+id/..."


相應的,也可以在代碼中設置:

v.setNextFocusUp(id);
v.setNextFocusDown(id);
v.setNextFocusLeft(id);
v.setNextFocusRight(id);

三、UI適配

UI適配在Android開發中是一件既麻煩又無法避免的事情,在本次開發中同樣也碰到了這方面的問題。假設這次主要適配1080p和720p兩種分辨率。最開始的

想法是,既然適配這兩種分辨率,就指定這兩種分辨率的資源,即

drawable-1920×1080

drawable-1280×720

相應地,提供對應分辨率下的尺寸:

values-1920×1080

values-1280×720

開發的時候,有一臺42寸的電視盒兩個機頂盒,電視最高支持4k分辨率,盒子只能輸出720p分辨率。按照適配策略,在電視和機頂盒上測試,都證明是正確的。然而

,開發結束,送到測試那邊時,使用的是32寸的1080p電視,就出現問題了,程序直接崩潰,無法運行,通過查看日誌,發現是OOM問題。經過分析,覺得是因爲測試

的電視雖然是1080p,但尺寸小,dpi高,是的所有圖片都會被壓縮,導致OOM。最後,更改了適配策略,採用了

drawable-sw1080dp

drawable-sw720dp

相應地,提供對應分辨率下的尺寸:

values-sw1080dp

values-sw720dp

解決了程序崩潰的問題。

四、陰影的程序實現

爲了界面的美觀與動感,在電視APP設計中,往往會用到倒影和陰影的效果。開發中,需要實現倒影和陰影,用程序來實現。其原理基本上就是將原圖倒置,畫在畫布

上,然後加上一個半透明的蒙版,就搞定了。

陰影效果的實現,需要實現的是在一個圓角矩形的圖片四周加上陰影效果,辦法是在原圖四邊加上矩形的陰影,然後在四個圓角的地方畫扇形陰影來實現。不多

說,直接上代碼:

/** 
     * @author: AndJun
     * @Title: createShadowBitmap 
     * @Description: 生成帶陰影圖片
     * @param orignalBitmap:原圖
     * @param shadowMargin:陰影邊寬
     * @param iconCornerRadius:原圖圓角半徑
     * @return :生成的帶陰影圖片
     */
    public static Bitmap createShadowBitmap(Bitmap orignalBitmap,
            int shadowMargin, int iconCornerRadius) {
        int w = orignalBitmap.getWidth();
        int h = orignalBitmap.getHeight();
        Bitmap shadowBitmap = Bitmap.createBitmap(w + shadowMargin * 2, h
                + shadowMargin * 2, Config.ARGB_8888);
        int width = shadowBitmap.getWidth();
        int height = shadowBitmap.getHeight();
        Canvas canvas = new Canvas(shadowBitmap);
        canvas.drawBitmap(orignalBitmap, shadowMargin, shadowMargin, null);
        Paint paint = new Paint();
        paint.setXfermode(new PorterDuffXfermode(Mode.DST_OVER));
        int radius = shadowMargin + iconCornerRadius;
        // 四個邊的陰影效果,採用線性陰影,寬度等於陰影邊距+圓角半徑
        LinearGradient leftGradient = new LinearGradient(radius, 0, 0, 0,
                0x7F000000, 0x00000000, TileMode.CLAMP);
        LinearGradient rightGradient = new LinearGradient(width - radius, 0,
                width, 0, 0x7F000000, 0x00000000, TileMode.CLAMP);
        LinearGradient topGradient = new LinearGradient(0, radius, 0, 0,
                0x7F000000, 0x00000000, TileMode.CLAMP);
        LinearGradient bottomGradient = new LinearGradient(0, height - radius,
                0, height, 0x7F000000, 0x00000000, TileMode.CLAMP);
        paint.setShader(leftGradient);
        canvas.drawRect(0, radius, radius, height - radius, paint);
        paint.setShader(rightGradient);
        canvas.drawRect(width - radius, radius, width, height - radius, paint);
        paint.setShader(topGradient);
        canvas.drawRect(radius, 0, width - radius, radius, paint);
        paint.setShader(bottomGradient);
        canvas.drawRect(radius, height - radius, width - radius, height, paint);
        // 四個角的陰影效果,採用圓形陰影,半徑等於陰影邊距+圓角半徑
        RadialGradient topLeftCornerGradient = new RadialGradient(radius,
                radius, radius, 0x7F000000, 0x00000000, TileMode.CLAMP);
        RadialGradient topRightCornerGradient = new RadialGradient(width
                - radius, radius, radius, 0x7F000000, 0x00000000,
                TileMode.CLAMP);
        RadialGradient bottomLeftCornerGradient = new RadialGradient(radius,
                height - radius, radius, 0x7F000000, 0x00000000, TileMode.CLAMP);
        RadialGradient bottomRightCornerGradient = new RadialGradient(width
                - radius, height - radius, radius, 0x7F000000, 0x00000000,
                TileMode.CLAMP);
        // 畫四個角,就是畫四個圓心角爲90度的扇形,drawArc函數第一個參數爲圓弧所在圓的的外接矩形,第二個參數爲起始角度,第三個參數爲扇形

順時針滑過的角度,第四個參數如果爲true時,在繪製圓弧時將圓心包括在內(用來畫扇形),第五個參數爲畫筆
        paint.setShader(topLeftCornerGradient);
        canvas.drawArc(new RectF(0, 0, radius * 2, radius * 2), 180, 90, true,
                paint);
        paint.setShader(topRightCornerGradient);
        canvas.drawArc(new RectF(width - radius * 2, 0, width, radius * 2),
                270, 90, true, paint);
        paint.setShader(bottomLeftCornerGradient);
        canvas.drawArc(new RectF(0, height - radius * 2, radius * 2, height),
                90, 90, true, paint);
        paint.setShader(bottomRightCornerGradient);
        canvas.drawArc(new RectF(width - radius * 2, height - radius * 2,
                width, height), 0, 90, true, paint);
        return shadowBitmap;
    }
發佈了101 篇原創文章 · 獲贊 8 · 訪問量 12萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章