0530-3433334

网站建设 APP开发 小程序

知识

分享你我感悟

您当前位置>首页 >> 知识 >> 软件开发

电视应用和手机应用开发过程中的一些问题记录下来

发表时间:2023-08-29 07:00:31

文章来源:炫佑科技

浏览次数:160

菏泽炫佑科技

电视应用和手机应用开发过程中的一些问题记录下来

前段时间,我把一个手机APP改成了电视应用。 由于**次开发电视,所以记录了开发过程中的一些问题,以备不时之需。 电视应用和移动应用的开发过程类似。 TV应用主要关注三个地方:1是列表文件,2是布局文件,3是处理控件获得焦点时的后台显示,因为对于没有触摸功能的TV设备,用户当您想要点击某个控件,只能先通过操作遥控器上的方向键将焦点移动到该控件上,然后按遥控器上的确定键执行点击,所以需要处理后台显示当控件获得焦点时(区别其他没有焦点的控件),以便用户一眼就能看出哪个控件当前获得焦点并且可点击。

1、文件需要修改的内容 1.1 处理电视可能不支持的硬件功能

电视上的系统通常不支持以下硬件功能:

因此,您需要在清单文件中将上述功能声明为非必需,以便您的应用程序可以安装在不支持这些功能的电视上,如下所示:


    
    
    
    
    
    
    

当然,如果你的应用程序的某个功能需要使用上述功能之一,你应该在代码中判断设备是否支持该功能改变,从而做出相应的处理逻辑,如何判断:

是否支持通话:

if (getPackageManager().hasSystemFeature(PackageManager.FEATURE_TELEPHONY)) {
       //支持电话拨打
    }

是否触摸屏

if (getPackageManager().hasSystemFeature(PackageManager.FEATURE_TOUCHSCREEN)) {
        //是触摸屏
    }

相机可以打开吗

if (getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA)) {
        //可开启相机
    } 

其他特征判断这里不再赘述。

1.2 节点下

如上图所示,应用程序的启动图片除了常规的手机APP标志外,还需要在属性下提供图片。 什么是横幅? 请看下图:

横幅图片分辨率一般建议为320*180,并放置在xhdpi图片资源目录下。

此外,当电视应用程序启动时电视应用和手机应用开发过程中的一些问题记录下来,系统会显示类似于扩展实心圆的动画。 要自定义此动画的颜色,请将 TV 应用的 : 属性设置为特定颜色。 此外,另外两个过渡重叠属性应设置为 true,如主题资源 XML 文件中的以下代码片段所示:


        
    

1.3 启动页面

TV应用程序的启动页面需要将 - from 的值更改为:


                
                
            

否则,您的应用程序将不会显示在电视桌面或横幅列表上,并且您的电视应用程序也不会显示在手机桌面上。

1.4 启动配置

该属性需要配置一个值,因为当用户操作键盘方向键切换导航时,会重新走生命周期方法。 这是为了防止它重新走生命周期方法:

另外,TV应用不支持纵向显示,因此我们可以直接在文件中将屏幕方向限制为横向。

2、布局文件 2.1 由于电视应用都是横屏显示,所以界面布局文件应该放在-land目录下。 2.2电视没有状态栏,所以*好使用主题。 2.3 对于没有触摸功能的电视,*好不要用它来管理切换。 2.4 当界面内容过长时,*好使用根布局。 将控件的属性设置为 true。 这样设置后,你会发现,当你在具有触摸功能的设备上安装应用程序时,需要点击该控件两次才能执行。 这是因为控件必须先走,后走。 ,为了避免这种情况,将该属性设置为true后,记得同时显式将该控件设置为true。 3.2 对于同一级别或类型的多张图片,为了区分当前是哪张图片处于焦点,可以通过放大来区分焦点图片,如下图:

仔细看看上图,“表盘”图片当前处于对焦状态,相对于其他三张图片是放大的。 如果想要图片获得焦点时放大,未获得焦点时缩小到正常水平,只需要重写该方法即可:

/**
 * @author Administrator
 * @time 2019/9/5 17:12
 * @des ${TODO}
 * @updateAuthor $Author$
 * @updateDate $Date$
 * @updateDes ${TODO}
 * 获取焦点放大的ImageView
 */
public class ScaleWithFocusImageView extends AppCompatImageView {
    private FocusedListener mFocusedListener;
    public ScaleWithFocusImageView(Context context) {
        super(context);
    }
    public ScaleWithFocusImageView(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
    }
    @Override
    protected void onFocusChanged(boolean gainFocus, int direction,
                                  @Nullable Rect previouslyFocusedRect) {
        super.onFocusChanged(gainFocus, direction, previouslyFocusedRect);
        ViewCompat.animate(this)
                .scaleX(gainFocus ? 1.3f : 1.0f)//x轴方向的缩放
                .scaleY(gainFocus ? 1.3f : 1.0f)//y轴方向的缩放
                .translationZ(gainFocus ? 1f : 0f)//z轴方向的移动
                .start();
        if (mFocusedListener != null) {
            mFocusedListener.focused(gainFocus);
        }
    }
    public void setFocusedListener(FocusedListener focusedListener) {
        mFocusedListener = focusedListener;
    }
}

3.3 对于几个相同级别或类型的,区分的方式可以包括缩放、文字颜色等,见下图:

上图中的“拨号”和“联系人”分别是两个导航标题。 当前焦点位于“Dial”,获得焦点时放大,文字颜色为纯白色。 还是很容易看出来的。下面是修改后的代码

public class FocuseScaleRadiubutton extends AppCompatRadioButton {
    private int mWhiteColor;
    private int mWhiteColor70Transp;
    public FocuseScaleRadiubutton(Context context) {
        super(context);
        init();
    }
    public FocuseScaleRadiubutton(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }
    private void init() {
        mWhiteColor = getResources().getColor(R.color.color_white);
        mWhiteColor70Transp = getResources().getColor(R.color.color_70_transp_white);
    }
    @Override
    protected void onFocusChanged(boolean focused, int direction, Rect previouslyFocusedRect) {
        super.onFocusChanged(focused, direction, previouslyFocusedRect);
        ViewCompat.animate(this)
                .scaleX(focused ? 1.15f : 1.0f)
                .scaleY(focused ? 1.15f : 1.0f)
                .translationZ(focused ? 1.0f : 0f)
                .start();
        setTextColor(focused ? mWhiteColor : mWhiteColor70Transp);
    }
}

3.4 差异中的哪一项获得焦点

同样,为了时时获得焦点,需要将item的布局根节点设置为true。 还是看上面的拨号界面:

当前的重点是中的第二项。 这里我展示了一个红色线框来区分它。 当然,你也可以放大这个项目来区分它,或者通过它周围的突出显示和阴影来区分它。 下面的代码是这个item中的状态背景:


    
    
    
    
    
    
    
    

3.5 监听用户是否按下遥控器

该场景主要用于当用户按下遥控器按钮时执行相应的逻辑。 例如,在视频播放界面中,全屏播放时,用户一段时间不操作遥控器后,部分按钮会被隐藏。 当用户按下遥控器app开发,然后显示隐藏按钮时,只需要重写该方法:

@Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if ((event.getSource() & InputDevice.SOURCE_DPAD)
                != InputDevice.SOURCE_DPAD) {
            //用户按了遥控
        }
            return super.onKeyDown(keyCode, event);
    }

3.5 处理导航

一般情况下,用户操作遥控器的方向键(上、下、左、右)时,不需要处理导航顺序。 如果有这样的需求,你可以根据以下属性在布局文件中指定你的导航顺序:

如果你想在*后一个控件获得焦点后继续按右方向键导航到**个控件,那么你只需要将*后一个控件中的值设置为**个控件的id即可。

炫佑科技专注互联网开发小程序开发-app开发-软件开发-网站制作等

相关案例查看更多