Rudeness:粗暴快速的 Android 全屏幕適配方案
方案分析見 一種粗暴快速的Android全屏幕適配方案 。
本項目包括:
- rudeness-sdk。根據上述方案實現的一個非常簡單的庫。
- rudeness-demo。這是demo。
使用姿勢:
-
核心。使用冷門的pt作為長度單位,按照上述想法將其重定義為與屏幕大小相關的相對單位,不會對dp等常用單位的使用造成影響。
-
繪制。編寫xml時完全對照設計稿上的尺寸來編寫,只不過單位換為pt。假如設計圖寬度為200,一個控件在設計圖上標注的長度為3,只需要在初始化時定義寬度為200,繪制該控件時長度寫為3pt,那么在任何大小的屏幕上該控件所表現的長度都為屏幕寬度的3/200。如果需要在代碼中動態轉換成px的話,使用 TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_PT, value, metrics) 。
-
預覽。實時預覽時繪制頁面是很重要的一個環節。以1334x750的設計圖為例,為了實現于正常繪制時一樣的預覽功能,創建一個長為1334磅,寬為750磅的設備作為預覽,經換算約為21.5英寸( (sqrt(1334^2+750^2))/72 )。預覽時選擇這個設備即可。
-
代碼處理。(代碼比較簡單,所以你也可以不使用本依賴自己處理) 在build.gradle中加入依賴:
compile 'com.bulong.rudeness:rudeness:latest.release@aar'
在Application的onCreate中引用:
//設計圖標注的寬度 int designWidth = 750; new RudenessScreenHelper(this, designWidth).activate();
這樣繪制出來的頁面就跟設計圖幾乎完全一樣,無論大小屏上看起來就只是將設計圖縮放之后的結果。
SDK API Refrences:
public class RudenessScreenHelper {
/**
* 轉換dp為px
* @param context context
* @param value 需要轉換的dp值
* @return px值
*/
public static float dp2px(Context context, float value);
/**
* 轉換pt為px
* @param context context
* @param value 需要轉換的pt值,若context.resources.displayMetrics經過resetDensity()的修改則得到修正的相對長度,否則得到原生的磅
* @return px值
*/
public static float pt2px(Context context, float value);
/**
* 構造方法
* @param application application
* @param width 設計稿寬度
*/
public RudenessScreenHelper(Application application, float width);
/**
* 激活本方案
*/
public void activate();
/**
* 恢復系統原生方案
*/
public void inactivate();
}
FAQ
若存在webview導致適配失效的問題
可以先繼承WebView并重寫 setOverScrollMode(int mode) 方法,在方法中調用super之后調用一遍 RudenessScreenHelper.resetDensity(getContext(), designWidth) 規避
若存在dialog中適配失效的問題
可以在dialog的oncreate中調用一遍 RudenessScreenHelper.resetDensity(getContext(), designWidth) 規避
旋轉屏幕之后適配失效
可以在onConfigurationChanged中調用 RudenessScreenHelper.resetDensity(getContext(), designWidth) 規避
特定國產機型ROM中偶先fragment失效
可以在fragment的onCreateView中調用 RudenessScreenHelper.resetDensity(getContext(), designWidth) 規避
關于demo:
- 正常編寫的頁面 是按照dp來編寫的頁面
- 粗暴適配的頁面 是按照本方案編寫的頁面
在多種不同屏幕大小的真機與虛擬機下運行項目,可見 粗暴適配的頁面 表現幾乎一致,而 正常編寫的頁面 在大屏與小屏之間看起來差異較大。
正常編寫的頁面左圖API19 400x800, 右圖API24 1440x2560):
粗暴適配的頁面(左圖API19 400x800, 右圖API24 1440x2560):