我们关注到大多数应用在折叠屏展开态上存在内容拉伸放大的现象,针对这一问题我们提供了一套具备响应式能力的控件,帮助开发者对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">
代码接入方式
动态创建:本方法可以在逻辑代码中直接生成相关的控件。
import com.huawei.rspuikit.androidn.hwrsplinearlayout.widget.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,接入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>
代码接入方式
动态创建:本方法可以在逻辑代码中直接生成相关的控件。
import com.huawei.rspuikit.hwrspgridview.widget.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,能够在展开态中显示更多列内容。
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" />
代码接入方式
import com.huawei.rspuikit.androidn.hwrsplistview.widget.HwRspListView
public class MyHwListView extends HwRspListView
@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,可以在展开态时显示更多列内容。
UX效果

开发准备
// 配置HMS Core SDK的Maven仓地址。
maven { url 'https://developer.huawei.com/repo/' }
Maven方式引入aar包
使用前需在build.gradle的dependencies中添加所引用控件的依赖。
HwRspRecyclerView提供了androidx包下的和support V7包下的RecyclerView的支持。
implementation "com.huawei.ui.rspuikit:hwrsprecyclerview-androidsupx:{version}"
implementation "com.huawei.ui.rspuikit:hwrsprecyclerview-androidsup:{version}"
{version}需替换为实际的版本号,具体版本号请参见版本更新说明章节。例如:implementation '"com.huawei.ui.rspuikit:hwrsprecyclerview-androidsup:1.0.0.8'。
接入HwRspRecyclerView
<com.huawei.rspuikit.androidsupx.hwrsprecyclerview.wiget.HwRspRecyclerView
android:background="@color/white"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingStart="5dp"
android:paddingEnd="5dp"
android:id="@+id/myRecyclerView"
app:expandStateSpanCount="3"
app:expandStateEnableRsp="true"
/> import com.huawei.rspuikit.androidsupx.hwrsprecyclerview.wiget.HwRspRecyclerView; public class MyRecyclerView extends HwRspRecyclerView
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.recycler_view);
HwRspRecyclerView myRecyclerView = findViewById(R.id.myRecyclerView);
// 设置首行top值
myRecyclerView.setFirstRowTop(10);
// 设置item的bottom值
myRecyclerView.setItemBottom(20);
// 设置item间距类型
myRecyclerView.setExpandStateGapType(1);
// 设置扩展态间距
myRecyclerView.setExpandStateItemGap(80);
// 设置响应式控件生效
myRecyclerView.setRspEnable(true);
// 设置扩展态列数
myRecyclerView.setExpandStateSpanCount(3);
StaggeredGridLayoutManager layoutManager = new StaggeredGridLayoutManager(2,
StaggeredGridLayoutManager.VERTICAL);
myRecyclerView.setLayoutManager(layoutManager);
} 参数名 |
参数取值 |
参数说明 |
使用方式 |
|---|---|---|---|
expandStateEnableRsp |
True/false |
是否使用响应式布局 |
在layout布局文件中配置 |
expandStateSpanCount |
Integer |
展开态控件的列数 |
|
expandStateItemGap |
dimension |
展开态Item的列间距 |
|
expandStateFirstRowTop |
dimension |
展开态首行top值 |
|
expandStateGapType |
Integer |
展开态列间距类型:0代表n个间距;1代表n-1个间距 |
|
expandStateItemBottom |
dimension |
展开态item底部bottom值 |
接口能力
响应式控件扩展并兼容原生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控件。
适用于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的支持。
implementation "com.huawei.ui.rspuikit:hwrspviewpager-androidsupx:{version}"
implementation "com.huawei.ui.rspuikit:hwrspviewpager-androidsup:{version}"
{version}需替换为实际的版本号,具体版本号请参见版本更新说明章节。例如:implementation '"com.huawei.ui.rspuikit:hwrspviewpager-androidsup:1.0.0.8'。
接入HwRspViewPager
<com.huawei.rspwidget.androidsupx.viewpager.HwRspViewPager
android:background="@id/view_pager"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:rsp_need_adjust="true"
/> import com.huawei.rspwidget.androidsupx.viewpager.HwRspViewPager; public class LooperViewPager extends HwRspViewPager
@Override
protected void onMeasure2(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
} 接入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所示,一个和两个Item时,需要将导航点隐藏。如果应用不存在此类场景,则无需执行该步骤
否则需要在代码中或者layout布局文件中显示的为HwRspViewPager指定导航点View。
接口能力
HwRspViewPager提供了11个可供配置的参数,为了便以理解参数,此处先给出大屏下未接入和接入HwRspViewPager的效果,图中定义的变量在接下的描述中会用到:
可配置参数的说明和使用方式见下表:
参数名 |
参数类型 |
参数取值 |
参数说明 |
|---|---|---|---|
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控件绘制流程,并不会对其他厂商的设备产生影响。