TypeScript + 移动端适配从入门到精通(适配黑科技大曝光)

TypeScript语言的移动应用开发 TypeScript是由微软开发的一种开源编程语言,是JavaScript的超集,支持任何JavaScript代码,并为其添加了可选的静态类型和面向对象编程的特性。TypeScript的设计目标是提高开发者的开发效率和代码质量,使得大型JavaScript项目的开发变得更加可维护和可靠。 阅读详情

第一章:TypeScript 与移动端适配概述

在现代前端开发中,TypeScript 已成为构建大型、可维护应用的首选语言。其静态类型系统有效减少了运行时错误,提升了代码的可读性与团队协作效率。尤其在移动端开发场景下,面对多样化的设备分辨率、浏览器兼容性以及性能限制,结合 TypeScript 可显著增强项目的健壮性和开发体验。

为何选择 TypeScript 进行移动端开发

  • 类型安全帮助开发者在编码阶段捕获潜在错误,减少移动端调试成本
  • 良好的 IDE 支持提供智能提示和重构能力,提升开发效率
  • 与主流框架(如 React Native、Ionic、Vue + Vite)深度集成,支持跨平台开发

移动端适配的核心挑战

移动端设备碎片化严重,主要体现在屏幕尺寸、像素密度和浏览器内核差异上。为实现一致用户体验,需采用响应式布局与动态缩放机制。常见的解决方案包括使用 viewport meta 标签、rem 或 vw 单位进行弹性布局。 例如,在 HTML 中设置视口以适配移动设备:
<meta name="viewport" content="width=device-width, initial-scale=1.0">
该元标签确保页面按设备宽度渲染,并禁止默认缩放,是移动端适配的基础配置。

TypeScript 在适配逻辑中的应用

通过 TypeScript 编写屏幕适配工具函数,可提高代码可靠性。以下是一个判断设备类型的辅助函数示例:
/**
 * 判断当前是否为移动设备
 * @returns boolean
 */
function isMobile(): boolean {
  return /Android|iPhone|iPad|iPod|Opera Mini/i.test(navigator.userAgent);
}

if (isMobile()) {
  document.body.classList.add('mobile-layout');
}
此函数利用正则匹配常见移动设备的 User-Agent,返回布尔值用于条件渲染或样式切换。
适配方案适用场景优点
REM 布局多尺寸屏幕等比缩放灵活性高,控制粒度细
Flexbox 布局内容动态排列无需精确计算尺寸
媒体查询差异化样式展示兼容性好,易于实现

第二章:TypeScript 基础在移动端的应用

2.1 TypeScript 类型系统在响应式布局中的实践

在构建响应式用户界面时,TypeScript 的类型系统为组件状态与屏幕断点的映射提供了静态保障。通过定义精确的布局配置类型,可有效避免运行时错误。
布局断点类型的定义
type Breakpoint = 'sm' | 'md' | 'lg';
interface LayoutConfig {
  [key in Breakpoint]: { cols: number; gutter: number };
}
上述代码定义了三种屏幕尺寸及其对应的网格列数和间距。TypeScript 的字面量类型和映射类型确保配置对象只能使用预设的断点值,提升了配置的可维护性。
响应式钩子中的类型推断
  • 利用泛型约束窗口大小监听器的返回类型
  • 联合类型结合条件渲染,实现视图层的类型安全切换
通过类型守卫函数判断当前断点,触发对应布局策略,使 UI 更新逻辑更清晰可靠。

2.2 接口与泛型在设备适配逻辑中的封装技巧

在构建跨平台设备管理系统时,接口与泛型的结合使用能显著提升代码的可扩展性与类型安全性。通过定义统一的行为契约,实现多设备类型的无缝接入。
设备适配的核心接口设计
type Device interface {
    Connect() error
    Disconnect() error
    Send(data []byte) error
    Receive() ([]byte, error)
}
该接口抽象了设备通信的通用流程,屏蔽底层硬件差异,便于上层逻辑调用。
泛型适配器封装不同设备类型
type Adapter[T Device] struct {
    device T
}

func (a *Adapter[T]) ExecuteCommand(cmd []byte) ([]byte, error) {
    if err := a.device.Connect(); err != nil {
        return nil, err
    }
    defer a.device.Disconnect()
    a.device.Send(cmd)
    return a.device.Receive()
}
利用泛型约束,确保传入类型符合 Device 接口,编译期即完成类型校验,避免运行时错误。
优势对比
方案类型安全复用性维护成本
普通接口低中高
泛型+接口高高低

2.3 模块化开发提升移动端代码可维护性

模块化开发通过将功能拆分为独立、可复用的单元,显著提升了移动端项目的可维护性。每个模块专注于单一职责,降低耦合度,便于团队协作与测试。
模块结构示例

// userModule.js
export const getUserInfo = (id) => {
  return fetch(`/api/users/${id}`).then(res => res.json());
};

export const updateUserInfo = (id, data) => {
  return fetch(`/api/users/${id}`, {
    method: 'PUT',
    body: JSON.stringify(data)
  });
};
上述代码定义了一个用户模块,封装了与用户相关的数据操作。通过 ES6 模块语法导出函数,可在其他组件中按需引入,避免全局污染。
模块化优势对比
特性传统开发模块化开发
代码复用性低高
维护成本高低
团队协作困难高效

2.4 使用装饰器优化移动端组件行为

在移动端开发中,组件行为的复用与优化至关重要。装饰器提供了一种优雅的方式,用于增强组件功能而无需修改其内部逻辑。
装饰器的基本应用
通过装饰器可以轻松实现日志记录、性能监控或防抖操作。例如,为组件方法添加点击节流:

function throttle(delay) {
  return function (target, key, descriptor) {
    let timer = null;
    const original = descriptor.value;
    descriptor.value = function (...args) {
      if (!timer) {
        timer = setTimeout(() => {
          clearTimeout(timer);
          timer = null;
        }, delay);
        original.apply(this, args);
      }
    };
    return descriptor;
  };
}

class MobileButton {
  @throttle(300)
  onClick() {
    console.log("按钮被点击");
  }
}
上述代码中,`@throttle(300)` 确保短时间内多次触发只执行一次,有效防止误触,提升用户体验。
优势对比
  • 逻辑解耦:将通用行为抽离至装饰器
  • 代码简洁:无需在每个方法中重复控制逻辑
  • 可复用性强:同一装饰器可用于多个组件

2.5 编译配置与构建优化适配多端环境

在跨平台开发中,统一的编译配置是实现多端适配的关键。通过灵活的构建系统,可针对不同目标平台自动切换参数。
构建变量定义
使用条件编译变量区分平台特性:

{
  "compilerOptions": {
    "target": "es2017",
    "module": "esnext",
    "strict": true,
    "conditionalCompilation": {
      "web": { "outDir": "dist/web" },
      "mobile": { "outDir": "dist/android" }
    }
  }
}
该配置通过 conditionalCompilation 指定不同输出路径,结合环境变量触发对应构建流程。
优化策略对比
策略适用场景压缩率
Tree ShakingESM模块高
Code Splitting大型应用中

第三章:移动端视觉适配核心技术

3.1 rem 与 vw 单位的动态计算原理与实现

CSS 中的 `rem` 和 `vw` 是实现响应式布局的核心单位,其动态计算依赖于根元素或视口尺寸的变化。
rem 的计算机制
`rem`(root em)相对于根元素(html)的字体大小。默认情况下,浏览器根字体为 16px,因此 1rem = 16px。可通过设置 html 字体大小动态调整 rem 基准:
html {
  font-size: 16px; /* 基准值 */
}
.component {
  font-size: 1.25rem; /* 1.25 × 16 = 20px */
}
通过 JavaScript 动态修改 `html` 的 `font-size`,可实现基于设备宽度的等比缩放。
vw 的响应式特性
`vw`(viewport width)表示视口宽度的 1%,即 100vw = 视口总宽度。适合全屏布局适配:
.header {
  height: 10vh; /* 视口高度的 10% */
  padding: 2vw; /* 水平边距为视口宽度的 2% */
}
结合 `rem` 与 `vw` 可构建灵活的混合布局体系,提升跨设备兼容性。

3.2 基于屏幕密度的高清方案(dpr 适配)实战

在高分辨率移动设备普及的今天,利用设备像素比(devicePixelRatio,简称 dpr)实现高清显示成为前端适配的关键策略。通过识别不同屏幕的 dpr 值,动态调整页面的缩放与资源加载,可有效提升视觉清晰度。
核心适配逻辑
通常结合 viewport 设置与 JavaScript 动态计算:
const dpr = window.devicePixelRatio || 1;
const scale = 1 / dpr;
document.querySelector('meta[name="viewport"]').setAttribute(
  'content',
  `width=device-width, initial-scale=${scale}, maximum-scale=${scale}, minimum-scale=${scale}, user-scalable=no`
);
上述代码根据 dpr 缩小初始缩放比例,使 CSS 像素与物理像素对齐,避免图像模糊。
图片资源匹配
使用多倍图配合媒体查询:
  • 1x 图用于 dpr=1 的屏幕
  • 2x 图适配 dpr≥2 的设备
  • 3x 图覆盖高端移动端(如 iPhone Pro Max)
通过此方案,页面元素与图像在各类高清屏上均能保持细腻呈现。

3.3 viewport 动态设置与 flexible.js 思路解析

在移动端适配中,`viewport` 的动态设置是实现响应式布局的关键。通过 JavaScript 动态调整 `meta viewport` 的缩放比例,可使页面完美适配不同 DPR(设备像素比)的屏幕。
flexible.js 核心逻辑
该脚本根据设备宽度和 dpr 动态计算根字体大小,并设置 viewport 缩放:

(function flexible(window, document) {
  const docEl = document.documentElement;
  const dpr = window.devicePixelRatio || 1;

  // 设置 data-dpr 属性
  docEl.setAttribute('data-dpr', dpr);

  // 动态设置 rem 基准值
  function setRemUnit() {
    const rem = docEl.clientWidth / 10;
    docEl.style.fontSize = rem + 'px';
  }

  setRemUnit();
  window.addEventListener('resize', setRemUnit);
})(window, document);
上述代码将页面分为 10 个 `rem` 单位,实现等比缩放。`data-dpr` 属性可用于 CSS 中针对不同像素比做样式适配。
适配流程图
设备尺寸 → 计算 dpr → 设置 viewport → 调整 rem 基准 → 页面自适应

第四章:工程化解决方案与黑科技揭秘

4.1 自动化 px 转 rem 的 TypeScript 插件开发

在现代前端工程中,响应式单位转换是提升适配能力的关键环节。通过开发 TypeScript 插件,可实现 CSS 中 `px` 到 `rem` 的自动化转换。
插件核心逻辑
使用 AST(抽象语法树)解析样式代码,识别像素值并按基准字体大小换算:

function transformPxToRem(css: string, baseFontSize = 16): string {
  return css.replace(/(\d+)px/g, (match, pixelValue) => {
    const rem = parseFloat(pixelValue) / baseFontSize;
    return `${rem.toFixed(3)}rem`;
  });
}
上述函数遍历所有 `px` 单位,基于默认 16px 的根字体计算对应 `rem` 值,保留三位小数以平衡精度与可读性。
配置选项设计
  • baseFontSize:设定 rem 换算基数,默认为 16
  • include:指定需处理的文件路径模式
  • exclude:排除特定目录或文件

4.2 利用 CSS-in-JS 实现运行时适配策略

在动态化 UI 构建中,CSS-in-JS 不仅提升了样式的可维护性,更为运行时主题与布局适配提供了强大支持。通过 JavaScript 动态生成样式,开发者可在运行时根据设备特性或用户偏好调整视觉表现。
核心优势
  • 动态变量注入:实时响应主题切换
  • 作用域隔离:避免全局样式污染
  • 条件化渲染:按环境生成对应样式规则
代码实现示例
const useThemeStyles = (theme) => {
  const styles = {
    button: {
      padding: '10px 20px',
      backgroundColor: theme.primary,
      color: theme.text,
      borderRadius: theme.rounded ? '8px' : '0px'
    }
  };
  return styles;
};
上述代码定义了一个基于传入主题对象动态生成按钮样式的 Hook。theme.primary 控制背景色,theme.rounded 决定圆角程度,实现无需重新编译的界面适配。

4.3 移动端调试利器:虚拟手势与设备模拟集成

在现代前端开发中,精准还原移动端用户操作行为是保障体验的关键。Chrome DevTools 提供了强大的设备模拟功能,支持自定义分辨率、DPI 与触摸事件注入。
虚拟手势的程序化触发
通过命令行或 Puppeteer 可模拟真实手势:

await page.touchscreen.tap(300, 400);
// 模拟在坐标 (300,400) 处的轻触
await page.touchscreen.scroll(0, -200);
// 垂直上滑 200 像素
上述 API 能精确控制触摸点位与动作轨迹,适用于测试滑动刷新、手势解锁等交互场景。
多设备模拟配置对比
设备类型屏幕尺寸像素密度默认方向
iPhone 13390×8443xPortrait
Pixel 5393×8512.75xPortrait
Galaxy S22360×7803.5xLandscape
利用该配置表可在 CI 环境中批量运行响应式测试,确保跨设备一致性。

4.4 灵感来自大厂的“零感知适配”架构设计

在大型互联网系统中,“零感知适配”指用户在后台服务升级、迁移或扩容过程中完全无感。这一理念源于头部科技公司对高可用与无缝体验的极致追求。
核心设计原则
  • 动态配置驱动,避免硬编码依赖
  • 接口兼容性保障,支持双向降级
  • 流量灰度切换,实现平滑过渡
典型代码结构
// Adapter 路由适配器示例
func NewAdapter(version string) Service {
    switch version {
    case "v1":
        return &LegacyService{}
    case "v2":
        return &ModernService{}
    default:
        return &DefaultFallback{}
    }
}
该函数根据运行时版本标识返回对应服务实例,调用方无需感知底层实现变更,仅通过配置中心动态调整 version 值即可完成服务切换。
数据同步机制
使用双写日志(Dual Write Log)确保新旧系统状态一致性,配合异步补偿任务修复潜在差异。

第五章:总结与未来适配技术展望

随着系统架构的持续演进,适配不同环境的能力已成为软件韧性的核心指标。现代应用不再局限于单一部署形态,而是需要在云原生、边缘计算和混合部署场景中无缝切换。
弹性配置策略
通过动态配置中心实现运行时适配,例如使用 etcd 或 Consul 存储环境相关参数。服务启动时拉取对应配置,避免硬编码:

config, err := LoadConfigFromEtcd(env)
if err != nil {
    log.Fatalf("failed to load config: %v", err)
}
server := NewServer(config)
server.Start()
多环境构建流程
CI/CD 流程中集成环境感知构建脚本,确保输出产物具备上下文适配能力。常用实践包括:
  • 使用 Docker 多阶段构建分离测试与生产镜像
  • 通过 Helm values.yaml 管理 K8s 部署差异
  • 利用 Terraform workspace 实现跨区域基础设施部署
服务网格透明适配
基于 Istio 的流量治理能力,可在不修改代码的前提下实现版本灰度、地域路由等高级适配功能。典型配置如下:
场景配置方式生效范围
灰度发布VirtualService + Subset命名空间内
故障转移DestinationRule + OutlierDetection跨集群
[用户] → [入口网关] → [服务A] ↔ [配置中心] ↘ [服务B] → [远程API]
基于 Vue3 的 Uniapp 移动端跨平台开发脚手架 基于 Uniapp + Vue3 + Typescript 的移动端跨平台快速开发脚手架 阅读详情

相关推荐

国央企创新负责人如何通过平台提升技术需求挖掘与资源配置的精准性?.docx

国央企创新负责人如何通过平台提升技术需求挖掘与资源配置的精准性?

【鸿蒙App】TypeScript应用开发主流IDE及示例配置

轻量、免费、对 TypeScript 原生支持最好,插件生态丰富。:功能全面,适合大型项目,但需付费。:支持全栈开发(如搭配 Spring Boot)。

Flask Web 1587

两路半桥LLC谐振变换器软开关Simulink仿真(模拟谐振参数不同、分裂电容)

内容概要:本文介绍了“两路半桥LLC谐振变换器软开关Simulink仿真”资源包,重点在于基于Simulink平台对两路半桥LLC谐振变换器进行高精度建模与动态仿真,特别考虑了谐振参数不一致及分裂电容等非理想工况对系统性能的影响。该仿真模型不仅涵盖了主电路拓扑、软开关实现机制与谐振网络设计,还深入分析了不同参数配置下系统的启动特性、稳态效率、动态响应及软开关条件的满足情况。通过参数扫描与对比仿真,帮助用户掌握LLC变换器的关键设计要素与优化方法,具备较强的工程指导价值和科研教学意义。; 适合人群:电力电子、电气工程及其自动化等相关专业的高校师生,以及从事高频开关电源、新能源变换器、车载充电机等领域的研发工程师和技术人员。; 使用场景及目标:① 掌握两路并联半桥LLC谐振变换器的建模与仿真方法;② 理解软开关技术在提升变换器效率与降低EMI方面的关键作用;③ 分析谐振参数偏差与分裂电容结构对系统均流特性、增益曲线及软开关范围的影响;④ 支持科研项目中的拓扑验证、控制策略开发与故障工况分析; 阅读建议:建议结合Simulink仿真模型与配套说明文档进行学习,重点关注谐振腔参数设置、驱动时序设计及软开关波形观测;可通过调整谐振电感、电容值或引入参数失配,观察系统行为变化,深入理解LLC变换器的稳定边界与优化设计原则。

如何用TypeScript打造自适应移动端应用?90%开发者忽略的3个细节

掌握TypeScript移动端适配核心技巧,解决响应式布局、屏幕密度适配与触摸事件兼容问题。通过类型安全提升代码稳定性,结合Flex布局与rem单位实现精准适配,适用于H5与混合开发场景。90%开发者忽略的关键细节解析,值得收藏。

Instrustar的博客 277

双向全桥CLLC谐振变换器仿真模型(Simulink仿真实现)

内容概要:本文系统介绍了双向全桥CLLC谐振变换器的Simulink仿真模型,重点阐述了变频控制、闭环仿真及其与多种电力电子拓扑(如维也纳整流器、DAB变换器、图腾柱PFC等)的联合仿真设计。资源包涵盖2.5kW双向全桥LLC、V2G电动汽车充放电系统、三相PFC、多相交错LLC等多种变换器的仿真案例,并深入展示了三电平VIENNA整流器在双闭环PI控制与SVPWM调制策略下,结合上下电容电压差值补偿实现中点电位平衡的先进控制方法。通过仿真验证,该策略不仅有效维持了800V直流母线电压的稳定,还在动态工况下显著提升了电容电压的均衡度,同时保持了较低的输入电流THD,充分体现了SVPWM与中点平衡控制协同优化的技术优势。; 适合人群:具备电力电子与自动控制理论基础,从事新能源发电、电动汽车、工业电源、微电网等领域的研究生、工程师及科研人员。; 使用场景及目标:① 学习并构建高频谐振变换器(如LLC、CLLC)的Simulink仿真模型,掌握其变频与混合控制策略;② 深入理解并应用中点电位平衡、双闭环PI控制、SVPWM调制等核心技术于VIENNA等三电平变换器中;③ 复现高水平期刊论文中的控制算法,服务于科研项目申报、学术论文撰写或工程产品开发。; 阅读建议:该资源为综合性仿真资料库,建议使用者结合自身研究方向(如电动汽车充电、新能源并网)选择对应案例进行精学,重点关注控制策略的设计逻辑、仿真参数的整定方法以及SVPWM与中点平衡的协同机制,并充分利用附带的计算书和参考文献深化理解,以实现从仿真模型到实际工程应用的顺利转化。

全桥LLC谐振(变频+移相混合控制)变换器闭环仿真模型(Simulink仿真实现)

全桥LLC谐振(变频+移相混合控制)变换器闭环仿真模型(Simulink仿真实现)

typescript+react实现拖拽(移动端+PC端)

1.移动端 .tsx代码: import React, { Component, createRef } from "react"; import './Drag.less' interface Props { } interface State { } class Drag extends Component<Props, State>{ startX: number = 0 startY: number = 0 X: number = 0 ...

YanG_2859390447的博客 789

虚拟同步发电机(VSG)惯量阻尼自适应控制仿真模型(simulink仿真实现)

内容概要:本文提供了“虚拟同步发电机(VSG)惯量阻尼自适应控制仿真模型”的Simulink仿真实现方法,系统阐述了如何通过仿真手段研究VSG在电力系统中的动态响应特性,重点聚焦于其惯量与阻尼的自适应控制策略。文中详细说明了模型构建流程,涵盖控制算法设计、参数调节、根轨迹分析等内容,并通过对比不同调节系数下的系统响应,深入探讨了控制参数对系统稳定性与动态性能的影响。该仿真模型有效复现了VSG模拟传统同步发电机惯性与阻尼特性的能力,对于提升新能源并网系统的频率稳定性和抗扰动能力具有重要研究价值。; 适合人群:具备电力系统、自动化或相关领域基础知识,从事新能源并网、微电网控制、电力电子与电力系统仿真研究的研究生、科研人员及工程师。; 使用场景及目标:①用于教学与科研中深入理解虚拟同步发电机的工作原理及其在现代电力系统中的应用;②为新能源发电系统接入电网时的稳定性分析与控制策略设计提供仿真验证平台;③支持对VSG控制参数进行优化,提升系统应对负荷波动和扰动的能力。; 阅读建议:建议读者结合Matlab/Simulink软件动手实践,按照文档结构逐步搭建仿真模型,重点关注控制环路设计与参数整定部分,同时参考提供的代码与仿真结果进行对比分析,以加深对VSG自适应控制机制的理解。

Vue+Typescript的移动端项目模板

#Github地址: https://github.com/pppercyWang/vue-typesctipt-mobile

weixin_42565137的博客 1127

RTL8211F千兆PHY原理图与PCB设计:从手册到量产的完整指南

在工业网关、边缘计算和FPGA/CPU以太网扩展设计中,千兆PHY芯片的稳定运行取决于外围电路的精细设计。RTL8211F(I)作为应用广泛的物理层收发器,其原理图设计涉及电源域划分、时钟与复位时序、RGMII/ MDIO接口匹配以及MDI差分网络等多个环节。正确理解数据手册的阅读顺序,掌握100Ω差分阻抗控制、等长约束和EMI布局技巧,是保证链路可靠性和信号完整性的关键。本文从芯片选型与数据手册解析切入,系统梳理从电源去耦到PCB布局布线的工程实践要点,帮助工程师规避Link不稳定、MDIO读取失败、吞吐

weixin_28721917的博客 354

ArcGIS属性表汉字转拼音

接着我安装了一个编辑器“PyCharm Community Edition 2019.3.3\bin\pycharm64.exe”,在里面添加“pypinyin”包,然后将其设置为arcgis的编辑器和调试程序,还是失败;我在10.6的机器上折腾了上面几步,直到两周后脚本突然运行成功,我也不确定是哪一步导致pypinyin包配置成功,因此将心得体会写出来,如果过一段时间,打开10.2的机器运行脚本成功了,再写后续.......,按照“配置方法1:”进行尝试,显示配置失败。

2301_77413856的博客 1296

基于Vue + Typescript开发的Ego移动端购物商城

Ego 移动端购物商城 基于vue2.0 + typescript技术开发的移动端项目, 使用官方推荐最新的脚手架搭vue-cli 3.x搭建 开发者:稻草叔叔 项目地址:github.com/vincentSea/… 界面 项目所有的界面都是自己设计的, 当然肯定有参考因素存在。 技术栈 核心: vue + typescript +...

weixin_34111790的博客 744

背靠背VSC直流母线电压控制与同步发电机并网发散问题:原理、分析与解决方案

背靠背VSC直流母线电压控制与同步发电机并网发散问题分析 摘要: 本文研究了背靠背VSC系统在整流侧由理想三相电源切换为同步发电机时出现的直流母线电压振荡和发散问题。通过理论分析发现,锁相环同步失稳、等效阻抗失配和直流母线电容参数失配是导致系统失稳的关键因素。当整流侧接入同步发电机后,系统形成正反馈振荡回路,同时等效电感增大导致电流环响应速度降低,直流侧电容容量不足无法吸收发电机功率波动。文章提出了从跟网型控制到构网型VSG控制的完整升级方案,包含详细的MATLAB/Simulink建模和控制算法实现,并通

huanghm88的专栏 122

React+Typescript构建移动端网易云音乐

项目地址,如果对您有帮助的话,请帮我点一个star,万分感谢 (首先感谢提供 接口该github库提供网易云API) 1、项目介绍(图片未加载成功,建议翻墙) 1)说明:本系统为react+typescript构建移动端网易云音乐 2)所用技术 react+typescript+axios+sass 3)项目截图 推荐音乐页面: 热歌榜: 搜索页面: 歌单页面: 播放页面: 下载页面...

yuanqi3131的博客 636

Android 13.0 双屏时触摸失效问题排查与修复

摘要:本文记录了RK3588 Android12开发板上主屏触摸失效问题的排查与解决过程。通过分析发现,USB触摸设备被错误关联到辅屏(displayId=3)而非主屏(displayId=0)。解决方案是修改TouchInputMapper.cpp,强制触摸设备使用INTERNAL viewport(主屏),并保持设备在viewport不活跃时仍启用。该修改涉及约40行代码,有效解决了多显示器环境下触摸设备错误映射的问题,同时提供了详细的调试方法和注意事项。

ip0417的博客 354

YOLOv8改进 | 特殊场景检测篇 | 最新的多尺度特征提取DICAM(全网独家首发,增强水下图像的质量)

本文给大家带来的最新改进机制是多尺度特征提取和通道注意力机制DICAM,深度Inception和通道注意力模块(DICAM)主要用于用于增强水下图像的质量、对比度和色偏。所提出的DICAM模型考虑了水下图像的比例退化和不均匀色偏,从而提高图像的质量。通过在两个公开的水下图像增强数据集上的广泛实验,验证了提出的模型在全参考和无参考图像质量评估指标方面。欢迎大家订阅我的专栏一起学习YOLO,购买专栏读者联系读者入群获取进阶项目文件!

Snu77的博客 2217

vite Typescript 移动端适配

插件:postcss-px-to-viewport 安装: npm install postcss-px-to-viewport --save-dev 使用: 在vite.config.ts中配置: export default defineConfig({ //...其他配置 css: { //...其他配置 postcss: { plugins: [ require("autoprefixer"), require...

Lixiaobai_666的博客 719

杰理外挂flash使用教程(三): 打包提示音到外部flash(2)

本教程详细介绍了提示音制作与程序配置的全流程规范。提示音制作要求包括:英文命名(8字符内)、单声道转换、标准目录结构(cpu/br23/tools/)及使用user_tone_g.bat脚本生成res.bin资源文件。程序配置需修改:1)启用NOR_FS文件系统;2)调整存储空间;3)配置外置Flash参数;4)增强下载脚本追加资源参数。测试阶段建议替换开机提示音验证功能,扩展开发可参考tone_player.c的索引播放逻辑。所有操作均配有图示说明,关键配置需修改对应头文件和脚本参数。

qq_42014563的博客 587

基于VUE+TypeScript 一个快速开发的移动端UI组件库

这是一篇求职文章 年龄21 目前级别p6+ 坐标成都 找一份vue.js移动端H5工作 一份没有任何包装纯真实的简历 简历戳这 求职文章一共有两篇 另外一篇请点这一个nuxt(vue)+mongoose全栈项目聊聊我粗浅的项目架构 项目简介 为什么有这个项目? 之前重构完公司的项目后将项目的组件进行抽离然后构成了这个项目,UI库基于项目之后维护也比较方便 项目地址 学生机服务器ui.qym...

weixin_34008784的博客 2656

【ROS2】机械臂MoveIt2

navigation2 专注于移动机器人的导航与定位,处理大范围空间的底盘运动;MoveIt2 专注于机械臂的操作规划,处理多关节协同的末端执行器运动。在复合机器人(如,移动机械臂)navigation2 负责移动到目标区域,MoveIt2 负责机械臂抓取。官网:https://moveit.picknik.ai/main/index.html。

郭老二 602

YOLOv11改进策略【独家融合改进】| MobileNetV4+BiFPN,轻松实现降参涨点,适用专栏内所有的骨干替换

可扩展的高效物体检测BiFPN(加权双向特征金字塔网络)

Limiiiing的博客 2362

React Typescript音乐播放器项目笔记:6、scroll组件:移动端滚动

项目地址:https://github.com/BUPTlhuanyu/react-music-lhy scroll组件:移动端滚动 import React, {Component} from 'react' import BScroll from 'better-scroll' interface scrollProps{ children:any, scrollStyle:...

weixin_38405133的博客 427

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

移动端web前端的那些坑

1.移动端文件名不要用game等,以防被合作服务器劫持插入广告,从而影响项目运行 2.红米手机,ua返回iphone,需要结合platform判断,但是还不准确,导致需要ios和android区别对待的时候就坑了。 3.是fixed的问题。这个解决办法是尽量不要用,不过ios7及以下才会出现这个问题。某些情况下红米也会有这个问题。 4.如果你想要使用css3的动画,那

忆凌波的专栏 6849

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

react脚手架创建typescript+vw+antd-mobile项目

前言:之前一直使用vue开发,准备学习react,记录一下使用react开发移动端H5项目,一步步完善 目录1. 脚手架初始化项目2. 把yarn改成npm3. 暴露出webpack配置4. 配置vw,安装postcss相关5.安装成功后,配置webpack.config.js6. 然后在“新增postCss配置”位置进行配置7. 安装antd-mobile依赖和按需加载插件babel-plugin-import8. 在package.json中babel中添加9. 最终的package.json 1. 脚

XinRuoAnHao_的博客 754

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

使用vue-cli3搭建typescript移动端

安装vuecli3 npm install -g @vue/cli # OR yarn global add @vue/cli 创建项目 vue create project-typescript 手动选择特性 选择babel、ts、router、vuex、css预编译器 这里我们使用基于类的组件 选择sass编译器 eslint规则 独立的配置文件 配置 在App.vue中新增路...

a8725585的博客 472

react hooks + typescript 开发的H5移动端组件库

CP Design 使用 React hooks Typescript 开发的一个 H5 移动端 组件库 其中包括了下图中的27个基础组件: CP Design Mobile (github地址:https://10086xiaozhang.github.io/CP-DESIGN) 特性 基于 CP Design 移动设计规范。 规则化的视觉样式配置,适应各类产品风格。 使用 TypeSc...

XIAOZHANG86的博客 1119
上一篇: 6步打造高可用路由守卫系统:TypeScript + Vue3最佳实践
下一篇: 从零实现游戏任务系统,C++协程让你告别回调地狱
MessyInk
博客等级 码龄11年 136粉丝 1992原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值