更新到Android Jelly Beans后出现重复动画

6
我正在使用JQuery 1.1.0和Phonegap 1.9.0开发一款针对Android的HTML5应用程序。我有一个小动画,它在画布上绘制电池并更新它。看起来像是正在加载的电池。在Android 4.0.4上运行得非常好。
昨天我在我的Galaxy Nexus上收到了Android 4.1.1的更新。在那之后,我的动画出现了问题。现在它在画布上绘制两张图片,一张在前面,另一张在后面,坐标错误。我认为这与JavaScript引擎V8的更改有关,可能是缓存问题!在我的PC上的每个浏览器中,动画都能很好地工作。
我的HTML代码如下:
<!DOCTYPE html>
<html>
<head> 
<title>Hella App</title> 
<meta name="viewport" content="width=device-width, initial-scale=1"> 

<link rel="stylesheet" href="jquery.mobile-1.1.1.min.css"/>
<script src="jquery-1.7.2.min.js"></script>
<script src="jquery.mobile-1.1.1.min.js"></script>
<script type="text/javascript" charset="utf-8" src="cordova-1.9.0.js"></script>

<style>
    .ui-page { background: black;}
</style>

</head>

   <body>

<div data-role="page" id="dataPageBattery" data-theme="a">
    <h2 align="center">Battery State</h2>
    <div data-role="header" data-position="fixed" data-theme="a">
        <h1>Car Data</h1>
    </div>

    <div data-role="content" align="center">
        <canvas id="myBatteryCanvas" width="device-width"
            height="device-height">                        
            Sorry, your browser doesn't support canvas technology        
        </canvas>
    </div>
    <h4 align="center" id="batteryProzent"></h4>

    <script type="text/javascript" src="battery.js"></script>
    <script>$(document).on("pageshow",init());</script> 


    <div data-role="footer" data-position="fixed" data-id="persFooter">
        <div data-role="navbar">
            <ul>
                <li><a href="home.html" data-icon="home">Connect</a></li>
                <li><a href="carView.html" data-icon="gear">Cars</a></li>
                <li><a href="infoView.html" data-icon="info">Info</a></li>
            </ul>
        </div>
    </div>

<script>                                       
$('#dataPageBattery').on('swipeleft',function(){ 
 $.mobile.changePage("geolocation.html", { transition: "slide"});   
 console.log('slideLeft');
})  

$('#dataPageBattery').on('swiperight',function(){ 
 $.mobile.changePage("fuelGauge.html", { transition: "slide", reverse: 'true'});    
 console.log('slideLeft');
})  
     </script>
</div>



    </body>
    </html>

我正在加载的 JavaScript 代码:

    var canvas = document.getElementById("myBatteryCanvas");
      var ctx = canvas.getContext("2d");
      var x = 50;
      var y = canvas.height - 30;
      var mx = 2;
      var my = 1;
      var WIDTH = canvas.width;
      var HEIGHT = canvas.height;
     var prozent = 1;

  function drawRect(y, farbe) {
ctx.beginPath();
ctx.rect(124, y, 50, 21);
ctx.fillStyle = farbe;
ctx.fill();

window.setTimeout("draw()", 10);
 }

 function draw() {
if (y >= 80) {
    y -= my;
    window.setTimeout("drawRect(y,'red')", 10);
} else if (y >= 50) {
    y -= my;
    window.setTimeout("drawRect(y,'orange')", 10);
    ctx.rect(124, 50 + 50, 50, 40);
    ctx.fillStyle = 'orange';
    ctx.fill();

} else {
    ctx.rect(124, 50, 50, canvas.height - 60);
    ctx.fillStyle = 'lightgreen';
    ctx.fill();
}

document.getElementById('batteryProzent').innerHTML = '> ' + prozent + ' %';
prozent++;
if (prozent % 4 == 0)
    prozent++;
 }

 function init() {
ctx.rect(122, 40, 54, 100);
ctx.fillStyle = 'floralwhite';
ctx.fill();
ctx.lineWidth = 4;
ctx.strokeStyle = '#303030';
ctx.stroke();

draw();
 }

另一个不错的问题是:如果我在Phonegap代码中使用此html页面作为起始页面,那么就没有问题。但是如果我将它用于整个应用程序中,我就会遇到问题。 因此,我也发布了我的第一个页面:

<!DOCTYPE html> 
<html> 
<head> 
<title> BLE App</title> 
<script type="text/javascript" charset="utf-8" src="cordova-1.9.0.js"></script>
<meta name="viewport" content="width=device-width, initial-scale=1"> 

<meta name="apple-mobile-web-app-capable" content="yes">
<link rel="apple-touch-icon" href="Logo.png" />

<link rel="stylesheet" href="jquery.mobile-1.1.0.min.css"/>
<script src="jquery-1.7.1.min.js"></script>
<script src="jquery.mobile-1.1.0.min.js"></script>
<script src="http://maps.google.com/maps/api/js?sensor=true"></script>

<style>
    .ui-page { background: black;}
</style>

</head> 
  <body> 

 <div data-role="page" id="mainPage" data-theme="a"> 
<div data-role="header" data-position="fixed" data-theme="a">
    <h1> BLE</h1>
</div><!-- /header -->

<div data-role="content">   
    <!-- <p> BLE Test App</p> -->
    <label for="mainPage_textFrage">Find BLE Devices:</label>
    <!-- <input type="text" id="mainPage_textFrage" value="" placeholder="Ihre Frage"/> -->
    <a data-role=button id="mainPage_showAnswerButton">Search</a>
</div><!-- /content -->

<div data-role="footer" data-position="fixed" data-id="persFooter">
    <div data-role="navbar">
        <ul>
            <li><a href="home.html" data-icon="home">Connect</a></li>
            <li><a href="carView.html" data-icon="gear">Cars</a></li>
            <li><a href="infoView.html" data-icon="info">Info</a></li>
        </ul>
    </div><!-- /navbar -->
</div><!-- /footer -->
  </div>

   <script>                                    
$('#mainPage_showAnswerButton').on('click',function(){
 $.mobile.changePage("searchResult.html", { transition: "slideup"});
 console.log('click');
})                                       
 </script>

 </body>
 </html>

有没有遇到同样问题的人?能否有人帮忙吗?

到目前为止,谢谢您!

更新: 我已将JQuery更新为1.7.2,将JQuery Mobile更新为1.1.1。但仍然没有改变。动画没有起作用。


有更奇怪的事情发生了。如果我尝试在动画后用ctx.clearRect(0, 0, canvas.width, canvas.height)擦除画布,只有一个电池消失了。另一个还在那里,但我清除了整个画布。而且再次出现:如果我先用Phonegap启动此页面,一切都很好。有什么想法吗? - fluxim
更新:如果我先启动页面,就没有问题。但是如果我插入一个alert('here')标签来查看它被调用的频率,问题就出现了。图像被复制了。看起来问题是时间关键的。但我不知道该如何解决它! - fluxim
3个回答

5
可能的解决方案:
从jquery-mobile-css中删除以下行可以消除问题:
/*content area*/
.ui-content { border-width: 0; overflow: visible; overflow-x: hidden; padding: 15px; }

(移除“overflow-x:hidden”就足够了。)

更好的解决方案是覆盖周围div元素上的“overflow-x”属性(而不是画布元素本身)。

例如(用于电池状态):

<div data-role="content" align="center" data-theme="a" style="overflow-x: visible">
 <canvas id="myBatteryCanvas" width="device-width" height="device-height">                        
    Sorry, your browser doesn't support canvas technology        
 </canvas>
</div>

另请参阅http://code.google.com/p/android/issues/detail?id=35474


0
当你从一个页面转换到另一个页面时出现问题,但在单独加载页面本身时没有问题,这意味着你需要在页面转换期间(卸)载入一些东西。jQuery Mobile在页面转换时会加载<div data-role="page">...</div>内的所有内容。这也意味着这些div之外的任何内容都将被忽略。不仅如此,前一页的javascript代码仍然会继续到下一页。
我看到两个HTML页面底部的两个<script>...</script>块,只有其中一个会被加载,即刷新页面的那个。确保通过将脚本插入data-role="page divs中来加载这些脚本。
你应该更改以下内容。
<script>$(document).ready(window.setTimeout("init()", 500));</script>

<script>$(document).on("pageshow",window.setTimeout("init()", 500));</script>

根据jQM文档,你不应该使用$(document).ready(...)

首先,您已经解决了我的滑动问题。现在可以正常工作了,非常感谢。但是,关于重复电池动画的问题仍然存在。我已经阅读了你提到的文档,你是正确的。所以我修改了我的代码为script>$(document).ready(onDeviceReadyFuel());</script> 但这个问题仍然没有解决。屏幕显示两个动画并且它们同步运行。非常奇怪。如果我在我的PC上用IE9打开文件,一切都很好。有什么想法吗? - fluxim
更新:我有另一个动画,它可以使用图像。一个作为背景图像,另一个在其上移动。它应该看起来像汽车中的油表。存在相同的问题。动画显示两个指针,而不仅仅是一个。它们都在移动。如果我向后滑动并再次进入动画,则一个固定,另一个移动。也许这些问题与缓存有关? - fluxim
是的,因为你每次页面加载时都将init()绑定到 $(document).on("pageshow",...)上。所以当您重新打开页面时,会再次绑定并启动两个init()。你能否更新上面的代码以反映您的更改? - Calavoow
在使用PhoneGap将我的应用移植到iPhone时,我注意到了一些奇怪的行为。看起来我忽略了 这个PhoneGap事件,只有在PhoneGap准备就绪后运行代码时,应用程序才能正常工作。 - Calavoow
此外,当您说您的代码不会运行两次时,防止其运行两次就没有意义了... - Calavoow
显示剩余7条评论

0

我们在运行Android 4.1.1的手机上遇到了同样的问题。我们有一个显示滑块的html5画布应用程序。滑块的图像显示了两次。在我们的android 4.1、4.0、2.3设备上,它显示得很好。我认为你不能通过简单的JavaScript更改来解决这个缺陷。在最新的Jellybean补丁中,它只是破损了。

我们使用了Nexus S和Galaxy Nexus手机,并尝试了多个不同版本的Android来证明这一点(它不是特定于某种手机)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接