整理了一些本人開發過程中遇到的螢幕適配問題及解決技巧
1、切表徵圖
比如一個列表中每個清單項目都有一個表徵圖但是表徵圖的大小可能不是完全一樣的。此時,可以根據最大的那個圖片來指定統一尺寸,即將其他一些小的表徵圖置中然後在四周填充"透明像素",來使得表徵圖的大小一致,以便於布局排版。
2、複雜介面的螢幕適配
最好的適配方法就是使用螢幕百分比為計算單位來動態添加產生組件。下面以一個筆者使用代碼建立的介面為例加以說明:
可以看到這個書架中每本書都包含右上方的高光和右下角的陰影,此外每本書占螢幕的高度和寬度,以及書與書之間的距離都是有要求的。這種情況下想從布局檔案來實現介面適配基本是辦不到的,那麼只能從代碼來產生組件了,雖然麻煩了一點,但好在適配的效果不錯。具體的實現太過冗長,下面以一個簡單的介面為例
實現代碼如下,MainAcivity:
package com.wly.simplecodeui;import android.app.Activity;import android.content.Context;import android.os.Bundle;import android.util.DisplayMetrics;import android.view.WindowManager;import android.widget.Button;import android.widget.ImageView;import android.widget.RelativeLayout;import android.widget.RelativeLayout.LayoutParams;public class MainActivity extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);//setContentView(R.layout.activity_main);RelativeLayout layout = new RelativeLayout(this);int screenWidth = getScreenWidth(this);int screenHeight = getScreenHeight(this);ImageView iv = new ImageView(this);//指定60%的寬,10%的高LayoutParams params1 = new LayoutParams((int)(screenWidth * 0.6), (int)(screenHeight * 0.1));//指定左上方x和yparams1.leftMargin = (int)(screenWidth * 0.4)/2;params1.topMargin = (int)(screenHeight * 0.2);//設定id屬性,後面相對布局時需要用到iv.setId(0x0011);iv.setBackgroundColor(0xff123456);Button left = new Button(this);LayoutParams params2 = new LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT);//位於iv下面params2.addRule(RelativeLayout.BELOW, 0x0011);//對齊左側params2.addRule(RelativeLayout.ALIGN_LEFT,0x0011);left.setText("《《《");Button right = new Button(this);LayoutParams params3 = new LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT);//位於iv下面params3.addRule(RelativeLayout.BELOW, 0x0011);//對齊右側params3.addRule(RelativeLayout.ALIGN_RIGHT,0x0011);right.setText("》》》");layout.addView(iv, params1);layout.addView(left, params2);layout.addView(right, params3);this.setContentView(layout);}/** * 得到螢幕寬度 * @return 單位:px */public int getScreenWidth(Context context) {int screenWidth;WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);DisplayMetrics dm = new DisplayMetrics();wm.getDefaultDisplay().getMetrics(dm);screenWidth = dm.widthPixels;return screenWidth;}/** * 得到螢幕高度 * @return 單位:px */public int getScreenHeight(Context context) {int screenHeight;WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);DisplayMetrics dm = new DisplayMetrics();wm.getDefaultDisplay().getMetrics(dm);screenHeight = dm.widthPixels;return screenHeight;}}
3、使用"容器"來放置動態資料。
有時組件是動態,即只有在運行時才知道組件的具體類型或形狀。此時可以在布局檔案中預先設定一個"容器",可以是一個RelativeLayout,然後在程式運行時得到組件資訊,再產生組件並將組件添加到"容器"中。這裡的"容器"有點預留位置的意味,先佔一個位置再說,至於具體向容器中添加多少組件,由運行時環境決定。以下筆者實現是一個使用"容器"的例子,是一個廣告欄組件,關鍵在於該組件中包含的廣告數是從伺服器動態擷取的。所以需要可以使用"容器"來佔位,再向其中添加組件。
4、運用透明像素實現介面適配
針對一個組件的周圍可能存在透明像素的適配情況。以ListView的分割線為例,假設分割線的左右都有透明像素,此時如果只是簡單的將組件剪裁出來,然後通過在左右添加Margin的方式做適配的話,是無法適配所有介面的(儘管你可能已經使用dpToPx方法)。那麼有一個方法就是將分割線兩端的透明像素一起剪裁下來,然後使用layout_width="fill_parent",這樣分割線會自動隨螢幕的寬度進行縮放。
5、ScaleType的使用
有時候在精度要求不是很高的情況下,可以使用ScaleType來快速的完成ImageView的適配。通常用到的有fitXY,即展開圖片至鋪滿組件。
6、自訂群組件的使用
目前為止,筆者實現過的自訂群組件可以分為兩種,一種是重寫系統組件,添加某些功能。另外一種則是將幾個相關的組件封裝成一種複合組件,以便複用。嚴格來說,後者不算是自訂群組件。如果寫的是一個複雜的自訂群組件,需喲注意其measure和layout過程,如果是嵌套組件則需要注意其事件傳遞的處理。
好了,今天先到這,以後再慢慢補充吧。
裝載請保留出處:http://blog.csdn.net/u011638883/article/details/18001145
謝謝!!