OHIF Viewer (3.9版本最新版) 适配移动端——最后一篇

news2024/12/23 10:29:43

根据一些调用资料和尝试,OHIF 的底层用的是Cornerstonejs ,这个是基于web端写的,如果说写在微信小程序里,确实有很多报错,

第一个问题就是 npm下载的依赖,

一、运行环境差异

微信小程序的运行环境与传统的 Node.js 环境有很大不同。小程序在微信客户端中运行,有严格的安全限制和性能要求。而 npm 包通常是为 Node.js 环境设计的,其中可能包含一些在小程序环境中不被支持的代码或依赖项。

二、构建机制不同

  1. 小程序有自己特定的构建体系。微信小程序使用自己的开发工具进行构建和打包,这个过程与基于 npm 和 Webpack 等工具的传统前端构建流程不同。小程序的构建工具主要针对小程序的特定结构和需求进行优化,不一定能直接处理 npm 包的复杂依赖关系。
  2. 小程序的代码结构通常是由多个页面和组件组成,每个页面和组件都有自己独立的代码文件。这种结构与传统的基于模块的前端项目有所不同,也使得直接引入 npm 包变得更加困难。

第二个 修改的话很考验技术,得修改js文件,而且不保证是否能运行起来

第三个 ohif 最新版用的react+ hooks 框架写的,很多组件都是已经封装好,要是另外写的话 ,也很考研技术

现在是用手机模式写的适配移动端

第一个:

platform\app\src\utils\isMobile.ts

创建一个ts文件 用来判断现在是否处于移动端模式

export default function isMobile(): boolean {
  const pattern: RegExp = new RegExp(
    'Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini'
  );
  return pattern.test(navigator.userAgent);
}

第二个:

extensions\default\src\ViewerLayout\index.tsx

在这个里面是基础查看器的布局位置,我们先通过这个文件来找到 导航栏、左侧面板、右侧面板、·中间影像的查看器、以及工具栏的工具们的组件位置

导航栏 的移动端改造

原来的导航栏的组件组件 是

extensions\default\src\ViewerLayout\ViewerHeader.tsx  
这个里面的   Header
platform\ui\src\components\Header\Header.tsx
里面有个NavBar
platform\ui\src\components\NavBar\NavBar.tsx
这个是控制外面那个容器的 

我把它改成 没有下拉菜单的 ,都横着展示出来,所以要自己写一套组件组件出来或者直接判断 写两个return也可以

组件们都在

platform\ui\src\components  这个下面,如果想要自己新建一个组件的话,就来这里,记得导出,建完文件夹以后,还得导出
有两个index.js里面 写上新建的组件
platform\ui\src\components\index.js
platform\ui\src\index.js
这两个里面都得加上,不然你的组件没有办法使用

里面图标的具体 控制

 extensions\default\src\Toolbar\ToolbarSplitButtonWithServices.tsx
 这个里面的
  <SplitButton
        primary={primary}
        secondary={secondary}
        items={getSplitButtonItems(items)}
        groupId={groupId}
        renderer={listItemRenderer}
        onInteraction={onInteraction}
        Component={props => (
          <PrimaryButtonComponent
            {...props}
            servicesManager={servicesManager}
          />
        )}
      />

我先建了一个SplitButtonAPP的组件,在新的组件里面的把按钮拆成一长条,具体代码

import React, { useState } from 'react';
import PropTypes from 'prop-types';
import classNames from 'classnames';
import OutsideClickHandler from 'react-outside-click-handler';
import { useTranslation } from 'react-i18next';

import Icon from '../Icon';
import Tooltip from '../Tooltip';
import ListMenu from '../ListMenu';

const baseClasses = {
  Button: 'flex flex-col items-center rounded-md border-transparent group/button',
  Primary: 'flex flex-col items-center text-center',
  Content: 'flex flex-row space-x-4',
};

const classes = {
  Button: () => classNames(baseClasses.Button, 'hover:!bg-primary-dark hover:border-primary-dark'),
  Primary: ({ isActive }) =>
    classNames(
      baseClasses.Primary,
      isActive
        ? 'border-primary-light bg-primary-light rounded-md'
        : 'border-secondary-dark bg-secondary-dark group-hover/button:border-primary-dark group-hover/button:text-primary-light hover:!bg-primary-dark hover:border-primary-dark'
    ),
  Content: () => classNames(baseClasses.Content),
};

const DefaultListItemRenderer = props => {
  const { t, icon, label, className, isActive } = props;
  return (
    <div
      className={classNames(
        'flex h-8 w-full select-none flex-row items-center p-3',
        'whitespace-pre text-base',
        className,
        `${isActive ? 'hover:opacity-80' : 'hover:bg-primary-dark'}`
      )}
    >
      {icon && (
        <span className="mr-4">
          <Icon
            name={icon}
            className="h-[28px] w-[28px]"
          />
        </span>
      )}
      <span className="mr-5">{t?.(label)}</span>
    </div>
  );
};

/**
 * SplitButton 组件是一个更通用的拆分按钮实现,没有isActive和其他交互属性
 * 它提供了一种在主按钮和次按钮之间切换,并展示相关选项列表的功能
 *
 * @param {object} props - 组件的属性对象
 * @param {string} props.groupId - 按钮组的ID,用于数据追踪
 * @param {object} props.primary - 主按钮的配置对象
 * @param {object} props.secondary - 次按钮的配置对象
 * @param {array} props.items - 列表菜单项的数组
 * @param {function} props.renderer - 渲染列表项的自定义函数
 * @param {function} props.onInteraction - 交互时触发的回调函数
 * @param {React.Component} props.Component - 渲染图标使用的组件,默认为Icon
 * @returns {JSX.Element} - 拆分按钮的JSX实现
 */
const SplitButtonAPP = ({
  groupId,
  primary,
  secondary,
  items,
  renderer = null,
  onInteraction,
  Component = Icon,
}) => {
  // 使用useTranslation钩子管理翻译
  const { t } = useTranslation('Buttons');

  // 渲染函数,如果未提供renderer则使用默认渲染函数
  const listItemRenderer = renderer || DefaultListItemRenderer;
  return (
    <div
      id="SplitButtonAPP"
      className={classes.Content()}
    >
      {items.map((item, index) => {
        const primaryClassNames = classNames(
          classes.Primary({
            isActive: item.isActive,
          }),
          item.className
        );
        return (
          <div
            key={item.id}
            className="flex flex-col items-center"
          >
            <Tooltip
              content={item.label}
              className="h-full"
            >
              <Component

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2103544.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

传输大咖38 | 如何应对汽车行业内外网文件交换挑战?

在数字化浪潮的推动下&#xff0c;汽车行业正经历着前所未有的变革。随着智能网联汽车的兴起&#xff0c;内外网文件的安全交换成为了一个亟待解决的问题。本文将探讨汽车行业在内外网文件交换中遇到的难题&#xff0c;并介绍镭速如何为这些问题提供有效的解决方案。 跨网文件传…

js封装上传组件 点击拖拽上传

效果图 上传组件代码 <template><div id"appp"><label for"fileInput" class"upload" dragover"fileDragover" drop"fileDrop" v-if"log ! checkLog"><!-- <div class"jia" …

CTFHub技能树-备份文件下载-.DS_Store

目录 方法一&#xff1a;直接访问/.DS_Store文件 方法二&#xff1a;使用Python-dsstore工具解析.Dsstore文件 方法三&#xff1a;直接使用crul访问/./.DS_Store文件 .DS_Store 是 Mac OS 保存文件夹的自定义属性的隐藏文件。通过.DS_Store可以知道这个目录里面所有文件的清单…

中西结合治疗帕金森怎么样

中西结合治疗帕金森怎么样 中西结合治疗帕金森病是一种综合运用中医和西医治疗方法的策略&#xff0c;旨在通过各自的优势来改善患者的症状、延缓病情进展&#xff0c;并提高生活质量。西医治疗帕金森病主要依赖药物治疗&#xff0c;如左旋多巴和多巴胺受体激动剂&#xff0c;…

基于web知识库管理系统设计与实现

第二章 系统分析 2.1 知识库管理系统可行性分析 可行性分析对系统的开发至关重要&#xff0c;可以大幅减少不必要的损失&#xff0c;保证系统开发的顺利进行。因此要对系统进行技术可行性、经济可行性两方面的系统可行性分析。 2.1.1技术可行性 随着网络技术日新月异的高速…

换热站可视化:提升热能管理效率

通过图扑 HT 搭建换热站可视化解决方案&#xff0c;实时监控与数据展示&#xff0c;优化热能分配与运行管理&#xff0c;提高能源效率并降低运营成本。

俄罗斯Ozon选品三要素,简单实用的选品方法

在 Ozon 上选品可以参考以下三个要素&#xff1a; 要素一&#xff1a;市场需求 关注热门品类&#xff1a;从 Ozon 的销售数据和市场趋势来看&#xff0c;像电子产品&#xff08;如手机、耳机、智能穿戴设备等&#xff09;、时尚服饰&#xff08;包括流行服装、鞋类、配饰&…

HTTPS访问是什么?

HTTPS&#xff08;Hypertext Transfer Protocol Secure&#xff09;是一种安全的网络传输协议&#xff0c;它基于HTTP&#xff08;Hypertext Transfer Protocol&#xff0c;超文本传输协议&#xff09;进行工作&#xff0c;但增加了安全性的要求。HTTPS通过在客户端&#xff08…

glsl着色器学习(八)通用模板

下面是一个简单的通用WebGL模板 Study.html <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><title>Doc…

QQ聊天记录删除了怎么恢复?学会这3个方法,简单又有效

QQ作为我们日常沟通的重要工具之一&#xff0c;其聊天记录往往承载着许多珍贵的记忆和重要的信息。但在操作中我们会不小心删除或丢失这些聊天记录&#xff0c;那么QQ聊天记录删除了怎么恢复就成为我们急切需要解决的问题。先别急&#xff0c;本文就为你介绍3种简单又有效的QQ聊…

SpringBoot 大学生体质测试管理系统

摘要 大学生体质测试管理系统提供给用户一个简单方便体质测试管理信息&#xff0c;通过留言区互动更方便。本系统采用了B/S体系的结构&#xff0c;使用了java技术以及MYSQL作为后台数据库进行开发。系统主要分为系统管理员、教师和用户三个部分&#xff0c;系统管理员主要功能…

【STM32+HAL库】---- 驱动DHT11温湿度传感器

硬件开发板&#xff1a;STM32F407VET6 软件平台&#xff1a;cubemaxkeilVScode1 DHT11工作原理 1.1 简介 DHT11温湿度传感器是一种数字式温湿度传感器&#xff0c;其工作原理基于集成了湿度感测元件和NTC温度感测元件的传感器模块。以下是DHT11温湿度传感器的工作原理&#x…

【安全生产】叉车安全带报警器有哪些特点?

叉车安全带报警器是用于防止在叉车发生猛烈碰撞或紧急制动时&#xff0c;司机不与方向盘、挡风玻璃等发生二次碰撞或抛出车外&#xff0c;从而造成的严重伤害的一种叉车安全装置、配件。 很多司机在开叉车时经常有不系安全带的习惯&#xff0c;有很多不负责任的人会认为&#…

智能水培机

目录 一. 选型 1.1 Lichee RV Dock 1.1.1 芯片&#xff1a;D1-H 1.1.2 镜像选择&#xff1a;Tina Linux 二. QT上位机 2.1 选择ID 2.2 主界面刷新数据 2.2.1 设置定时器 2.2.3 定义查询数据库表qtnew的函数checkNew_data 2.2.2 定义槽函数 Refresh_data 2.3 主界面按…

讨论运维监控工具的普及程度

在讨论运维监控工具的普及程度时&#xff0c;加入PIGOSS BSM产品的分析是非常有意义的&#xff0c;因为PIGOSS BSM是一款在中国市场具有一定影响力的运维监控工具。 PIGOSS BSM运维监控工具是一款综合性的IT运维监控解决方案&#xff0c;它能够对多层次的IT资源进行监测&#x…

2024.09.04【读书笔记】|如何使用GATK ASEReadCounter工具进行ASE(等位基因特异性表达)分析

准备数据&#xff1a; 获取基因组序列&#xff08;FASTA格式&#xff09;和对应的基因组注释文件&#xff08;GTF或GFF格式&#xff09;。获取样本的BAM文件&#xff0c;确保这些文件已经过排序和索引。获取变异信息文件&#xff08;VCF格式&#xff09;&#xff0c;包含样本的…

运动耳机哪个牌子的好?精选5款值得入手的骨传导运动耳机分享!

在过去的两年里&#xff0c;骨传导耳机逐渐被大众的所熟知。可能毕竟长时间使用音量过大的传统入耳式耳机&#xff0c;多多少少会对我们的听力健康构成威胁。所以很多人就想找一款不伤耳朵的耳机。然后就了解到了骨传导耳机&#xff0c;所以就会延伸出这些问题——骨传导耳机好…

【效率工具】推荐五款电脑桌面软件,轻量好用!

电脑桌面软件可以帮助我们在电脑上创建分区&#xff0c;然后将文件、文件夹、应用程序等图标整理到对应的分区中&#xff0c;方便我们精准访问文件。不同的电脑桌面软件功能可能存在一些差异&#xff0c;本文分享几个常用的桌面整理工具&#xff0c;以及一些以及分享一些关于电…

EvoSuite使用总结

1.安装EvoSuite插件 以IDEA为例&#xff0c;在Plugins栏搜索EvoSuite后点击install&#xff0c;安装完成后重启IDEA 2.使用EvoSuite 选中文件右键选择Run EvoSuite 生成成功可以看到如下提示&#xff1a; 注意事项&#xff1a; 生成路径&#xff1a;src/test/java 使用juni…

【C++ 第十九章】异常

1.C语言传统的处理错误的方式 传统的错误处理机制&#xff1a; 终止程序&#xff0c;如 assert&#xff0c;缺陷&#xff1a;用户难以接受。如发生内存错误、除 0 错误时就会终止程序。 返回错误码&#xff0c;缺陷&#xff1a;需要程序员自己去查找对应的错误。如系统的很多库…