目录
1.实现多选的功能,包括多选之后的删除,创建,方法缩小都得进行进行拓展
2.实现ctrl+单击/“橡皮筋-套索”组合方法选择多个目标
3.最后对part2,part3中的撤销重做,剪切板等功能进行完善,实现对多选之后的操作的适配
此部分是基于对第一部分功能的拓展!
Part1拓展
拓展需求:
1.1 用户可以添加/删除单个目标/从选择通过控制点击
1.2 用户可以使用讲座中讨论的“橡皮筋-套索”组合方法选择多个目标
1.2.1 简化使用橡皮筋或套索的决定,以选择更多的项目
1.3 用户可以通过按下控制键和使用橡皮带套索控制来添加/删除多个目标
1.4 当多个目标被选中时,操作会影响所有选中的项目(移动,调整大小,删除)
需求分步:
1.实现多选的功能,包括多选之后的删除,创建,方法缩小都得进行进行拓展
2.实现ctrl+单击/“橡皮筋-套索”组合方法选择多个目标
3.最后对part2,part3中的撤销重做,剪切板等功能进行完善,实现对多选之后的操作的适配
具体实现
1.实现多选的功能,包括多选之后的删除,创建,方法缩小都得进行进行拓展
思路:实现多选功能就肯定需要一个列表对选中的目标进行存储,但之前的单选也应该保留,所以我就想到普通单选和多选可以分开存储,那么就必须保证单选和多选不会起冲突(不可以同时有单选和多选两种情况)
实现方法:
1.在iModel类中添加多选列表,并添加相关方法,包括增删改查以及Blob是否在列表中等方法。
public class InteractionModel {
Blob selected;
// 多选列表
List<Blob> selectedBlobs = new ArrayList<>();
public void setSelected(Blob b) {
clearSelectedBlobs();
selected = b;
notifySubscribers();
}
public void unselect() {
selected = null;
notifySubscribers();
}
public Blob getSelected() {
return selected;
}
// 多选列表操作的相关方法
public void setSelectedBlobs(List<Blob> blobs){
selectedBlobs = blobs;
notifySubscribers();
}
public void addSelectedBlobs(Blob blob){
selectedBlobs.add(blob);
notifySubscribers();
}
public void deleteSelectedBlob(Blob blob){
Iterator<Blob> it = selectedBlobs.iterator();
while (it.hasNext()) {
Blob s = it.next();
if (blob.equals(s)) {
it.remove();
}
}
notifySubscribers();
}
public void clearSelectedBlobs(){
selectedBlobs.clear();
notifySubscribers();
}
public List<Blob> getSelectedBlobs(){
return selectedBlobs;
}
public boolean containedInSelected(Blob blob){
Iterator<Blob> it = selectedBlobs.iterator();
while (it.hasNext()) {
Blob s = it.next();
if (blob.equals(s)) {
return true;
}
}
return false;
}
}
2.在View类中的画操作中添加对多选目标的显示
仅仅只需要对imodel的多选列表中的对象显示即可
public class BlobView extends StackPane implements BlobModelListener, IModelListener {
private void draw() {
gc.clearRect(0,0,myCanvas.getWidth(),myCanvas.getHeight());
model.getBlobs().forEach(b -> {
// 仅仅只需要对imodel的多选列表中的对象显示即可
if (b == iModel.getSelected() || iModel.containedInSelected(b)) {
gc.setFill(Color.TOMATO);
} else {
gc.setFill(Color.BEIGE);
}
gc.fillOval(b.x-b.r,b.y-b.r,b.r*2,b.r*2);
gc.setFill(Color.BLACK);
gc.fillText(String.valueOf(b.getCount()), b.x-3,b.y+3);
});
}
}
3.修改controller类中的多选操作以及对单选与多选逻辑上修改即可
鼠标按压时,判断按压背景还是某个圆,是某个圆,则就是选择操作
选择 从是否按压Ctrl上可以区分为多选还是单选。
若是多选 则通过判断该圆是否被选中后 对圆进行选中/取消(为了分开单选和多选,在多选时就要将单选取消)
若是单选 若此时多选不为空(即正在进行多选操作,就单选不成功)
为空 就可以正常使用
之后的每一个增加,删除,修改操作都是对两种情况进行判断
若单选 正常操作即可
多选 对多个目标边里进行操作即可
public class BlobController {
BlobModel model;
InteractionModel iModel;
double prevX,prevY;
double dX,dY;
enum State {READY,PREPARE_CREATE, DRAGGING, DRAGGING_TOOL}
State currentState = State.READY;
public void handlePressed(MouseEvent event) {
switch (currentState) {
case READY -> {
if (model.hitBlob(event.getX(),event.getY())) { // 选中⚪
Blob b = model.whichHit(event.getX(),event.getY());
// 对多选和单选就行区分
if (event.isControlDown()){
if (iModel.containedInSelected(b)){
iModel.deleteSelectedBlob(b);
}else {
iModel.addSelectedBlobs(b);
iModel.unselect();
}
}else if (iModel.getSelectedBlobs().isEmpty()){
iModel.setSelected(b);
}
prevX = event.getX();
prevY = event.getY();
currentState = State.DRAGGING; // 选中之后就改变状态为dragging
} else {
if (event.isControlDown()){
iModel.clearPoints();
iModel.setPathComplete(false);

本文详细描述了如何在基于IT技术的交互模型中扩展多选功能,包括实现多选、删除、创建和橡皮筋-套索选择,以及对撤销重做和剪贴板功能的完善,以适应多选操作的适配。
最低0.47元/天 解锁文章
971

被折叠的 条评论
为什么被折叠?



