Android 为不同的dpi创建绘图的最佳方法是什么

Android 为不同的dpi创建绘图的最佳方法是什么,android,graphics,photoshop,Android,Graphics,Photoshop,您是先创建MDPI可绘制图形,然后在photoshop中按照.075/1.00/1.50/2的像素比例进行缩放,还是重新创建每个可绘制图形 另外,从高质量图像开始并开始缩小它还是从MDPI图像开始并只放大它更好 我是这样做的: 在photoshop中创建分辨率为320x480和160的mdpi图像。只需输入120160、240或320作为分辨率,即可保存4张图像并更改分辨率。来自Android设计指南: 战略 那么,当设计多个屏幕时,您从哪里开始呢? 一种方法是使用基本标准(中等规模,MDPI)

您是先创建MDPI可绘制图形,然后在photoshop中按照.075/1.00/1.50/2的像素比例进行缩放,还是重新创建每个可绘制图形

另外,从高质量图像开始并开始缩小它还是从MDPI图像开始并只放大它更好

我是这样做的:


在photoshop中创建分辨率为320x480和160的mdpi图像。只需输入120160、240或320作为分辨率,即可保存4张图像并更改分辨率。

来自Android设计指南:

战略

那么,当设计多个屏幕时,您从哪里开始呢? 一种方法是使用基本标准(中等规模,MDPI)和 放大或缩小其他铲斗的比例。另一种方法是 从屏幕最大的设备开始,然后缩放 找出你需要在更小的屏幕上做出的UI妥协 屏幕


有关此主题的更多详细信息,请查看的“设计师提示”部分有以下建议:

尽可能使用矢量形状
如果可能,请使用矢量形状,以便在需要时可以放大资产,而不会丢失细节和边缘清晰度

从大型艺术板开始
因为您需要为不同的屏幕密度创建资源,所以最好在尺寸为目标图标大小倍数的大型艺术板上开始图标设计。例如,启动器图标的宽度为96、72、48或36像素,具体取决于屏幕密度。如果最初在864x864艺术板上绘制启动器图标,则在将艺术板缩小到最终资源创建的目标尺寸时,调整图标将更容易、更清晰


在这一部分还有很多其他的好建议。我认为对于其他可绘图类型(菜单图标、背景等)也是一个很好的建议。

我通常从大开始,然后转向小

我发现powerpoint实际上是为我的应用程序创建资源的一个非常好的工具。所有的图形都是矢量的,所以它们可以上下缩放,而不会有任何质量损失

我倾向于从大的开始,如果没有其他原因,那就是看起来更大的东西更容易使用。当我移动到较小的尺寸时,我通常会放大一些来补偿


powerpoint中的任何图形对象都允许您右键单击它并选择“另存为图片”,它将为您输出为png文件。如果需要,只需将其放入draw9patch即可。

我使用Inkscape,同时处理矢量图像,然后导出到各种分辨率所需的光栅大小。我写的一篇关于从Inkscape生成图标的文章可以在

最佳方法中找到:创建高分辨率图像,然后缩小它们的比例

如果你使用Photoshop,那将是小菜一碟

我的脚本分叉版本自动化了所有dpi的缩减过程
:-)

单击一次,它将创建

  • 所有可拉伸-????文件夹
  • 使用所有缩小的图像版本的all您的psd或png高分辨率文件
因此,只需创建xxxhdpi图像,然后使用脚本将其缩小

创建初始高分辨率图像的宽度和高度为16的倍数是明智的,因为它们将适当缩小,如下表所示:

ldpi   mdpi   tvdpi     hdpi    xhdpi   xxhdpi  xxxhdpi
0,75   1      1,33     1,5     2       3       4

3      4      5,33     6       8       12      16
6      8      10,67    12      16      24      32
9      12     16       18      24      36      48
12     16     21,33    24      32      48      64
15     20     26,67    30      40      60      80
18     24     32       36      48      72      96
21     28     37,33    42      56      84      112
24     32     42,67    48      64      96      128
27     36     48       54      72      108     144
30     40     53,33    60      80      120     160
etc....
希望这有帮助

注意:

tvdpi是一种罕见的情况,因此我并不真正关心它有时会缩小到“无整数值”

学分:

我添加了xxxhdpi和xxhdpi支持的这个脚本的早期版本已经可用
我建议在powershell中为Inkscape编写一个小脚本

示例:

将Inkscape放在“c:\bin\Inkscape”(没有任何空格的目录)中,并以mdpi(1x)分辨率绘制所有图像

在Inkscape对象属性框(即xml中的id)中,为要以png格式导出的每个对象指定id名称

将SVG保存到“C:\users\rone\Pictures\design MyApps forscript.SVG”

创建一个目录“d:\temp”

并将此脚本放在“C:\app\scripts\”中


Powershell脚本名称为“inkscape_to_png.ps1”:


现在,将此脚本称为以下示例:

@(“btn_按钮名称1”、“btn_按钮名称3”、“btn_其他”、“btn_缩放”、“btn_dezoom”、“btn_中心”、“btn_wouwou”、“im_abcdef”、“ic_一半”、“ic_星”、“ic_满”){C:\app\scripts\inkscape\u to_png.ps1-img$\uf design-MyMap-forscript.svg}

脚本将在d:\temp\drawable xyz中以所有分辨率(ldpi、mdpi、hdpi、xhdpi、xxhdpi、xxxhdpi)创建您的所有可绘制文件


因此,这是一种方便的省时方式。

在Android L中,有一种类似SVG的形状但采用Android的XML样式的VectorDrawable

请参阅Android文档:


Android Studio中似乎有一个工具:

在项目视图>中展开项目文件夹,右键单击应用程序>新建>图像资源

图标类型:操作栏和选项卡图标

资产类型:图像

为原始图像选择路径(应该是大的)

形状:无(使背景透明)


它将在适当的可绘制文件夹中生成图像。

谢谢,不过您会推荐哪一个?这两种方法都有优点和缺点吗?老实说,有一个设计团队为我解决这个问题。我相信他们从高质量的图像开始,然后缩小它。@Graham对于矢量图像,则相反。您可以从小处着手,生成按比例增加的资产。否则质量会下降。用于自动生成不同的大小
param (
    $inkscape_dir="C:\bin\Inkscape\",
    $inkscape_bin="inkscape.exe",
    $img_id="",
    $fichier_svg="C:\Users\rone\Pictures\design-MyMap-forscript.svg",
    $tmp_dir="d:\temp\"
)

$inkscape=$(Resolve-Path "$inkscape_dir\$inkscape_bin")


function getWidthHeight($img_id) {
    $size=@{}

    $old_pwd=$pwd.path

    cd $inkscape_dir

    write-host -foreground yellow "détermine la taille de $img_id"

    $size.width=invoke-command {./inkscape --file=$fichier_svg --query-id=$img_id --query-width 2>$null}
    $size.height=invoke-command {./inkscape --file=$fichier_svg --query-id=$img_id --query-height 2>$null}

    write-host -foreground yellow "width : $($size.width)"
    write-host -foreground yellow "height : $($size.height)"

    cd $old_pwd

    return $size
}

function convertTo($size, $format) {
    $rsize=@{}

    if ($format -eq "MDPI") {
        $rsize.width=[int]$size.width*1
        $rsize.height=[int]$size.height*1
    } elseif ($format -eq "LDPI") {
        $rsize.width=[int]$size.width*0.75
        $rsize.height=[int]$size.height*0.75
    } elseif ($format -eq "HDPI") {
        $rsize.width=[int]$size.width*1.5
        $rsize.height=[int]$size.height*1.5
    } elseif ($format -eq "XHDPI") {
        $rsize.width=[int]$size.width*2
        $rsize.height=[int]$size.height*2
    } elseif ($format -eq "XXHDPI") {
        $rsize.width=[int]$size.width*3
        $rsize.height=[int]$size.height*3   
    } elseif ($format -eq "XXXHDPI") {
        $rsize.width=[int]$size.width*4
        $rsize.height=[int]$size.height*4
    }

    write-host -foreground yellow "après conversion : $format"

    write-host -foreground yellow "width : $($rsize.width)"
    write-host -foreground yellow "height : $($rsize.height)"

    return $rsize
}

function inkscape_convert() {

    $mdpi_size=getWidthHeight $img_id

    write-host -foreground gray "----------------------------------------"
    "MDPI,LDPI,HDPI,XHDPI,XXHDPI,XXXHDPI" -split ","|% {


        $new_size=convertTo $mdpi_size $_
        if ($new_size.width -eq 0 -or $new_size.height -eq 0) {
            write-host -foreground red "erreur lors de la recherche de la taille de l'image"
            exit
        }
        $w=$new_size.width
        $h=$new_size.height
        $dir="$tmp_dir\drawable-$($_.toLower())"
        if (-not $(test-path $dir)) {
            write-host -foreground yellow "création du répertoire $dir"
            mkdir $dir
        }
        $new_file_name="$dir\$($img_id).png"
        $cmd="$inkscape -z -i $img_id -j -f $fichier_svg -w $w -h $h -e $new_file_name"
        write-host -foreground gray $cmd
        invoke-expression -command $cmd
        if ($? -eq $true) {
            write-host -foreground yellow "conversion OK"
        }

    }
    write-host -foreground gray "----------------------------------------"

}


inkscape_convert