Android不同裝置之間的螢幕差距比較大,如果不進行适配,會導緻在某一裝置上運作的界面在另外一個裝置上就不能正常展示了。現介紹幾種常見的适配方法:
1.java代碼适配: 适合做等大的控件
比如在布局中設定TextView的寬高:
<TextView
android:id="@+id/tv"
android:background="#F08080"
android:layout_width="100dp"
android:layout_height="100dp"
/>
則在不同的手機上,TextView的展示結果會不一樣,TextView有大有小了。如何能做到TextView寬高的自動适配呢?我們可以用代碼設定TextView的寬和高,比如說規定TextView寬高隻占螢幕寬高的1/2,則在所有手機上,TextView都能保證此效果:參考代碼如下:
public class AdaptActivity extends Activity {
private TextView mTextView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_adapt);
mTextView = (TextView) findViewById(R.id.tv);
//擷取螢幕寬高
WindowManager wm = (WindowManager) getSystemService(Context.WINDOW_SERVICE);
DisplayMetrics dm = new DisplayMetrics();
wm.getDefaultDisplay().getMetrics(dm);
int screenHeightPixels = dm.heightPixels;
int screenWidthPixels = dm.widthPixels;
System.out.println(screenHeightPixels+"===="+screenWidthPixels);
//設定TextView的寬和高:
mTextView.getLayoutParams().height=(int) (screenHeightPixels/+);
mTextView.getLayoutParams().width=(int) (screenWidthPixels/+);
mTextView.requestLayout();//要求重新更新下布局
}
}
2.權重适配:隻适用于線性布局或是線性布局的子類
(1)水準方向:width = 0dp, weight : 自定義
(2)垂直方向:height = 0dp, weight: 自定義
布局:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal" >
<TextView
android:id="@+id/tv1"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="2"
android:background="#F08080" />
<TextView
android:id="@+id/tv2"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="3"
android:background="#EEEE00" />
</LinearLayout>
運作在所有手機螢幕上會發現:都是按照2:3的比例配置設定
3.布局适配:不同手機會根據自己的參數選擇資源目錄下的圖檔,布局,值等,見下圖。
我們也可以模仿drawable單獨做布局:
layout中的布局如下:
<TextView
android:id="@+id/tv1"
android:layout_height="100dp"
android:layout_width="100dp"
android:text="普通布局"
android:textSize="22sp"
android:background="#F08080" />
layout-1280x800 中的布局如下:
<TextView
android:id="@+id/tv1"
android:layout_width="100dp"
android:layout_height="100dp"
android:background="#EEEE00"
android:text="1280*800的布局"
android:textSize="22sp" />
layout-800x480中的布局如下:
<TextView
android:id="@+id/tv1"
android:layout_width="100dp"
android:layout_height="100dp"
android:background="#76EE00"
android:text="480*800的布局"
android:textSize="22sp" />
最後在所有手機上運作,手機會根據自己的分辨率查找适合自己的布局:
是以對于一些複雜情況,我們可以單獨提供一份與裝置分辨率一緻的布局。這個可以做到精确适配。
4.圖檔适配:
在不同的drawable目錄下放置檔案名相同,内容不同的圖檔。布局檔案如下:
`
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/a" />
`則運作之後,手機會根據自己的參數查找不同的圖檔,結果如下:
是以,我們常常可以看到會在drawable多個目錄下放置不同的圖檔,不過一般而言優先考慮hdpi.再是xhdpi,部分圖檔再另外做。
補充知識點:如何判斷自己手機是高清還是低清的呢?
拿 3.7英寸,分辨率為480*800的手機舉例:
a.首先知道高清和低清的螢幕密度:
b.計算對角線上的像素點:
sqrt(480*480+800*800) = 933
c. 計算每英寸上有多少個像素點:
933/3.7=252 ===》hdpi每英寸上的像素是240,是以我們也可以得出該手機是hdpi。
5.dimens 适配:
方法和布局适配,圖檔适配類似,在設計到相關控件尺寸的時候,我們可以單獨建立一個檔案夾,如下圖所示:
手機會根據自己的參數查找對應檔案夾下的數值。
6.dp和px的轉換:
先看在hdpi下的效果展示:
其中的布局檔案如下:
圖一: android:layout_marginLeft=”100dp”
圖二:android:layout_marginLeft=”100px”
其餘情況都一樣,我們可以看到px和dp的不同了,
當選擇用mdpi手機展示的時候:px和dp保持一緻了:
轉換方法如下:dip=px/裝置密度
public static int dip2px(float dip){
float density =getContext().getResources().getDisplayMetrics().density;
int px = (int) (dip*density+0.5f);
return px;
}
public static float px2dip(int px){
float density = getContext().getResources().getDisplayMetrics().density;
return px/density;
}
7.其他适配原則:
a. 盡量使用9-patch圖檔,Android SDK中 有提供工具draw9patch.bat,可以制作.9圖檔。
b.布局檔案中最好不要出現具體的數字來表示尺寸,而應該交給dimens.xml管理
c.android代碼中寫的機關都是像素,是以有必要進行轉化
d.盡量采用dp機關動态比對
e.盡量使用fill_parent, match_parent來比對