机顶盒开发 笔记

一、 运行和调试

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万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章