Ich schreibe eine Phonegap (3.2) -App, ich nehme eine HTML5-Leinwand, mache sie als Vollbild und die gesamte Benutzeroberfläche der App befindet sich auf dieser Leinwand.
Bei einem Samsung Galaxy S4 (Android 4.3) zum Testen der App beträgt die Bildschirmauflösung der App nur 360X640 und nicht 1080X1920, wie ich es gerne hätte.
Was muss getan werden, damit die App die maximal mögliche Bildschirmauflösung verwendet?
Ich habe Screenshots hinzugefügt 1) // Sieht in Ordnung aus, aber eine schlechte Auflösung
windowWidth = window.innerWidth; windowHeight = window.innerHeight;
2) // Nimmt einen kleinen Teil des Bildschirms ein, der Rest ist weiß
windowWidth = window.outerWidth; windowHeight = window.outerHeight;
3) // Nur ein kleiner Teil des Bildes ist sichtbar, als wäre das Bild bei 1080X1920, aber der Bildschirm ist "zu klein".
windowWidth = screen.width; windowHeight = screen.height;
und hier ist der vollständige Code:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<title>PhoneGapTesting</title>
<script type="text/javascript" src="js/jquery.min.js"></script>
<script type="text/javascript" charset="utf-8" src="cordova.js"></script>
<!-- -->
<script type="text/javascript">
var windowWidth;
var windowHeight;
var canvasMain;
var contextMain;
var backgroundImage;
$(document).ready(function() {
windowWidth = window.innerWidth;
windowHeight = window.innerHeight;
//windowWidth = window.outerWidth; // Only 'window.innerWidth' + 'window.innerHeight' look OK but not max resolution
//windowHeight = window.outerHeight;
//windowWidth = screen.width;
//windowHeight = screen.height;
canvasMain = document.getElementById("canvasSignatureMain");
canvasMain.width = windowWidth;
canvasMain.height = windowHeight;
contextMain = canvasMain.getContext("2d");
backgroundImage = new Image();
backgroundImage.src = 'img/landscape_7.jpg';
backgroundImage.onload = function() {
contextMain.drawImage(backgroundImage, 0, 0, backgroundImage.width, backgroundImage.height, 0, 0, canvasMain.width, canvasMain.height);
};
$("#canvasSignatureMain").fadeIn(0);
})
</script>
</head>
<body scroll="no" style="overflow: hidden">
<center>
<div id="deleteThisDivButNotItsContent">
<canvas id="canvasSignatureMain" style="border:1px solid #000000; position:absolute; top:0;left:0;"></canvas><br>
</div>
</center>
</body>
</html>
Vielen Dank.
Eine Lösung, die sowohl mit dem Problem der Auflösung als auch mit dem Berührungsereignis arbeitet (das mit Kens Post kam):
<meta name="viewport" content="user-scalable=no, initial-scale=1, maximum-scale=1, minimum-scale=1, width=device-width, height=device-height, target-densitydpi=device-dpi" />
In der <Kopf>
Danke Ken, dass du versucht hast zu helfen :))
Versuchen Sie etwas so:
var windowWidth = window.innerWidth;
var windowHeight = window.innerHeight;
var pixelRatio = window.devicePixelRatio || 1; /// get pixel ratio of device
canvasMain = document.getElementById("canvasSignatureMain");
canvasMain.width = windowWidth * pixelRatio; /// resolution of canvas
canvasMain.height = windowHeight * pixelRatio;
canvasMain.style.width = windowWidth + 'px'; /// CSS size of canvas
canvasMain.style.height = windowHeight + 'px';
(oder ein absoluter Wert für die CSS-Regel).
Bei Geräten, bei denen das Pixelverhältnis höher als das typische 1: 1 ist, wird eine Leinwand mit höherer Auflösung angezeigt. Für normale Umstände ist alles normal.
window.innerWidth
und window.innerHeight
geben nicht unbedingt die tatsächlichen Bildschirmabmessungen an.
Versuchen Sie es stattdessen:
windowWidth = window.screen.innerWidth;
windowHeight = window.screen.innerHeight;
target-densitydpi
im Meta-Tag in Mikos Beitrag ist in Chrome veraltet und sollte nicht verwendet werden.
Versuchen Sie stattdessen Folgendes:
index.html:
<meta name="viewport" content="initial-scale=1 maximum-scale=1 user-scalable=0 minimal-ui" />
Sie sollten auch die Verwendung der Phaser-Methoden zur Skalierung in Betracht ziehen, z.
Boot.js:
var game = new Phaser.Game(1080, 1920, Phaser.CANVAS, ''); //or AUTO mode for WebGL/DOM
Verwenden Sie für die Leistung die kleinsten Abmessungen unabhängig von der Auflösung des Geräts. Lassen Sie das Leinwandobjekt von Phaser erstellen.
Game.js:
this.scale.scaleMode = Phaser.ScaleManager.EXACT_FIT; //or SHOW_ALL or RESIZE
this.scale.pageAlignHorizontally = true;
this.scale.pageAlignVertically = true;
Die gesamte Leinwand wird vom ScaleManager automatisch skaliert. Dies verlangsamt jedoch die App, wenn Leistung erforderlich ist - insbesondere bei einer großen Leinwand. Mit EXACT_FIT wird die Leinwand gedehnt, während SHOW_ALL die Größe ändert, so dass die gesamte Leinwand auf den Bildschirm passt, ohne das Seitenverhältnis zu ändern (wodurch Ränder wie bei Ihnen vorhanden bleiben können).