目录

响应式布局方案

我们关注到大多数应用在折叠屏展开态上存在内容拉伸放大的现象,针对这一问题我们提供了一套具备响应式能力的控件,帮助开发者对android页面的局部区域进行快速的适配, 从而避免应用内容被过量放大的现象。

重复布局

布局特点:利用屏幕的宽度优势,将相同属性的布局组件横向并列同时排布。

适用场景:内容运营类列表信息,例如歌单列表、应用列表等。

适配规则:可以定义单个元素的宽度规则,随着屏幕宽度的变化,⾃动计算可以重复的元素的个数,满足宽度条件时横向重复排列。

示例

针对重复布局,华为提供了响应式LinearLayout控件,应用直接使用原生LinearLayout,接入HwRspLinearLayout可通过在Xml接入方式和代码接入两种方式。

开发准备

// 配置HMS Core SDK的Maven仓地址。
maven { url 'https://developer.huawei.com/repo/' }

Maven方式引入aar

使用前需在build.gradle的dependencies中添加所引用控件的依赖。

implementation "com.huawei.ui.rspuikit:hwrsplinearlayout-androidn:{version}"

{version}需替换为实际的版本号,具体版本号请参见版本更新说明章节。例如:implementation '"com.huawei.ui.rspuikit:hwrsplinearlayout-androidn:1.0.0.8'。

布局XML接入方式

xml配置示例

<com.huawei.rspuikit.androidn.hwrsplinearlayout.widget.HwRspLinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/hw_rsp_linearlayout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    app:rspcolNum="4"
    app:rspItemSpace="10dp"
    app:rspEnable="true"
    android:paddingLeft="5dp"
    android:paddingRight="5dp">

代码接入方式

动态创建:本方法可以在逻辑代码中直接生成相关的控件。

  1. 导入控件包
    import com.huawei.rspuikit.androidn.hwrsplinearlayout.widget.HwRspLinearLayout
  2. 代码由继承LinearLayout改为继承HwRspLinearLayout或者通过new HwRspLinearLayout直接使用,代码使用方式示例如下
    @Override
    protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_hwrsplinearlayout);
            HwRspLinearLayout mMainLayout = findViewById(R.id.hw_rsp_linearlayout);
            mMainLayout.setOrientation(LinearLayout.VERTICAL);
            mMainLayout.setRspEnable(true);
            mMainLayout.setRspItemSpace(10);
            // 设置展开态列数
            mMainLayout.setRspColNum(4);
        }

接口能力

响应式控件扩展并兼容原生LinearLayout控件接口,扩展控件接口及说明如下表。

接口函数

输入

输出

返回值

接口具体描述

接口范围

setRspColNum

int rspColNum

无

void

响应式控件列数设置

HwRsplinearlayout控件使用,不配置默认2

setRspEnable

boolean isRspEnable

无

void

使能响应式能力配置

HwRsplinearlayout控件使用,不配置默认false

setRspItemSpace

int

无

void

响应式控件每列元素之间间距设置

HwRsplinearlayout控件使用,不配置默认0(如果不设置,元素间距使用用户设置的margin,设置后则元素间距使用设置值)

控制展开态是否生效的接口是setRspEnable,只有设置为true时展开态才会响应式调整,若设置为false生效效果与谷歌原生控件一致。

应用可根据自己需要只在展开态显示有问题界面使能。

瀑布布局

布局特点:利用屏幕的宽度优势,将原来单列纵向布局,拓展为两列或多列的纵向布局。

适用场景:适合用卡片呈现内容的场景,通过卡片的横纵扩展在⼤屏上展示更多内容。

适配规则:可以定义单个组件的宽度规则,随着页面宽度的变化,⾃动计算可以重复的卡片个数,满足条件时横向排列更多卡片。

针对瀑布布局特点,华为提供了多种类型的响应式控件来满足不同的场景诉求。主要包括以下响应式GridView、ListView和RecyclerView。

响应式GridView

对于网格类的布局场景,推荐使用响应式GridView,应用直接使用原生GridView,接入HwRspGridView可通过在Xml接入方式和代码接入两种方式。

UX效果

开发准备

// 配置HMS Core SDK的Maven仓地址。
maven { url 'https://developer.huawei.com/repo/' }

Maven方式引入aar包

使用前需在build.gradle的dependencies中添加所引用控件的依赖。

implementation "com.huawei.ui.rspuikit:hwrspgridview:{version}"

{version}需替换为实际的版本号,具体版本号请参见版本更新说明章节。例如:implementation '"com.huawei.ui.rspuikit:hwrspgridview:1.0.0.8'。

布局XML接入方式

xml配置示例

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
            xmlns:tools="http://schemas.android.com/tools"
            xmlns:app="http://schemas.android.com/apk/res-auto"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            tools:context=".MainActivity"
            android:orientation="vertical">
     
<com.huawei.rspuikit.hwrspgridview.widget.HwRspGridView
        android:id="@+id/gv"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:paddingStart="3dp"
        android:paddingEnd="3dp"
        android:gravity="center"
        app:setRspEnable="true"
        android:stretchMode="columnWidth"
        android:stretchMode_rsp="columnWidth"
        android:numColumns="3"
        app:numColumnsRsp="7"
        android:columnWidth="80dp"
        app:columnWidthRsp="80dp"
        android:horizontalSpacing="5dp"
        app:horizontalSpacingRsp="5dp"
        android:verticalSpacing="1dp" />
</LinearLayout>

代码接入方式

动态创建:本方法可以在逻辑代码中直接生成相关的控件。

  1. 导入控件包
    import com.huawei.rspuikit.hwrspgridview.widget.HwRspGridView
  2. 代码由继承GridView改为继承HwRspGridView或者通过new HwRspGridView直接使用,代码使用示例如下。
    @Override
    protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         LinearLayout linearLayout = new LinearLayout(this);
         LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
                 LinearLayout.LayoutParams.MATCH_PARENT,
                 LinearLayout.LayoutParams.WRAP_CONTENT);
         linearLayout.setLayoutParams(params);
         HwRspGridView hwRspGridView = HwRspGridView(this);
         if (hwRspGridView != null) {
             ViewGroup.LayoutParams params = new ViewGroup.LayoutParams(
                     ViewGroup.LayoutParams.MATCH_PARENT,
                     ViewGroup.LayoutParams.MATCH_PARENT);
             hwRspGridView.setLayoutParams(params);
             // 设置响应式控件生效开关,true 表示生效,false 表示不生效
             hwRspGridView.setRspEnable(true);
             // 设置折叠态和展开态的拉伸模式,支持NO_STRETCH、STRETCH_SPACING、//STRTCH_COLUMN_WIDTH、STRETCH_SPACING_UNIFORM 四种
             hwRspGridView.setStretchMode(HwGridView.STRTCH_COLUMN_WIDTH);
             hwRspGridView.setStretchModeRsp(HwGridView.STRTCH_COLUMN_WIDTH);
             // 设置折叠态和展开态的列数
             hwRspGridView.setNumColumns(3);
             hwRspGridView.setNumColumnsRsp(7);
             // 设置折叠态和展开态的列宽
             hwRspGridView.setColumnWidth(getPixelsFromDp(80));
             hwRspGridView.setColumnWidthRsp(getPixelsFromDp(80));
             // 设置折叠态和展开态的列间距
             hwRspGridView.setHorizontalSpacing(getPixelsFromDp(5));
             hwRspGridView.setHorizontalSpacingRsp(getPixelsFromDp(5));
             linearLayout.addView(hwRspGridView);
         }
         setContent(linearLayout);
     }

接口能力

响应式控件扩展并兼容原生GridView控件接口,扩展控件接口及说明如下表。

接口函数

对应属性

输入

输出

返回值

setRspEnable

switch_rsp

Boolean isRspenable

设置响应式控件是否生效

void

setStretchModeRsp

stretchMode_rsp

ENUM{

NO_STRETCH,

STRETCH_SPACING,

STRTCH_COLUMN_WIDTH,

STRETCH_SPACING_UNIFOR

}

设置展开态拉伸模式

void

setNumColumnsRsp

numColumns_rsp

int numColumnsRsp

设置展开态列数

void

setColumnWidthRsp

columnWidth_rsp

int columnWidthRsp

设置展开态列宽

void

setHorizontalSpacingRsp

HorizontalSpacing_rsp

int horizontalSpacingRsp

设置展开态列间距

void

控制展开态是否生效的接口是setRspEnable,只有设置为true时展开态才会响应式调整,若设置为false生效效果与谷歌原生控件一致。

应用可根据自己需要只在展开态显示有问题界面使能。

响应式ListView

对于单列表的页面布局,适用于使用响应ListView,能够在展开态中显示更多列内容。

UX效果

开发准备

// 配置HMS Core SDK的Maven仓地址。
maven { url 'https://developer.huawei.com/repo/' }

Maven方式引入aar包

使用前需在build.gradle的dependencies中添加所引用控件的依赖。

implementation "com.huawei.ui.rspuikit:hwrsplistview-androidn:{version}"

{version}需替换为实际的版本号,具体版本号请参见版本更新说明章节。例如:implementation '"com.huawei.ui.rspuikit:hwrsplistview-androidn:1.0.0.8'。

布局XML接入方式

xml配置示例:原ListView调整为响应式控件(原代码不需要修改)

<com.huawei.rspuikit.androidn.hwrsplistview.widget.HwRspListView
        android:id="@+id/listview_example"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:scrollbars="vertical"
        app:rspEnable="true" />

代码接入方式

  1. 导入控件包
    import com.huawei.rspuikit.androidn.hwrsplistview.widget.HwRspListView
  2. 创建自定义控件类,调整原控件继承关系:
    public class MyHwListView extends HwRspListView 
  3. 代码使用示例
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_listview);
        HwRspListView exampleListView = findViewById(R.id.hwexamplelistview);
        exampleListView.setEnable(true);
        // 设置展开态列数
        exampleListView.setRspColNum(2);
     
        // 设置展开态列间距
        exampleListView.setRspItemSpace(20);
        }

接口能力

响应式控件扩展并兼容原生ListView控件接口,扩展控件接口及说明如下表。

接口函数

对应属性

输入

输出

返回值

setEnable

rspEnable

boolean isEnable

设置控件特性开关

void

setRspColNum

rspColNum

int count

设置展开态列数,默认2列

void

setRspItemSpace

rspItemSpace

int space

设置展开态每列元素间距

void

控制展开态是否生效的接口是setEnable,只有设置为true时展开态才会响应式调整,若设置为false生效效果与谷歌原生控件一致。

应用可根据自己需要只在展开态显示有问题界面使能。

响应式RecyclerView

对于商品列表类内容,以多列展示瀑布流效果的布局,推荐使用华为响应式RecyclerView,可以在展开态时显示更多列内容。

UX效果

开发准备

// 配置HMS Core SDK的Maven仓地址。
maven { url 'https://developer.huawei.com/repo/' }

Maven方式引入aar包

使用前需在build.gradle的dependencies中添加所引用控件的依赖。

HwRspRecyclerView提供了androidx包下的和support V7包下的RecyclerView的支持。

{version}需替换为实际的版本号,具体版本号请参见版本更新说明章节。例如:implementation '"com.huawei.ui.rspuikit:hwrsprecyclerview-androidsup:1.0.0.8'。

接入HwRspRecyclerView

接口能力

响应式控件扩展并兼容原生RecyclerView控件接口,扩展控件接口及说明如下表。

接口函数

输入

输出

返回值

setRspEnable

boolean isRspEnable

设置响应式控件是否生效

void

setExpandStateSpanCount

int expandStateSpanCount

设置展开态列数

void

setExpandStateItemGap

int expandStateItemGap

设置展开态列间距

void

setFirstRowTop

int firstRowTop

设置展开态首行top值

void

setExpandStateGapType

int expandStateGapType

设置展开态间距类型:0代表n个间距;1代表n-1个间距

void

setItemBottom

int itemBottom

设置展开态item底部bottom值

void

控制展开态是否生效的接口是setRspEnable,只有设置为true时展开态才会响应式调整,若设置为false生效效果与谷歌原生控件一致。

此外还有一种常见的广告banner区域,需要显示多张广告图片,并且支持左右滑动切换广告。针对这一布局,推荐使用响应式ViewPager控件。

响应式ViewPager

适用于support v4包和androidx包下的ViewPager控件,提供在展开态下同时显示多张banner区域的能力。

UX效果

开发准备

// 配置HMS Core SDK的Maven仓地址。
maven { url 'https://developer.huawei.com/repo/' }

Maven方式引入aar包

使用前需在build.gradle的dependencies中添加所引用控件的依赖。

HwRspViewPager提供了androidx包下的和support V7包下的ViewPager的支持。

{version}需替换为实际的版本号,具体版本号请参见版本更新说明章节。例如:implementation '"com.huawei.ui.rspuikit:hwrspviewpager-androidsup:1.0.0.8'。

接入HwRspViewPager

接入HwRspPagerAdapter(可选)

如果应用不存在一页显示完N个Item的场景(图1中N=2),则不需要执行该步骤。

如果应用需要实现图1中两张卡片时的效果,则还需要接入HwRspPagerAdapter。将PagerAdapter替换成HwRspPagerAdapter并在重写的instantiateItem方法中调用一次父类的该方法:

setAdapter(new HwRspPagerAdapter() {
            @Override
            public Object instantiateItem(@NonNull ViewGroup container, int position) {
                super.instantiateItem(container, position);
            }
        });
图1 一页显示N个Item

接入导航点(可选)

如图1所示,一个和两个Item时,需要将导航点隐藏。如果应用不存在此类场景,则无需执行该步骤

否则需要在代码中或者layout布局文件中显示的为HwRspViewPager指定导航点View。

图2 在代码中指定导航点

接口能力

HwRspViewPager提供了11个可供配置的参数,为了便以理解参数,此处先给出大屏下未接入和接入HwRspViewPager的效果,图中定义的变量在接下的描述中会用到:

图3 大屏下ViewPager原始效果
图4 大屏下ViewPager调整后效果

可配置参数的说明和使用方式见下表:

参数名

参数类型

参数取值

参数说明

rsp_need_adjust

boolean

取值:true/false

默认:true

大屏下是否需要执行响应式逻辑

rsp_adjust_type

enum

取值:center

默认:center

使用哪种范式来调整ViewPager,默认使用居中的方式

rsp_indicator_view_id

integer

默认:null

导航点View ID

rsp_page_margin

integer

默认:null

Item间距,见图5中的PM。如果用户未指定,则使用小屏下设置的值,如果还未设置,则使用默认值12dp

rsp_width_adjust_mode

enum

取值:

un_change/scale/aspect

默认:null

单个Item的宽调整策略:

un_change:宽不变,IW_NEW=IW

scale:按照配置rsp_scale_width缩放,IW_NEW=IW* rsp_scale_width

aspect:按照配置rsp_aspect依据高等比缩放,IW_NEW=IH_NEW* rsp_aspect

rsp_scale_width

float

默认:null

宽缩放大小,如果未配置则默认为0.5

rsp_height_adjust_mode

enum

取值:un_change/scale/aspect

默认:null

参见rsp_width_adjust_mode

rsp_scale_height

float

默认:null

高缩放大小,如果未配置则默认为0.5

rsp_aspect

float

默认:null

单个Item的高宽比,如果未设置则使用ViewPager的高宽比:VPH/VPW

rsp_off_page_limit

integer

默认:null

Item的缓存数量,不设置则使用系统默认值

rsp_one_page_item_cnt

Integer

默认:null

一页完整显示多少个Item,参见图二的两张卡片。不设置则使用默认值2

说明:以上参数都可以通过两种方式使用

方式一:在layout布局文件中配置

方式二:在代码中通过HwRspViewPager.getConfig().setXXX来配置

FAQ:

使用华为响应式控件是不是会对其他厂商的设备产生影响?

华为响应式控件是继承android原生控件的基础上新增了在折叠屏上响应式的能力,在其他厂商设备上不会开启该新增的能力,会走原生的android控件绘制流程,并不会对其他厂商的设备产生影响。