之前一直受到Android屏幕自适应的困惑。自己想到了一个方法,可以适应所有分辨率。
大概思路:xml使用绝对布局,在Activity中的onCreate方法重新设定各个控件的大小和位置。
下面举个例子说明:
这里我要显示一个正方形的TextView。它的边长刚好是手机宽的一半。
截图:
xml:
控件的坐标都用px表示。
<?xml version="1.0" encoding="utf-8"?>
<AbsoluteLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:layout_height="360px"
android:layout_width="360px"
android:gravity="center"
android:layout_x="0px"
android:layout_y="0px"
android:id="@+id/mainTextView1"
android:background="#000000"
android:textColor="#ffffff"
android:textSize="50px"/>
</AbsoluteLayout>
java文件:
suitCreen类是把控件view的原始大小根据分辨率进行比例缩放。
package com.text3;
import android.app.*;
import android.os.*;
import android.view.*;
import android.widget.*;
import android.widget.AbsoluteLayout.*;
public class MainActivity extends Activity
{
private TextView text;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
text=(TextView)findViewById(R.id.mainTextView1);
suitCreen A=new suitCreen();
text.setText("分辨率:"+A.getWinH()+"*"+A.getWinW());
A.suit(text); //重新设置text的大小和位置
}
//自适应屏幕
class suitCreen{
//屏幕分辨率
private int winW,winH;
public suitCreen(){
//获取屏幕分辨率
Display display = getWindowManager().getDefaultDisplay();
winW=display.getWidth();
winH=display.getHeight();
}
//设置view的坐标和高宽(x,y,w,h)
public void setButton(int x,int y,int w,int h,View view){
view.setLayoutParams(
new AbsoluteLayout.LayoutParams(w,h,x,y));
}
//自适应view
public void suit(View view){
LayoutParams laParams=(LayoutParams)view.getLayoutParams();
int x=(int)changeW(laParams.x);
int y=(int)changeH(laParams.y);
int w=(int)changeW(laParams.width);
int h=(int)changeH(laParams.height);
laParams.x=x;
laParams.y=y;
laParams.width=w;
laParams.height=h;
view.setLayoutParams(laParams);
}
//获取wuinW
public int getWinW(){
return winW;
}
//获取wuinH
public int getWinH(){
return winH;
}
//转换winW
public float changeW(float w){
return w*winW/720.0f;
}
//转换winH
public float changeH(float h){
return h*winH/1280.0f;
}
}
}
在另一台手机运行的截图:
TextView也占据了屏幕宽度的一半。
这种方法的缺点是在别的手机上控件会有一定的拉伸。