在Android开发中,获取手机屏幕像素的方法有多种。在这里,我仅仅做一个小小的总结,将这些方法分为两类。一类是使用Activity类来获取,另一类便是使用上下文(Context)来获取。
1、使用Activity类中的方法来获取,使用范围是在Activity的类及子类中和有传入Activity类及子类的对象参数的方法中使用
①在Activity的子类中使用
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 通过Activity类中的getWindowManager()方法获取窗口管理,再调用getDefaultDisplay()方法获取获取Display对象
Display display = getWindowManager().getDefaultDisplay();
// 方法一(推荐使用)使用Point来保存屏幕宽、高两个数据
Point outSize = new Point();
// 通过Display对象获取屏幕宽、高数据并保存到Point对象中
display.getSize(outSize);
// 从Point对象中获取宽、高
int x = outSize.x;
int y = outSize.y;
// 通过吐司显示屏幕宽、高数据
Toast.makeText(this, "手机像素为:" + x + "x" + y, Toast.LENGTH_LONG).show();
// 方法二(不推荐使用)直接通过Display对象获取屏幕宽、高数据
int width = display.getWidth();
int height = display.getHeight();
// 通过吐司显示屏幕宽、高数据
Toast.makeText(this, "手机像素为:" + width + "x" + height, Toast.LENGTH_LONG).show();
}
}
②在传入Activity类及子类对象的方法中调用
public class Utils {
/**
* 该方法获取屏幕分辨率的值
* @param activity 调用此方法的Activity对象
* @return Point 存有屏幕分辨率的对象
*/
public static Point getSize(Activity activity) {
// 通过Activity类中的getWindowManager()方法获取窗口管理,再调用getDefaultDisplay()方法获取获取Display对象
Display display = activity.getWindowManager().getDefaultDisplay();
// 使用Point来保存屏幕宽、高两个数据
Point outSize = new Point();
// 通过Display对象获取屏幕宽、高数据并保存到Point对象中
display.getSize(outSize);
return outSize;
}
}
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 通过调用Utils类中的getSize方法,传入当前Activity作为参数获取
Point outSize = Utils.getSize(this);
// 从Point对象中获取宽、高
int x = outSize.x;
int y = outSize.y;
// 通过吐司显示屏幕宽、高数据
Toast.makeText(this, "手机像素为:" + x + "x" + y, Toast.LENGTH_LONG).show();
}
}
2、使用上下文(Context)获取系统服务来获取,使用范围是在一些没有Activity及其子类对象而只有上下文(Context)的类或者方法中,比如Fragment类及其子类中。
public class Utils {
/**
* 该方法获取屏幕分辨率的值
*
* @param context
* 调用此方法的上下文对象
* @return Point 存有屏幕分辨率的对象
*/
public static Point getSize(Context context) {
// 通过上下文的getSystemService()方法获取系统服务来获取WindowManager对象
WindowManager windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
// 通过WindowManager对象的getDefaultDisplay()方法获取Display对象
Display display = windowManager.getDefaultDisplay();
// 使用Point来保存屏幕宽、高两个数据
Point outSize = new Point();
// 通过Display对象获取屏幕宽、高数据并保存到Point对象中
display.getSize(outSize);
return outSize;
}
}
public class MyFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.activity_fragment, null);
// 通过调用Utils类中的getSize方法,通过View对象的getContext()方法获取Context对象作为参数获取Point对象
Point outSize = Utils.getSize(view.getContext());
// 从Point对象中获取宽、高
int x = outSize.x;
int y = outSize.y;
// 通过吐司显示屏幕宽、高数据
Toast.makeText(view.getContext(), "手机像素为:" + x + "x" + y, Toast.LENGTH_LONG).show();
return view;
}
}
3、上面演示了两种分别以Activity和Context作为参数获取屏幕分辨率的方法,如果是仅仅有两种单独的使用,那么分别选用两种方法的对应条件下的方法使用即可。但是如果同时需要在Activity中调用,也需要在Fragement中调用来获取分辨率,其实只需要一个方法也就可以了,那就是以Activity作为参数的。因为Activity是Context的子类,在Context作为参数传入该方法时,只要强制将Context转换成Activity类型就可以了。
public class Utils {
/**
* 该方法获取屏幕分辨率的值
* @param activity 调用此方法的Activity对象
* @return Point 存有屏幕分辨率的对象
*/
public static Point getSize(Activity activity) {
// 通过Activity类中的getWindowManager()方法获取窗口管理,再调用getDefaultDisplay()方法获取获取Display对象
Display display = activity.getWindowManager().getDefaultDisplay();
// 使用Point来保存屏幕宽、高两个数据
Point outSize = new Point();
// 通过Display对象获取屏幕宽、高数据并保存到Point对象中
display.getSize(outSize);
return outSize;
}
}
public class MyFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.activity_fragment, null);
// 通过调用Utils类中的getSize方法,通过View对象的getContext()方法获取Context对象,并且强制转换成Activity作为参数获取Point对象
Point outSize = Utils.getSize((Activity)view.getContext());
// 从Point对象中获取宽、高
int x = outSize.x;
int y = outSize.y;
// 通过吐司显示屏幕宽、高数据
Toast.makeText(view.getContext(), "手机像素为:" + x + "x" + y, Toast.LENGTH_LONG).show();
return view;
}
}
4、有两个类可以获取到屏幕的像素,之前我们使用到的都是Display类,这个类保存着关于屏幕的很多相关的参数,分辨率只是其中的一个。这里要介绍的另一个类是DisplayMetrics类,这个类保存的就是屏幕像素相关的内容。在Display的getSize()方法中,也是将DisplayMetrics的关于屏幕像素的宽、高设置于Point中。
//Display
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 通过Activity类中的getWindowManager()方法获取窗口管理,再调用getDefaultDisplay()方法获取Display对象
Display display = getWindowManager().getDefaultDisplay();
Point outSize = new Point();
display.getSize(outSize);
int x = outSize.x;
Toast.makeText(this, "手机像素为:" + x + "x" + y, Toast.LENGTH_LONG).show();
}
}
//DisplayMetrics
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 声明一个DisplayMetrics对象
DisplayMetrics metrics = new DisplayMetrics();
// 获取Manager对象后获取Display对象,然后调用getMetrics()方法
getWindowManager().getDefaultDisplay().getMetrics(metrics);
// 从DisplayMetrics对象中获取宽、高
int heightPixels = metrics.heightPixels;
int widthPixels = metrics.widthPixels;
// 通过吐司显示屏幕宽、高数据
Toast.makeText(this, "手机像素为:" + widthPixels + "x" + heightPixels, Toast.LENGTH_LONG).show();
}
}