Rudeness:粗暴快速的 Android 全屏幕適配方案

kongwenwen 6年前發布 | 35K 次閱讀 Android 開源 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):

 

 

 本文由用戶 kongwenwen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!