2025-07-08

整理瞭一些本人開發過程中遇到的屏幕適配問題及解決技巧

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 {

	@Override
	protected 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和y
		params1.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過程,如果是嵌套組件則需要註意其事件傳遞的處理。

好瞭,今天先到這,以後再慢慢補充吧。

裝載請保留出處:https://blog.csdn.net/u011638883/article/details/18001145

謝謝!!

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *