在phonegap中支持多种分辨率和图像密度

时间:2012-08-29 11:42:29

标签: html css html5 cordova responsive-design

我是手机上的新手并面临一个问题,我正在制作一个手机应用程序,可以在不同屏幕尺寸和不同屏幕分辨率的多个平台设备上运行,因此我必须根据屏幕分辨率加载不同分辨率的图像。

这可以通过简单地将你的不同分辨率的图像放在hdpi,mdpi和ldpi文件夹中来实现,它(android)根据设备的屏幕分辨率自动获取图像。但是如何在phonegap中做到这一点。

我看过很多关于响应式网页设计的文章,他们都说关于在网页上定位元素,但没有人讲述如何根据屏幕分辨率放置图像。

谢谢我的进步。

已编辑的问题

我使用了以下html代码

<div id="header" data-role="header" data-position="fixed">
 <img alt="app_icon" src="pictures/app_logo.png" display="inline" class="align-left" />
 <img alt="brand_icon" src="pictures/company_logo.png" display="inline" class="align-right" /><h1></h1>
</div>

现在我在assets / www / pictures文件夹中有图片。此文件夹包含2张相同分辨率的图像app_logo.png和company_logo.png以及2张更高分辨率的图像app_logo_big.png和company_logo_big.png现在通过媒体查询我将知道屏幕尺寸并应用样式但据我所知我无法从css更改img src。那么现在我将如何使用这些不同分辨率的图像

5 个答案:

答案 0 :(得分:28)

然后通过jquery动态更改图像:

HTML:

<div id="header" data-role="header" data-position="fixed">
   <img id="app-icon" src="pictures/app_logo.png" display="inline" />
</div>

使用Javascript:

$(document).ready(function () {
  if(window.devicePixelRatio == 0.75) {
     $("#app-icon").attr('src', '/images/lpdi/app-icon.png');   
  }
  else if(window.devicePixelRatio == 1) {
           $("#app-icon").attr('src', '/images/mdi/app-icon.png');  
  }
  else if(window.devicePixelRatio == 1.5) {
     $("#app-icon").attr('src', '/images/hpdi/app-icon.png');   
  }
  else if(window.devicePixelRatio == 2) {
              $("#app-icon").attr('src', '/images/xpdi/app-icon.png');  
  }
}

通过CSS:使用不同分辨率的媒体查询:

HTML:

<div id="header" data-role="header" data-position="fixed">
     <span id="app-icon"></div>
    <span id="brand-icon"></div>
 </div>

CSS:

/* Low density (120), mdpi */
@media screen and (-webkit-device-pixel-ratio: 0.75) {
   #app-icon { background-image:url(pictures/ldpi/app-icon.png); }
   #brand-icon { background-image:url(pictures/ldpi/brand-icon.png); }
}

/* Medium density (160), mdpi */
@media screen and (-webkit-device-pixel-ratio: 1) {
   #app-icon { background-image:url(pictures/mpi/app-icon.png); }
   #brand-icon { background-image:url(pictures/mdpi/brand-icon.png); }
}

/* High density (240), hdpi */
@media screen and (-webkit-device-pixel-ratio: 1.5) {
   #app-icon { background-image:url(pictures/hdpi/app-icon.png); }
   #brand-icon { background-image:url(pictures/hdpi/brand-icon.png); }
}

/* Extra high density (320), xhdpi */
@media screen and (-webkit-device-pixel-ratio: 2) {
   #app-icon { background-image:url(pictures/xdpi/app-icon.png); }
   #brand-icon { background-image:url(pictures/xdpi/brand-icon.png); }
}

如果您想过滤,

ORIENTATION - and (orientation: landscape)

设备宽度and (min-device-width : 480px) and (max-device-width : 854px)

示例:

@media screen and (-webkit-device-pixel-ratio: 1.5) and (min-device-width : 640px) and (max-device-width : 960px) and (orientation: landscape) {
   /* Your style here */
}

答案 1 :(得分:3)

为更多尺寸创建支持是一个问题,但您可以在CSS中使用@media queries进行修复。检查此示例代码:

/* iPads (landscape) ----------- */
@media only screen 
   and (min-device-width : 768px) 
   and (max-device-width : 1024px) 
   and (orientation : landscape) {
       /* Styles */
}

/* iPads (portrait) ----------- */
@media only screen 
   and (min-device-width : 768px) 
   and (max-device-width : 1024px) 
   and (orientation : portrait) {
       /* Styles */
}

/* Desktops and laptops ----------- */
@media only screen 
   and (min-width : 1224px) {
       /* Styles */
}

/* Large screens ----------- */
@media only screen 
   and (min-width : 1824px) {
       /* Styles */
}

使用此代码,您可以添加对所有设备的支持。 Check this link for getting more code for more browsers

您可以使用的功能:

  • 宽度和高度:(min-device-width : 768px) and (max-device-width : 1024px)
  • 方向:(orientation: landscape)(orientation: portrait)
  • 设备像素比率:(-webkit-device-pixel-ratio: 1.5)

修改

HTML:

<div id="header" data-role="header" data-position="fixed">
 <span id="app_icon" alt="app_icon" src="pictures/app_logo.png" display="inline" class="align-left"></span>
 <span id="brand_icon" alt="brand_icon" src="pictures/company_logo.png" display="inline" class="align-right"></span><h1></h1>
</div>

img更改为span并添加ID。

CSS:

@media screen and (-webkit-device-pixel-ratio: 0.75) {
  #app_icon {
    width: 100px; /* Example size */
    height: 100px; /* Example size */
    background: url(pictures/app_logo_small.png);
  }
}

@media screen and (-webkit-device-pixel-ratio: 1) {
  #app_icon {
    width: 150px; /* Example size */
    height: 150px; /* Example size */
    background: url(pictures/app_logo_medium.png);
  }
}

@media screen and (-webkit-device-pixel-ratio: 1.5) {
  #app_icon {
    width: 200px; /* Example size */
    height: 200px; /* Example size */
    background: url(pictures/app_logo_large.png);
  }
}

@media screen and (-webkit-device-pixel-ratio: 2) {
  #app_icon {
    width: 300px; /* Example size */
    height: 300px; /* Example size */
    background: url(pictures/app_logo_xlarge.png);
  }
}

通过此示例,您可以更改代码并进行修复。希望这有帮助!

答案 2 :(得分:3)

您也可以使用handlebars帮助程序执行此操作,这种帮助程序代码密集程度较低,在我看来推荐使用的方法:

if (screen.width <= 480) {
    imgFolder = 'img/low/';
}
else {
    imgFolder = 'img/high/';
}


Handlebars.registerHelper('imgFolder', function () {
    return imgFolder
});

img/low/img/high包含具有相同名称的不同分辨率的图像。

然后在你的模板中:

<img src="{{imgFolder}}yourImage.png" />

当然,您必须根据应用定位的设备设置屏幕尺寸值。

<强>附录 如果您在cordova浏览器中没有1:1像素映射(不推荐 - 您的图像将具有模糊/不清晰的外观)screen.width将与浏览器宽度(window.innerWidth)不同,您必须使用{ {1}}或$(window).width()。您可以使用媒体查询修复错误的映射。

答案 3 :(得分:1)

我发现我必须开始使用这些媒体查询添加对0.5,1,1.3,1.5,2和3的像素比率的支持。

注意我使用的是-webkit-min-device-pixel-ratio而不是-webkit-device-pixel-ratio。 我发现在我的一个测试设备(Galaxy Tab 3 - 8“)上,像素比率为1.3,并没有找到我在我的phonegap应用程序中设置的任何特定样式。

@media screen and (-webkit-min-device-pixel-ratio: 0.5) {
    #app_icon {
        width:64px;
        height:64px;
        background: url('../images/bigstart.png') no-repeat center bottom;
        background-size: 64px 64px;
    }   
}
@media screen and (-webkit-min-device-pixel-ratio: 1) {
    #app_icon {
        width:64px;
        height:64px;
        background: url('../images/bigstart.png') no-repeat center bottom;
        background-size: 64px 64px;
    }   
}
}
@media screen and (-webkit-min-device-pixel-ratio: 1.3) {
    #app_icon {
        width:64px;
        height:64px;
        background: url('../images/bigstart@2x.png') no-repeat center bottom;
        background-size: 64px 64px;
    }   
}
@media screen and (-webkit-min-device-pixel-ratio: 1.5) {
    #app_icon {
        width:64px;
        height:64px;
        background: url('../images/bigstart@2x.png') no-repeat center bottom;
        background-size: 64px 64px;
    }   
}
@media screen and (-webkit-min-device-pixel-ratio: 2) {
    #app_icon {
        width:64px;
        height:64px;
        background: url('../images/bigstart@2x.png') no-repeat center bottom;
        background-size: 64px 64px;
    }   
}
@media screen and (-webkit-min-device-pixel-ratio: 3) {
    #app_icon {
        width:64px;
        height:64px;
        background: url('../images/bigstart@3x.png') no-repeat center bottom;
        background-size: 64px 64px;
    }   
}

答案 4 :(得分:0)

我认为你必须将报告的屏幕尺寸除以屏幕密度,以获得媒体查询的宽度和高度尺寸。