在 Adob​​e Flash 中的 Android 版 Air 上触摸滚动

Posted

技术标签:

【中文标题】在 Adob​​e Flash 中的 Android 版 Air 上触摸滚动【英文标题】:Touch scroll on Air for Android in Adobe Flash 【发布时间】:2018-01-05 14:41:57 【问题描述】:

我正在尝试使用许多按钮进行基于触摸的滚动MovieClip。我希望该按钮根据影片剪辑的mouseDownmouseUp 事件移动。我希望有人可以帮助我解决这个问题。

var maxY:Number = 725;
var minY:Number = 350;
var _startY:Number;
var _startMouseY:Number;
addEventListener(MouseEvent.MOUSE_DOWN, mouseDownHandler);

function mouseDownHandler(event:MouseEvent):void 
    _startY = davies.y;
    _startY = toa.y;
    _startMouseY = mouseY;
    stage.addEventListener(MouseEvent.MOUSE_MOVE, stage_mouseMoveHandler, false, 0, true);
    stage.addEventListener(MouseEvent.MOUSE_UP, stage_mouseUpHandler, false, 0, true);


function stage_mouseMoveHandler(event:MouseEvent):void 
    var offsetY:Number = mouseY - _startMouseY;
    background_scroll_product.y = Math.max(Math.min(maxY, _startY + offsetY), minY);
    davies.y = Math.max(Math.min(maxY, _startY + offsetY), minY);
    toa.y = Math.max(Math.min(maxY, _startY + offsetY), minY);


function stage_mouseUpHandler(event:MouseEvent):void 
    stage.removeEventListener(MouseEvent.MOUSE_MOVE, stage_mouseMoveHandler);
    stage.removeEventListener(MouseEvent.MOUSE_UP, stage_mouseUpHandler);

滚动前后:

【问题讨论】:

预期和实际结果是什么? 我想移动那个 davies 按钮、toa 按钮和许多按钮,就像一个影片剪辑一样滚动,我共享的代码只滚动一个影片剪辑,如果我将该按钮分组到影片剪辑,我无法按下按钮在另一个框架上运行。对不起,我的英语不好,希望你能帮助我,谢谢你的回复 【参考方案1】:

解决方案

1:尝试将Math.max(Math.min(maxY, _startY + offsetY), minY);替换为以下内容:

clamp(mouseY - _startY + offsetY, minY, maxY);

function clamp(original:Number, low:Number, high:Number):Number 
    return (original > high) ? high : (original < low) ? low : original;

2:将所有内容移动到一个容器中。移动一个对象比移动多个对象更容易。

许多对象:

0:MainTimeline
    0:background_scroll_product //.y += offsetY;
    1:davies                    //.y += offsetY;
    2:toa                       //.y += offsetY;
    ...

一个对象:

0:MainTimeline
    0:container //.y += offsetY;
        0:background_scroll_product
        1:davies
        2:toa
        ...

演示

以下是您可以放入新项目的代码,它将使用工作滚动容器进行编译。请注意,当您提问时,其他人可能需要这样的Minimal, Complete, and Verifiable example。

var background_scroll_product, davies, toa;
demoSetup();

/* ^^^ Omit this if you already have these objects defined ^^^ */

// Create a container for our content.
var container:Sprite = new Sprite();
addChild(container);

// Put the content inside the container.
container.addChild(background_scroll_product);
container.addChild(davies);
container.addChild(toa);

// setup the min based on the size of the contents.
var loc:Object = 
    "max":50,
    "min":stage.stageHeight - container.height
;

addEventListener("mouseDown", mouseHandler);

function mouseHandler(e:Event):void 
    switch (e.type) 
        case "mouseDown":
            loc.start = mouseY;
            loc.container = container.y;
            addEventListener("mouseUp", mouseHandler);
            addEventListener("mouseMove", mouseHandler);
            break;
        case "mouseUp":
            removeEventListener("mouseUp", mouseHandler)
            removeEventListener("mouseMove", mouseHandler);
            break;
        case "mouseMove":
            // Scroll the container.
            container.y = clamp(mouseY - loc.start + loc.container, loc.min, loc.max);
            break;
    


function clamp(original:Number, low:Number, high:Number):Number 
    return (original > high) ? high : (original < low) ? low : original;


function demoSetup():void 
    // This sets up a facsimile of the project, to create a Minimal, and Verifiable example.
    var bg:Sprite = new Sprite();
    bg.graphics.beginFill(0xA1A1A1);
    bg.graphics.drawRect(0, 0, stage.stageWidth, stage.stageHeight);
    bg.graphics.endFill();
    addChild(bg);

    background_scroll_product = new Shape();
    background_scroll_product.graphics.beginFill(0xf0e3e5);
    background_scroll_product.graphics.drawRect(0, 0, 250, 750);
    background_scroll_product.graphics.endFill();

    davies = new Shape();
    davies.graphics.beginFill(0x243066);
    davies.graphics.drawRect(0, 0, 200, 400);
    davies.graphics.endFill();
    davies.x = davies.y = 25;

    toa = new Shape();
    toa.graphics.beginFill(0xdc3734);
    toa.graphics.drawRect(0, 0, 200, 200);
    toa.graphics.endFill();
    toa.x = 25;
    toa.y = 525;


对 FLA 的回应

我强烈建议您不要使用场景,特别是因为它们会创建无法立即破译的脏状态。事实上,当您似乎正在开发移动应用程序时,您绝对应该考虑使用完整的 UI 框架,例如 FeathersUI。无论如何...

延迟容器

Timeline 尝试将每个帧视为程序的唯一状态。您可以通过这种方式直观地构建 UI,但它很笨重。此外,正如您所发现的,当您将WYSIWYG 与函数式编程混合使用时,Flash UI 从未意识到也从未“清理”过一些事情。您手动添加了addChild(container),因此您也应该手动添加removeChild(container)。您可以将它放在后退按钮的侦听器函数中。

容器悬停在标题栏上

考虑您的主菜单层次结构:

0: instance15 (Shape)
1: button_back (SimpleButton)
2: instance16 (StaticText)
3: container (Sprite)

如您所见,层 02 是您的***菜单对象。将container 移到菜单后面就像调用addChildAt() 一样简单,并将第二个参数设置为0 索引。

addChildAt(container, 0);

最后的图像被剪裁

原因是您的内容未定位在y:0。如果您想解决这个问题,请将内容移动到从y:0 开始,或者将您的第一个图形的偏移量添加到最小值...

"min":this.loaderInfo.height - container.height - davies.y

【讨论】:

感谢您的帮助,但我已经尝试过,但仍然有关于容器的问题,例如: 1. 我无法将图像放在滚动条上方作为框架并且滚动条在框架上移动。 2.当我滚动容器时,最后一个按钮 nippon 没有出现。 3.如果我按产品上的返回按钮,滚动容器没有丢失,仍然在扫描菜单中找到您可以在以下链接中看到:[drive.google.com/open?id=0B366CR2EpFQNN29LU2MtRW1GRjQ] [drive.google.com/open?id=0B366CR2EpFQNNExSV2wwZnh1N2M]我真的希望您能帮助解决问题. 链接有问题,可以在这里找到; 1)。 [dropbox.com/s/p9sthqrwor500k7/Product.fla?dl=0]2)。 [dropbox.com/s/6b5ydkgaj20lk0a/Product.mp4?dl=0] 感谢 Atriace,我可以解决这个问题 :) 再次感谢您的帮助 希望如此! :) 我浏览了你的场景,并解决了我上面提到的问题。我还提供了我在其中使用的辅助函数:dropbox.com/s/udvxvun93f1by8h/IWayanArthana.fla?dl=0 非常感谢Atriace,因为您对我的帮助非常好,我想向您了解更多关于动作脚本3的信息,我可以发送电子邮件或whatapp联系您吗?当我对另一个脚本感到困惑和沮丧时,我希望你能帮助我:)

以上是关于在 Adob​​e Flash 中的 Android 版 Air 上触摸滚动的主要内容,如果未能解决你的问题,请参考以下文章

将 Adob​​e Air 3.3 SDK 与 Flash Builder 一起使用

在 Adob​​e 和浏览器都将结束 Adob​​e Flash 之后,有啥方法可以运行 Web 应用程序

可以在没有 Adob​​e Flash Professional 的情况下使用 ActionScript 3?

需要帮助让按钮在 Adob​​e Flash 中播放多种声音

VMware:继续使用 Adob​​e Flash 管理您的 vCenter

VMware:继续使用 Adob​​e Flash 管理您的 vCenter