在Android日常開發中,我們經常會遇到各種不同螢幕尺寸的手機,適配是一件很讓人頭疼的事情,特別是剛接觸Android開發的童鞋,Axis 是我在開發中常用的方案,一套圖(1920*1080)來適配所有的機型。主要是運用了等比縮放的方案,但是在實際開發中,只做X軸的等比,Y軸超出部分用滾動條。 這樣就能避免,XY軸同時縮放帶來的變形問題。
Axis是什麼?
一個用Java程式碼動態佈局的適配方案。
Axis怎麼用?
其實很簡單,先來了解一下,一個View在螢幕中的位置以及形狀取決於(x,y,w,h),既左上角座標和View的實際寬高。接下來直接看下程式碼中的使用。
-
獲取螢幕 w,h以及scaledDensity。
DisplayMetrics metrics = new DisplayMetrics(); WindowManager mWindowManager = (WindowManager) AxisConfig.mContext .getSystemService(Context.WINDOW_SERVICE); mWindowManager.getDefaultDisplay().getMetrics(metrics); w = metrics.widthPixels; h = metrics.heightPixels; scaledDensity = metrics.scaledDensity; 複製程式碼
-
再來看一下核心部分,X軸與Y軸的等比縮放方法 //Config.width Config.height就是我們UI妹子設計的UI圖寬高啦,目前一般都是(1920*1080)
public static int scaleX(int x, float ox) { return (int) (x * (w - w * ox) / (Config.width - Config.width * ox)); } public static int scaleY(int y, float oy) { return (int) (y * (h - h * oy) / (Config.height - Config.height * oy)); } 複製程式碼
-
用Android 自帶API 動態新增View //這樣就新增了一個View
RelativeLayout middleLayout = new RelativeLayout(getActivity()); middleLayout.setBackgroundColor(0xFF20B2AA); RelativeLayout.LayoutParams middleLayout_Params = new RelativeLayout.LayoutParams(Axis.scaleX(800), Axis.scaleX(800)); middleLayout_Params.addRule(RelativeLayout.CENTER_IN_PARENT); view.addView(middleLayout,middleLayout_Params); middleLayout = new RelativeLayout(getActivity()); middleLayout.setBackgroundColor(0xFF1874CD); middleLayout_Params = new RelativeLayout.LayoutParams(Axis.scaleX(400),Axis.scaleX(400)); middleLayout_Params.addRule(RelativeLayout.CENTER_HORIZONTAL); middleLayout_Params.setMargins(0,Axis.scaleX(250),0,0); view.addView(middleLayout,middleLayout_Params); 複製程式碼
-
以上是View的適配,因為用了等比縮放,就直接忽略了螢幕密度,下面說說字型的適配,這個就和螢幕密度有關了,看下面 public static float scaleTextSize(int textSize) { return scale(textSize) / scaledDensity; }
-
再說一下,其實能用XML佈局的屬性,程式碼基本上都是有這個屬性的,所以用Java程式碼佈局,把介面拆分,做成元件,是一件非常簡單的事情,而且複用性相當高的。 比如說HeaderView BottomView 等等複雜的View都可以封裝起來。好了就說到這吧。直接看程式碼吧。 哈哈哈哈。。。。記得在你的 Application中初始化哦。 Axis.init(this,1080,1920);//適配初始化,基準寬高
-
Github:專案地址