一、 运行和调试
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;
}