问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

在webgl编程中,如何实现用键盘的“前进,后退”键,控制某个图形的放大和缩小。(最好源代码)

发布网友 发布时间:2022-04-20 08:57

我来回答

2个回答

懂视网 时间:2022-04-20 13:18

本篇文章给大家带来的内容是关于Web应用中富交互的撤销与前进操作的实现方法介绍(代码),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。

在web应用中,用户在进行一些富交互行为的操作时难免会出现误操作,比如在富文本编辑器设置错了字体颜色就需要撤回,做H5活动页面的时候不小心删了一个图片也需要撤回,更比如在线设计原型图应用的时候不小心删了一个页面等,总之在交互场景非常复杂的情况下,用户操作失误的可能性非常大,这时候‘撤销’和‘前进’这两个操作就很有必要了,而且用户体验也很好

思路

不管是任何场景下的web应用,用户的每一次操作我们都可以看成是对某个组件或某个对象的状态和属性进行改变,一旦连续的动作操作完成正准备进行下一个动作之前,此刻的状态就是一个全新的状态

A —— B —— C
用户未操作的时候全局状态是A
用户操作某个组件使其移动到位置X,松开鼠标之后全局状态是B
用户操作另一个组件使其删除,完成后全局状态是C

所以,撤销的操作就是在用户操作状态到C的时候让全局的状态回到B,回到上一次操作完的时候。
那么就需要可以存放这种大量状态的列表或索引来记录每一次操作的动作

但如果我用某一个数组变量来存储如此庞大的数据是不是略显不妥?数据量越大内存应该会爆吧?所以这里我推荐大家使用IndexedDB
下面是利用Angular、Rxjs和IndexedDB封装好的一个服务类

import { Inject } from "@angular/core";
import { IndexedDBAngular } from "indexeddb-angular";
import { Subject, Observer, Observable } from "rxjs";

export interface IDBData {
 widgetList: string
}

// 前进和后退的服务
@Inject({
 providedIn: 'root'
})
export class PanelExtendMoveBackService {

 /**
 * 发射DB集合存储的数据,可订阅
 */
 public launchDBDataValue$: Subject<IDBData> = new Subject<IDBData>()

 /**
 * 创建一个叫panelDataDB的本地数据库,版本号为1
 */
 public db = new IndexedDBAngular('panelDataDB', 1)

 /**
 * 记录前进和后退的存储集合项的下标key
 * 默认为0
 */
 public dbCurrentIndex: number = 0

 /**
 * 自增的DBkey
 */
 public dbKey: number = -1

 // 是否允许前进
 public get isMove() : boolean {
 return this.dbCurrentIndex < this.dbKey
 }
 // 是否允许后退
 public get isBack() : boolean {
 return this.dbCurrentIndex > 0
 }

 constructor() {}

 /**
 * 创建DB集合
 */
 public createCollections(): Observable<boolean> {
 const _sub: Subject<boolean> = new Subject<boolean>()
 this.dbKey = -1
 this.db.createStore(1, (db: any) => {
  db.currentTarget.result.createObjectStore('panelItem')
 }).then(()=>{
  this.dbClear()
  _sub.next(true)
 })
 return _sub.asObservable()
 }

 /**
 * 往集合里添加数据
 * 同时把新添加的key赋值给dbCurrentIndex,
 */
 public dbAdd(): void {
 this.handleDbCurrentRefreshDB();
 this.dbKey += 1;
 // 此处存储你要保存的数据
 const _widget_list = []
 this.db.add('panelItem', { widgetList: JSON.stringify(_widget_list) }, this.dbKey).then(
  _e => {
  if ((<Object>_e).hasOwnProperty('key')) {
   this.dbCurrentIndex = _e.key
  };
  },
  () => {
  this.dbKey -= 1
  throw new Error('添加panelItem集合失败')
  }
 )
 }

 /**
 * 在执行添加数据集操作的时候判断dbCurrentIndex当前指引的下标是否低于dbKey
 * 如果是说明执行了后退操作之后后续动作执行了dbAdd的操作,则清空dbCurrentIndex索引之后的数据重新添加
 */
 public handleDbCurrentRefreshDB(): void {
 if (this.dbCurrentIndex < this.dbKey) {
  for (let i = this.dbCurrentIndex + 1; i <= this.dbKey; i++) {
  this.db.delete('panelItem', i).then(() => {})
  }
  this.dbKey = this.dbCurrentIndex
 }
 }

 /**
 * 执行后退操作发射DB数据集
 */
 public acquireBackDBData(): void {
 if( this.isBack ) {
  this.dbCurrentIndex -= 1
  this.db.getByKey('panelItem', this.dbCurrentIndex).then(res=>{
  this.launchDBDataValue$.next(res)
  },()=>{ })
 }
 }

 /**
 * 执行前进操作发射DB数据集
 */
 public acquireMoveDBData(): void {
 if( this.isMove ) {
  this.dbCurrentIndex += 1
  this.db.getByKey('panelItem', this.dbCurrentIndex).then(res => {
  this.launchDBDataValue$.next(res)
  }, () => { })
 }
 }

 /**
 * 清除DB集合panelItem
 */
 public dbClear(): void {
 this.db.clear('panelItem').then(_e => {})
 }
}

这里我偷懒了一下,直接采用自增的id作为key了,也方便查找
每一次操作所存储的数据如下

2425664273-5bc930352cd72_articlex.png

最后可以看一下我实现好了的撤销和前进操作的场景

2021355119-5bc88183c4c91_articlex.gif

热心网友 时间:2022-04-20 10:26

100块,给你源代码
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
黑色芳纶哪家的好一些? 苏子叶我们中国叫什么苏子叶在中国叫什么 福州小车过户多少钱啊 福州车辆过户要多少钱 民生山西怎么查不到医疗保险信息 app查询养老金医疗保险方法介绍_百度... 太原医保查询平台(附入口二维码) 鉴定伤残等级去哪个部门 2024年中国铝业集团高管团队名单 2024中铝集团董事会成员一览 右枕位胎儿图怎么睡 一鸣楼宇对讲,刷卡开不了门,但分机能开,对讲能用,怎样维修? .当你因为其他的事情悲伤难过希望他安慰的时候,他不管不问。还说:我理解不了你的想法,有什么可难受的 我说我理解不了你给我的专属微笑 让我在无时无刻都在期盼你的怀抱,是哪首歌的歌词 怎么饲养小鳖? 怎么饲养小鳖???????我家养了一只鳖,不知道它吃什么,养在什么地方好。 如何喂养幼鳖 开州区参公二级单位上班没有发展前途吗? 参公管理单位工作有没有机会变成公务员?晋升机会大吗?参加遴选和公务员有何差别? 公务员和参公有什么区别,发展前途一样吗? 目前在乡镇任**,遴选到市直参公单位有前途吗?家在市里。 参公事业单位和公务员比前景是不是差很多 参公事业单位人员与公务员有什么区别,有没有前途 今年公考上了参公单位,市级医保局,据说很忙??有了解待遇及前景的吗?高分悬赏 参公事业单位还有前途吗 公务员的出路在哪? 参公的待遇及前途? 苹果啥软件看电影免费? 苹果5s怎样才能下载免费看vip电影的软件。求告知。帮我解决了。给采纳 考试分数低的检讨 苹果手机看某艺VIP专享电影绿色软件,720P超高清投屏,值得拥有 苹果机添加什么软件源可以看vip电影 为什么我不理解你,你不理解我 怎么我理解不了自己? 你理解不了我为什么这样,就像我理解不了你为什么那么有钱是一个道理.这句话用英语怎么说? 我理解不了自己看不起自己,别人就不会看得起你? 你的境界我理解不了 我的快乐你也敢受不到是啥意思? 和女朋友吵架,她说这段时间我们别联系了,你不理解我我不理解你,真的没意思,大家缓缓先好好做自己吧? 伱觉得我不理解伱、我也觉得你不理解我、所以我也不晓得到底是我不理解你还是? 为什么每次都是我不理解你?难道你理解过我吗? 男生对女生说,咱俩顶多一辈子就是个路人,我不理解你,你也不理解我,隔壁苦苦纠缠,他是什么意思? 也许你永远不会懂我,我也不够理解你 我觉得我已经理解你了,就是你不理解我该怎么接下段? “你的世界我不理解”是什么意思? 我很烦 ,人活着为什么感情不能跟着感觉走,,自己很委屈,有时候觉得说给他听他也理解不了你,觉得自己 win10出那么久了,现在兼容性如何,稳定么?上哪下载,哪个版本比较好? 为什么说三十四岁的女人最花心? 觉得34岁的女人最怕什么呢? 34岁的女人怎么去追50岁的男人? 34岁的女人想嫁给32岁的男人,希望大吗? 34岁未婚的都市女性,真的就只是因为眼光太高吗? 觉得24岁的女人,34岁的女人,44岁的女人,分别有什么区别?