2014-01-23 2 views
0

간단한 낙서 (드로잉) 앱을 개발하기 위해 html-5 캔버스와 전화 간격을 사용하고 있습니다. 브라우저에서 매우 잘 작동하지만. 낙서 html을 scribble.apk로 변환하면 잘 작동합니다. 파일을 전화 - 격차를 사용하여 그것을 시도하고 안드로이드 장치에서 매우 천천히 작동합니다. 그것은 그것이 쓰기에서 5 초 후에 화면에 하나의 도트를 넣는 것을 의미합니다.안드로이드 장치의 html-5 캔버스 성능

안드로이드 장치에서 더 나은 작문 경험을 향상시키기 위해 html 5 캔버스에 어떤 대안이 있습니까? 그래서 그것은 지체없이 화면에 픽셀을 넣을 것입니다.

여기 내 코드입니다.

<html> 
<script type="text/javascript"> 
var canvas, ctx, flag = false, 
    prevX = 0, 
    currX = 0, 
    prevY = 0, 
    currY = 0, 
    dot_flag = false; 

var x = "black", 
    y = 2; 

function init() { 
    canvas = document.getElementById('can'); 
    ctx = canvas.getContext("2d"); 
    w = canvas.width; 
    h = canvas.height; 

    canvas.addEventListener("mousemove", function (e) { 
     findxy('move', e) 
    }, false); 
    canvas.addEventListener("mousedown", function (e) { 
     findxy('down', e) 
    }, false); 
    canvas.addEventListener("mouseup", function (e) { 
     findxy('up', e) 
    }, false); 
    canvas.addEventListener("mouseout", function (e) { 
     findxy('out', e) 
    }, false); 
} 

function color(obj) { 
    switch (obj.id) { 
     case "green": 
      x = "green"; 
      break; 
     case "blue": 
      x = "blue"; 
      break; 
     case "red": 
      x = "red"; 
      break; 
     case "yellow": 
      x = "yellow"; 
      break; 
     case "orange": 
      x = "orange"; 
      break; 
     case "black": 
      x = "black"; 
      break; 
     case "white": 
      x = "white"; 
      break; 
    } 
    if (x == "white") y = 14; 
    else y = 2; 

} 

function draw() { 
    ctx.beginPath(); 
    ctx.moveTo(prevX, prevY); 
    ctx.lineTo(currX, currY); 
    ctx.strokeStyle = x; 
    ctx.lineWidth = y; 
    ctx.stroke(); 
    ctx.closePath(); 
} 

function erase() { 
    var m = confirm("Want to clear"); 
    if (m) { 
     ctx.clearRect(0, 0, w, h); 
     document.getElementById("canvasimg").style.display = "none"; 
    } 
} 

function save() { 
    document.getElementById("canvasimg").style.border = "2px solid"; 
    var dataURL = canvas.toDataURL(); 
    document.getElementById("canvasimg").src = dataURL; 
    document.getElementById("canvasimg").style.display = "inline"; 
} 

function findxy(res, e) { 
    if (res == 'down') { 
     prevX = currX; 
     prevY = currY; 
     currX = e.clientX - canvas.offsetLeft; 
     currY = e.clientY - canvas.offsetTop; 

     flag = true; 
     dot_flag = true; 
     if (dot_flag) { 
      ctx.beginPath(); 
      ctx.fillStyle = x; 
      ctx.fillRect(currX, currY, 4, 4); 
      ctx.closePath(); 
      dot_flag = false; 
     } 
    } 
    if (res == 'up' || res == "out") { 
     flag = false; 
    } 
    if (res == 'move') { 
     if (flag) { 
      prevX = currX; 
      prevY = currY; 
      currX = e.clientX - canvas.offsetLeft; 
      currY = e.clientY - canvas.offsetTop; 
      draw(); 
     } 
    } 
} 
</script> 
<body onload="init()"> 
    <canvas id="can" width="700" height="700" style="position:absolute;top:10%;left:10%;border:2px solid;"></canvas> 
    <div style="position:absolute;top:12%;left:43%;">Choose Color</div> 
    <div style="position:absolute;top:15%;left:45%;width:10px;height:10px;background:green;" id="green" onclick="color(this)"></div> 
    <div style="position:absolute;top:15%;left:46%;width:10px;height:10px;background:blue;" id="blue" onclick="color(this)"></div> 
    <div style="position:absolute;top:15%;left:47%;width:10px;height:10px;background:red;" id="red" onclick="color(this)"></div> 
    <div style="position:absolute;top:17%;left:45%;width:10px;height:10px;background:yellow;" id="yellow" onclick="color(this)"></div> 
    <div style="position:absolute;top:17%;left:46%;width:10px;height:10px;background:orange;" id="orange" onclick="color(this)"></div> 
    <div style="position:absolute;top:17%;left:47%;width:10px;height:10px;background:black;" id="black" onclick="color(this)"></div> 
    <div style="position:absolute;top:20%;left:43%;">Eraser</div> 
    <div style="position:absolute;top:22%;left:45%;width:15px;height:15px;background:white;border:2px solid;" id="white" onclick="color(this)"></div> 
    <img id="canvasimg" style="position:absolute;top:10%;left:52%;" style="display:none;"> 
    <input type="button" value="save" id="btn" size="30" onclick="save()" style="position:absolute;top:90%;left:10%;"> 
    <input type="button" value="clear" id="clr" size="23" onclick="erase()" style="position:absolute;top:90%;left:15%;"> 
</body> 
</html> 
+0

일부 코드를 추가하십시오 : 당신은 뷰의 레이어 유형을 변경 시도 할 수 있습니다. 캔버스에 libs/frameworks를 사용하고 있습니까? – Pinal

답변

0

안드로이드 브라우저 때문에 느립니다. 답변은 this question입니다.

네이티브 코드 외에도 다른 대안이 있다고 생각하지 않습니다. 이 phonegap 플러그인을 사용할 수 있습니다 : https://github.com/phonegap/phonegap-plugin-fast-canvas

안드로이드 전용이며 캔버스는 전체 화면으로 만 표시 할 수 있습니다. 더 많은 도움을 받으려면 당신의 소스 코드가 필요합니다.

희망이 있습니다.

편집 :

appView.setLayerType(WebView.LAYER_TYPE_SOFTWARE, null); //or 
appView.setLayerType(WebView.LAYER_TYPE_HARDWARE, null); 
+0

예 .. 저는 Fast-canvas로 시도했지만 단순히 같은 결과를 얻었습니다. – Strawberry

+0

흠 음, 당신이 시도 할 수있는 마지막 방법은 뷰의 레이어 유형을 변경하는 것입니다. 하드웨어에서 소프트웨어로 또는 그 반대로 수행하십시오. –