背景:我相信對于Android開發(fā)者來說,屏幕適配一直是你心中的痛~,為了讓Android開發(fā)者從屏幕適配的痛苦中解脫出來,我決定實現(xiàn)這個Android自動化屏幕適配的1.0版本。下面來講一下思路。
首先以values-w360作為標準也就是360dp,對應的設備就是720×1080俗稱的720P的屏幕,也就是說設計師給的設計稿是以720P的屏幕作為設計圖的,那么如果設計圖上面的尺寸是100px,那么我們就需要用100/2 = 50dp得到我們的這個標準值,以此類推,將app中所有需要適配的尺寸都寫入到values目錄的dimens.xml(標準值)中,Android程序員所需要做的工作就這么多了。
接下來的工作就交給腳本了,首先腳本會將values/dimens.xml
拷貝到需要適配的屏幕分辨率對應的目錄,例如values-w400
,然后用正則匹配出每一個尺寸,進行計算然后重新寫入適配之后的值,這里以360dp為標準,400dp為需要適配的目標設備,以100px為例,那么(400/360)×
100 = 111,那么在values-w400dp
這個目錄中的dimens的該項目的值就是111dp了。
require 'fileutils'
BASE_DP=360
def adapte_dimens(dimens_file,alpha)
puts "adapter #{dimens_file}"
File.open dimens_file,'a+' do |f
str =""
f.each_line{|line
value = /(?<=>)d+(?=(dp|sp))/.match(line).to_a[0]#匹配出尺寸的項目包括dp和sp
if value
value = value.to_f * alpha#計算適配后的值
str += line.gsub(/(?<=>)d+(?=(dp|sp))/,value.to_i.to_s)#將新值寫入
else
str += line
end
}
f.truncate(0)
f.puts str
end
end
values_list = Dir.entries("./").find_all{|f
#通過修改這里的正則表達式,可以控制具體適配哪一個屏幕比如將正則改為/values-w400dp/那么就只會適配400dp的屏幕了
/values-w|values-sw/.match(f)
}
values_list.each do |v
FileUtils.cp("values/dimens.xml",v)
dest_file = "#{v}/dimens.xml"
dp = /(d{3})/.match(v)
alpha = dp[0].to_f/BASE_DP#計算比率系數(shù)
adapte_dimens(dest_file,alpha)
end
總結:好了簡單的Ruby自動化適配腳本就完成了,當然還有很多需要改進的地方,現(xiàn)在是每一次運行腳本就會覆蓋目標目錄中的dimens.xml文件,如果有時候自動適配的效果不好偶爾需要人工做一些微調(diào),但是執(zhí)行這個腳本之后微調(diào)的值就會丟失掉,所以還需要改進。有興趣的同學可以自己實現(xiàn)。