鸿蒙5.0开发进阶:JS组件-栅格组件(grid-col)

往期鸿蒙5.0全套实战文章必看:(文中附带全栈鸿蒙5.0学习资料)


grid-col

说明

从API version 5开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。

grid-col是栅格布局容器grid-row的子容器组件。

权限列表

子组件

支持。

属性

除支持通用属性外,还支持如下属性:

名称类型默认值必填描述
xsnumber|object-

在分辨率为xs模式下,设置该项占用列数与偏移列数,当值为number类型时,仅设置列数,也可通过object同时设置占用列数与偏移列数,如

{"span": 1, "offset": 0}

smnumber|object-

在分辨率为sm模式下,该项占用列数与偏移列数,当值为number类型时,仅设置列数,也可通过object同时设置占用列数与偏移列数。如

{"span": 1, "offset": 0}

mdnumber|object-

在分辨率为md模式下,该项占用列数与偏移列数,当值为number类型时,仅设置列数,也可通过object同时设置占用列数与偏移列数。如

{"span": 1, "offset": 0}

lgnumber|object-

在分辨率为lg模式下,该项占用列数与偏移列数,当值为number类型时,仅设置列数,也可通过object同时设置占用列数与偏移列数。如

{"span": 1, "offset": 0}

spannumber1在未设置明确断点时,默认占用列数
offsetnumber0未设置具体分辨率模式下偏移时,当前元素延容器布局方向,默认偏移的列数

样式

除支持通用样式外,还支持如下样式:

名称类型默认值必填描述
flex-directionstringrow

flex容器主轴方向。可选项有:

- column:垂直方向从上到下

- row:水平方向从左到右

flex-wrapstringnowrap

flex容器是单行还是多行显示,该值暂不支持动态修改。可选项有:

- nowrap:不换行,单行显示。

- wrap:换行,多行显示。

justify-contentstringflex-start

flex容器当前行的主轴对齐格式。可选项有:

- flex-start:项目位于容器的开头。

- flex-end:项目位于容器的结尾。

- center:项目位于容器的中心。

- space-between:项目位于各行之间留有空白的容器内。

- space-around:项目位于各行之前、之间、之后都留有空白的容器内。

align-itemsstringstretch

flex容器当前行的交叉轴对齐格式,可选值为:

- stretch:弹性元素被在交叉轴方向被拉伸到与容器相同的高度或宽度。

- flex-start:元素向交叉轴起点对齐。

- flex-end:元素向交叉轴终点对齐。

- center:元素在交叉轴居中。

align-contentstringflex-start

交叉轴中有额外的空间时,多行内容对齐格式,可选值为:

- flex-start:所有行从交叉轴起点开始填充。第一行的交叉轴起点边和容器的交叉轴起点边对齐。接下来的每一行紧跟前一行。

- flex-end:所有行从交叉轴末尾开始填充。最后一行的交叉轴终点和容器的交叉轴终点对齐。同时所有后续行与前一个对齐。

- center:所有行朝向容器的中心填充。每行互相紧挨,相对于容器居中对齐。容器的交叉轴起点边和第一行的距离相等于容器的交叉轴终点边和最后一行的距离。

- space-between:所有行在容器中平均分布。相邻两行间距相等。容器的交叉轴起点边和终点边分别与第一行和最后一行的边对齐。

- space-around:所有行在容器中平均分布,相邻两行间距相等。容器的交叉轴起点边和终点边分别与第一行和最后一行的距离是相邻两行间距的一半。

displaystringflex

确定该元素视图框的类型,该值暂不支持动态修改。可选值为:

- flex:弹性布局

- grid:网格布局

- none:不渲染此元素

grid-template-[columns|rows]string1行1列

用于设置当前网格布局行和列的数量,不设置时默认1行1列,仅当display为grid时生效。

示例:如设置grid-template-columns为:

- 50px 100px 60px:分三列,第一列50px,第二列100px,第三列60px;

- 1fr 1fr 2fr:分三列,将父组件允许的宽分为4等份,第一列占1份,第二列占一份,第三列占2份;

- 30% 20% 50%:分三列,将父组件允许的宽为基准,第一列占30%,第二列占20%,第三列占50%;

- repeat(2,100px):分两列,第一列100px,第二列100px;

- auto 1fr 1fr:分三列,第一列自适应内部子组件所需宽度,剩余空间分为两等份,第二列占一份,第三列占一份。

grid-[columns|rows]-gap<length>0用于设置行与行的间距或者列与列的间距,也可以支持通过grid-gap设置相同的行列间距,仅当display为grid时生效。
grid-row-[start|end]number-用于设置当前元素在网格布局中的起止行号,仅当父组件display样式为grid时生效(仅div支持display样式设置为grid)。
grid-column-[start|end]number-用于设置当前元素在网格布局中的起止列号,仅当父组件display样式为grid时生效(仅div支持display样式设置为grid)。

说明

不支持宽度相关样式。

事件

支持通用事件

方法

支持通用方法

示例

<!-- index.hml -->
<div class="container">
  <grid-container id="mygrid" columns="5" gutter="20px" style="background-color: pink;">
    <grid-row style="height:400px;justify-content:space-around;">
      <grid-col span="2">
        <div style="align-items: center;justify-content: center;height: 100%;width: 100%;">
          <text style="color: dodgerblue;" onclick="getCol">Element text</text>
        </div>
      </grid-col>
      <grid-col span="3" style="background-color:orange;">
        <div style="width: 100%;height: 100%;padding: 20px;align-items: center;">
          <text onclick="getColWidth">Element text</text>
        </div>
      </grid-col>
    </grid-row>
  </grid-container>
</div>
/* index.css */
.container {
  flex-direction: column;
  padding-top: 80px;
}
// index.js
import promptAction from '@ohos.promptAction';
export default {
  getCol(e) {
    this.$element('mygrid').getColumns(function (result) {
      promptAction.showToast({
        message: e.target.id + ' result = ' + result,
        duration: 3000,
      });
    })
  },
  getColWidth(e) {
    this.$element('mygrid').getColumnWidth(function (result) {
      promptAction.showToast({
        message: e.target.id + ' result = ' + result,
        duration: 3000,
      });
    })
  }
}

function [] = DWA1() %% close all; clear all; disp(‘Dynamic Window Approach sample program start!!’) %% x=[3 3 pi/2 0 0]';%初始状态XY方向角度 线速度 角速度 goal=[29,22];%目标位置 obstacle=[0 0];%障碍物位置 axis([0, 40, 0, 40]);%坐标轴范围 axis square %相同比例 grid on %网格线 %grid minor hold on %持续性 ROW = 40; %定义的行数 COL = 40; %列数 BOXWIDTH = 1; %宽度 BOXHEIGHT =1; %高度 mapgrid = zeros(ROW, COL); % %% for j=2:10 mapgrid(5,j)=1; end for j=2:15 mapgrid(24,j)=1; end for j=9:24 mapgrid(10,j)=1; end for j=20:31 mapgrid(15,j)=1; end for j=5:20 mapgrid(20,j)=1; end for j=18:23 mapgrid(28,j)=1; end for i=2:6 mapgrid(i,18)=1; end for i=17:20 mapgrid(i,5)=1; end for j=22:24 mapgrid(24,j)=1; end for i=13:17 mapgrid(i,13)=1; end %% for i = 1:ROW for j = 1:COL if mapgrid(i, j)>0 xx = (i-1)*BOXWIDTH; xy = (j-1)*BOXHEIGHT; obstacle=[obstacle;[xx xy]]; end end end obstacleR=1;%障碍物的半径 global dt;%全局变量 dt=0.2;%设置采样时间 %Kinematic=[5.0,toRadian(45.0),1,toRadian(30.0),0.1,toRadian(2)]; Kinematic=[1.0,toRadian(30.0),0.5,toRadian(20.0),0.05,toRadian(2)];%最高速度,最高旋转速度,加速度,旋转加速度,速度分辨率,旋转分辨率 evalParam=[0.1,0.2,0.1,0.02,2.0];%角速度评价函数,预测时间评价函数 result.x=[]; tic;%启动定时器 for target_idx = 1:size(goal1, 1) goal = goal1(target_idx, :); for i = 1:600 % 计算控制输入和路径轨迹 [u, traj] = DynamicWindowApproach(x, Kinematic, goal, evalParam, obstacle, obstacleR); % 更新状态 x = f(x, u); % 记录运动轨迹 end end result.x = [result.x; x’]; % 记录速度 vel_profile = [vel_profile; u(1)]; hold off; % 箭头的长度 ArrowLength = 2; % 绘制箭头(表示机器人朝向) quiver(x(1), x(2), ArrowLengthcos(x(3)), ArrowLengthsin(x(3)), ‘-r’); hold on; % 绘制轨迹(蓝色+号标记) plot(result.x(:,1), result.x(:,2), ‘+b’); hold on; % 绘制障碍物(基于栅格地图) for i = 1:ROW for j = 1:COL if maggrid(i, j) > 0 xx = (i-1)*BOXWIDTH; xy = (j-1)*BOXHEIGHT; rectangle(‘Position’, [xx, xy, BOXWIDTH, BOXHEIGHT],… ‘Curvature’, 0, ‘FaceColor’, ‘r’); end end end hold on; % 绘制目标点 plot(goal1(1), goal1(2), ‘rx’, ‘MarkerSize’, 10, ‘LineWidth’, 3); % 绘制预测轨迹(每隔5个点采样) if ~isempty(traj) for it = 1:floor(length(traj(:,1))/5) ind = 1 + (it-1)*5; plot(traj(ind,:), traj(ind+1,:), ‘-g’, ‘LineWidth’, 2); hold on; end end grid on; % 更新绘图窗口 drawnow; % 绘制速度曲线(单独窗口) figure; plot(1:length(vel_profile), vel_profile, ‘-m’, ‘LineWidth’, 1); title(‘速度图像’); xlabel(‘时间步’); ylabel(‘速度’); grid on; % 绘制角速度图像(单独窗口) figure; plot(1:length(omega_profile), omega_profile, ‘LineWidth’, 2); title(‘角速度图像’); xlabel(‘时间步’); ylabel(‘角速度’); grid on; % =============== 函数声明 =============== % 函数功能:基于动态窗口法的路径规划 % 输入参数: % x - 机器人当前状态 [x,y,θ,v,ω] % model - 机器人运动模型参数 % goal - 目标点坐标 [x_g,y_g] % evalParam- 评价函数权重参数 % ob - 障碍物坐标矩阵 [N×2] % R - 障碍物半径(或安全距离) % 输出参数: % u - 控制量 [v, ω] % trajDB - 评估的轨迹数据库 function [u, trajDB] = DynamicWindowApproach(x, model, goal, evalParam, ob, R) % 函数实现内容(此处未完整显示) % … % 输出驱动数据窗口 end % 计算动态窗口 Vr = CalcDynamicWindow(x, model); % 调用评价函数生成候选轨迹和评估结果 [evalDB, trajDB] = Evaluation(x, Vr, goal, ob, R, model, evalParam); % 检查是否有可行路径 if isempty(evalDB) disp(‘No path to goal!!’); u = [0, 0]; % 返回零控制量 return; end % 对评估结果进行归一化处理 evalDB = NormalizeEval(evalDB); % 存储评价结果 feval = []; for id = 1:length(evalDB(:,1)) % 加权计算综合评价值 (evalParam[1:4] * [heading,dist,vel,stopDist]) feval = [feval; evalParam(1:4) * evalDB(id,3:6)']; end evalDB = [evalDB, feval]; % 合并评价结果到原数据库 % 寻找最优控制量(最大评价值) [maxv, ind] = max(feval); u = evalDB(ind, 1:2)'; % 提取最优速度指令[v, w] %% 评价函数实现 function [evalDB, trajDB] = Evaluation(x, Vr, goal, ob, R, model, evalParam) % 初始化评价数据库 evalDB = []; trajDB = []; % 初始化评价数据库和轨迹数据库 evalDB = []; trajDB = []; % 遍历动态窗口内的所有速度组合 for vt = Vr(1):model(5):Vr(2) % 线速度采样 for ot = Vr(3):model(6):Vr(4) % 角速度采样 % 1. 轨迹预测 [xt, yt, traj] = GenerateTrajectory(x, vt, ot, evalParam(5), model); % 2. 计算四项评价指标 heading = CalcHeadingEval(xt, goal); % 朝向评价 [dist, dTheta] = CalcDistEval(xt, yt, ob, R); % 障碍物距离评价 vel = abs(vt); % 速度绝对值 stopDist = CalcBreakingDist(vel, model); % 制动距离 % 3. 安全判定:当前距离是否大于制动距离 if dist > stopDist % 存储评价结果 [线速度, 角速度, 朝向分, 距离分, 速度分, 角度差] evalDB = [evalDB; [vt, ot, heading, dist, vel, dTheta]]; % 存储对应轨迹 trajDB = [trajDB; traj]; end end end function EvalDB = NormalizeEval(EvalDB) % 对评价结果各列进行归一化处理(按列求和归一) % 第3列:朝向评价(heading) if sum(EvalDB(:,3)) ~= 0 EvalDB(:,3) = EvalDB(:,3)/sum(EvalDB(:,3)); end % 第4列:障碍物距离评价(dist) if sum(EvalDB(:,4)) ~= 0 EvalDB(:,4) = EvalDB(:,4)/sum(EvalDB(:,4)); end % 第5列:速度评价(vel) if sum(EvalDB(:,5)) ~= 0 EvalDB(:,5) = EvalDB(:,5)/sum(EvalDB(:,5)); end % 第6列:角度差评价(dTheta) if sum(EvalDB(:,6)) ~= 0 EvalDB(:,6) = EvalDB(:,6)/sum(EvalDB(:,6)); end end function [x, y, traj] = GenerateTrajectory(x, vt, ot, evaldt, model) % 生成单条预测轨迹 % 输入: % x - 初始状态 [x,y,θ,v,ω] % vt - 目标线速度 % ot - 目标角速度 % evaldt - 预测时长 % model - 机器人模型参数 % 输出: % x - 终点状态 % y - 上一状态 % traj - 完整轨迹(N×5矩阵) global dt; % 仿真时间步长(需在主程序定义) time = 0; u = [vt, ot]; % 控制输入 traj = x; % 初始化轨迹 while time <= evaldt time = time + dt; y = x; % 保存上一状态 x = f(x, u); % 状态更新(需实现运动模型f) traj = [traj; x]; % 垂直拼接轨迹点 end end function stopDist = CalcBreakingDist(vel, model) % 计算机器人从当前速度减速到停止所需距离 % 输入: % vel - 当前线速度 (m/s) % model - 机器人模型参数 […, max_accel, …] % 输出: % stopDist - 制动距离 (m) global dt; % 仿真时间步长(需在主程序中定义) stopDist = 0; % 初始化制动距离 while vel > 0 % 计算当前时间步内移动的距离 stopDist = stopDist + vel * dt; % 应用减速度(model(3)为最大减速度) vel = vel - model(3) * dt; % 确保速度不会变为负值 vel = max(vel, 0); end end function [dist, dTheta] = CalcDistEval(x, y, ob, R) % 计算当前轨迹点与障碍物的最小距离和角度差 % 输入: % x,y - 当前轨迹点坐标和状态 [x,y,θ,…] % ob - 障碍物坐标矩阵 (N×2) % R - 障碍物半径/安全距离 % 输出: % dist - 最小距离(最大不超过2R) % dTheta - 障碍物相对角度差(归一化值) % 初始化最小距离(无障碍物时的默认值) dist = 100; io1 = 0; % 最近障碍物索引 % 遍历所有障碍物 for io = 1:size(ob, 1) % 计算障碍物到当前点的距离(考虑障碍物半径) disttmp = norm(ob(io,:) - x(1:2)') - R; % 更新最小距离 if dist > disttmp dist = disttmp; io1 = io; end end % 计算障碍物角度差 if io1 ~= 0 obline = ob(io1,:); % 最近障碍物坐标 if dist > 50 dTheta = 20; % 无障碍物时的默认角度差 else % 计算障碍物相对角度(转换为度) obs_angle = atan2d(obline(2)-x(2), obline(1)-x(1)); robot_angle = rad2deg(x(3)); dTheta = abs(obs_angle - robot_angle) / 10; % 归一化 end else dTheta = 20; % 无障碍物时的默认值 end % 限制最大评价距离 if dist >= 2*R dist = 2*R; end end function heading = CalcHeadingEval(x, goal) % 计算机器人当前朝向与目标点方向的角度差评价 % 输入: % x - 机器人状态 [x,y,θ,…] (θ为弧度制) % goal - 目标点坐标 [x_g,y_g] % 输出: % heading - 朝向评价值(0-180度,越大表示对准越好) % 转换为角度制(修正原toDegree未定义问题) theta_deg = rad2deg(x(3)); % 机器人当前朝向(角度) goal_deg = atan2d(goal(2)-x(2), goal(1)-x(1)); % 目标方向(角度) % 计算最小角度差(0-180度范围) targetTheta = abs(wrapTo180(goal_deg - theta_deg)); % 转换为评价指标(180度时最佳对准,0度时最差) heading = 180 - targetTheta; end整理这个代码,按照要求正常运行,在matlab正常运行
05-14
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值