Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android中的屏幕適配

Android中的屏幕適配

編輯:關於Android編程

一、屏幕適配的個人理解

跌跌撞撞也好,摸爬滾打也罷。在Android編程圈子中也徘徊一年有余。對於較多基礎概念並不十分清楚,現在是時候回到更貼近底層的地方去的時候了。

Android系統的硬件覆蓋電子產品的方方面面,這也是硬件屏幕多樣化,形成Android碎片化重要原因。碎片化是一個難題,但並不表示,Android程序開發就不必做兼容考慮。所以,屏幕適配成為其中很重要的環節。

在市面上依舊沒有一勞永逸,一次適配所有的絕佳方案。但是,我們可以應用現有的技術手段能夠將我們App適用對象優化到更好,逐漸靠近百分百。通過不斷地創新與優化,找到最後的解決途徑。以下,將來聊聊實際中的適配處理。

1,適配中的核心關鍵詞

dpi:像素密度比,是指在固定的物理長度下的像素數量。【dot per inch】

dp[dip]:屏幕無關像素,不是物理長度,也不是像素點。只有在具體的像素密度比下,可以轉換為像素。dp*dpi = px;一款手機已經定制成功,像素密度比確定,dp也確定。

屏幕分辨率:屏幕高和寬的像素數。分辨率類型大致有:1920*1080(xxh);1280*720(xh);960*540,800*400,854*480(h);480*320(m);240*320(l);

low:medium:high:extra-high:extra-extra-high=3:4:6:8:12,即是:ldpi:mdpi:hdpi:xhdpi:xxhdpi=3:4:6:8:12。
\

不同像素密度下合理展示圖標大小:

\

2,適配的理解

適配的理解就是在程序運行的時候,程序在不同硬件上能夠展示如設計那樣的效果。

不適配的情形有:帶文字的控件寬度不夠,文字展示不全;圖標,Bar,按鈕過小或者過大。

個人理解,需要做好Android系統硬件的適配,需要分為兩個方面:

(1)同一分辨率下,不同屏幕大小【手機 -- IPad -- 電視】;

(2)同一屏幕尺寸下,不同屏幕分辨率。

對於第一種情形,處理的更多方式是直接另起一個APP,其內置展示頁面以及業務邏輯,因為屏幕之間巨大的差異,已經發生了質的變化,甚至可以說是不同的APP。

手機本身也存在多種尺寸,但因為其相差不是很大,屏幕長寬的比例依舊保持相差不大。也歸納到同一屏幕尺寸下,不同分辨率的適配。

當然,在同一APP中,也能夠實現屏幕尺寸發生巨大差異的處理。其維護及實現復雜度相比於再開啟一個APP的代價似乎更大。有這個方面的興趣,可以更多研究。Android屏幕適配經驗談 值得你擁有。&_& &_& &_& 當然,這個Android屏幕適配全攻略 也匹配的上更多的深研。

以下,將實現以“同一”硬件尺寸下的Android系統硬件適配。

二、屏幕適配的方法

1,布局方面

多使用LinearLayout,RelativeLayout,不使用絕對布局(現在已經過時);

2,控件屬性

多使用match_parent/wrap_content;可使用dp/sp,不使用px(Android Studio中已經有提醒);

3,權重

在長度/寬度為0dp時,使用layout_weight,垂直/水平根據權重分割父控件的對應高度/寬度。

 



    
    
    
適配效果:

 

布局適配:

\

整體適配效果:

\

單位適配:

\

4,使用硬件單位化

將手機屏幕虛擬的的劃分成為固定的份數,以320*480為例,生成對應分辨率資源文件。

 

public class MakeXml {
    private final static String rootPath = "C:\\Users\\Administrator\\Desktop\\layoutroot\\values-{0}x{1}\\";

    private final static float dw = 320f;
    private final static float dh = 480f;

    private final static String WTemplate = "{1}px\n";
    private final static String HTemplate = "{1}px\n";

    public static void main(String[] args) {
        makeString(320, 480);
        makeString(480, 800);
        makeString(480, 854);
        makeString(540, 960);
        makeString(600, 1024);
        makeString(720, 1184);
        makeString(720, 1196);
        makeString(720, 1280);
        makeString(768, 1024);
        makeString(768, 1280);//nexus 4
        makeString(800, 1280);
        makeString(1080, 1812);
        makeString(1080, 1920);
        makeString(1440, 2560);
        makeString(1536, 2048);//nexus 9
        makeString(2560, 1600);//nexus 10
    }

    public static void makeString(int w, int h) {

        StringBuffer sb = new StringBuffer();
        sb.append("\n");
        sb.append("");
        float cellw = w / dw;
        for (int i = 1; i < 320; i++) {
            sb.append(WTemplate.replace("{0}", i + "").replace("{1}",
                    change(cellw * i) + ""));
        }
        sb.append(WTemplate.replace("{0}", "320").replace("{1}", w + ""));
        sb.append("");

        StringBuffer sb2 = new StringBuffer();
        sb2.append("\n");
        sb2.append("");
        float cellh = h / dh;
        for (int i = 1; i < 480; i++) {
            sb2.append(HTemplate.replace("{0}", i + "").replace("{1}",
                    change(cellh * i) + ""));
        }
        sb2.append(HTemplate.replace("{0}", "480").replace("{1}", h + ""));
        sb2.append("");

        String path = rootPath.replace("{0}", h + "").replace("{1}", w + "");
        File rootFile = new File(path);
        if (!rootFile.exists()) {
            rootFile.mkdirs();
        }
        File layxFile = new File(path + "lay_x.xml");
        File layyFile = new File(path + "lay_y.xml");
        try {
            PrintWriter pw = new PrintWriter(new FileOutputStream(layxFile));
            pw.print(sb.toString());
            pw.close();
            pw = new PrintWriter(new FileOutputStream(layyFile));
            pw.print(sb2.toString());
            pw.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
    }

    public static float change(float a) {
        int temp = (int) (a * 100);
        return temp / 100f;
    }
java生成文件放置在res/目錄下。

 

\

使用:

 

效果:

 

\

弊端:當沒生成對應分辨率的文件時,展示效果為空白,如Nexus 7所示。並且生成文件一直在APP中,相對較耗存儲空間。

5,圖片適配

依據不同分辨率,切出對應分辨率的圖片,可實現背景、按鈕、圖片、TabBar、Icon等的屏幕適配。

切圖比例如圖所示:

\

為了縮小App的體積,且多套圖是不太建議的。可以采用切大圖及市場占有率最高的兩套來適配所有。

圖片適配遍歷的流程:

\

圖片適配還可以采用.9圖片來實現。在.9圖片的制作中,請注意每邊都留上2px,即是不讓邊框線完全沒有。同時也注意縮放范圍。保持最核心圖標的合理變形,整體符合視覺效果的合理縮放。

Android SDK中提供了編輯9-Patch圖片的工具,在tools目錄下draw9patch.bat,能夠立刻看到編輯後的拉伸效果。

 

6,百分比屏幕適配

浏覽器中,Web程序展示的屏幕變化並不會少於手機樣式,但是很少出現適配問題。是多采用比例布局的緣故。在Android5.0中,新增百分比布局。

 




    
布局展示效果:

 

\

百分布局中,控件是相對與父控件的對應屬性。所以,在指定過某些控件的固定長度後,依舊不能完全適配。如視圖第一行所示。在完全分割父控件對應屬性100%的情形下,百分布局的適配性很好。

 

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved