关于android手机屏幕适配,我至今没找到一个合适的方法....于是自己想了一个歪招。
原理也比较简单,例如大多手机的标准分辨率是1920 * 1080或1280 * 720
但是遇到1800 * 1080或1184 * 720的就麻烦了(何况有些手机还有虚拟按键状态栏),其实也简单,把1800当1920来用,1184当1280来用就OK了
使用代码如下:
//宽度默认为null既是全满,在findViewById时去适配,最后得到适配成功的View对象
ImageView img_two = (ImageView) (ScreenUtils.setViewHeight(context, findViewById(R.id.img_two), null, 0.16f);
本人菜鸟,大家有更好的方法,欢迎指点....
/** * View比例适配 * @return */ public static View setViewHeight(Context context, final View view, Float width, float height) { L.i("父类布局:"+view.getParent().getClass().toString()); //这里计算了不标准分辨率屏幕,强制把它当作变准的1920或1280的高度来适配,后续需要其他分辨率的话可以再添加 int totalHeight = 0; if(ScreenUtils.getTotalHeight(context) > 1700 && ScreenUtils.getTotalHeight(context) < 1920) { totalHeight = 1920; }else if(ScreenUtils.getTotalHeight(context) > 1100 && ScreenUtils.getTotalHeight(context) < 1280) { totalHeight = 1280; } else { totalHeight = ScreenUtils.getTotalHeight(context); } if(width == null) { if(view.getParent().getClass().toString().equals("class android.widget.LinearLayout")) { LinearLayout.LayoutParams params = new LinearLayout.LayoutParams( LinearLayout.LayoutParams.MATCH_PARENT, (int) (totalHeight * height + 0.5f)); view.setLayoutParams(params); return view; } if(view.getParent().getClass().toString().equals("class android.widget.RelativeLayout")) { RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams( RelativeLayout.LayoutParams.MATCH_PARENT, (int) (totalHeight * height + 0.5f)); view.setLayoutParams(params); return view; } if(view.getParent().getClass().toString().equals("class android.widget.FrameLayout")) { FrameLayout.LayoutParams params = new FrameLayout.LayoutParams( FrameLayout.LayoutParams.MATCH_PARENT, (int) (totalHeight * height + 0.5f)); view.setLayoutParams(params); return view; } }else { if(view.getParent().getClass().toString().equals("class android.widget.LinearLayout")) { LinearLayout.LayoutParams params = new LinearLayout.LayoutParams( (int) (ScreenUtils.getScreenWidth(context) * width + 0.5f), (int) (totalHeight * height + 0.5f)); view.setLayoutParams(params); return view; } if(view.getParent().getClass().toString().equals("class android.widget.RelativeLayout")) { RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams( (int) (ScreenUtils.getScreenWidth(context) * width + 0.5f), (int) (totalHeight * height + 0.5f)); view.setLayoutParams(params); return view; } if(view.getParent().getClass().toString().equals("class android.widget.FrameLayout")) { FrameLayout.LayoutParams params = new FrameLayout.LayoutParams( (int) (ScreenUtils.getScreenWidth(context) * width + 0.5f), (int) (totalHeight * height + 0.5f)); view.setLayoutParams(params); return view; } } return null; }
/** * 获得屏幕宽度 * * @param context * @return */ public static int getScreenWidth(Context context) { WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); DisplayMetrics outMetrics = new DisplayMetrics(); wm.getDefaultDisplay().getMetrics(outMetrics); return outMetrics.widthPixels; } /** * @param context * @return 获取屏幕内容高度不包括虚拟按键 */ public static int getScreenHeight(Context context) { WindowManager wm = (WindowManager) context .getSystemService(Context.WINDOW_SERVICE); DisplayMetrics outMetrics = new DisplayMetrics(); wm.getDefaultDisplay().getMetrics(outMetrics); return outMetrics.heightPixels; } /** * @param context * @return 获取屏幕原始尺寸高度,包括虚拟功能键高度 */ public static int getTotalHeight(Context context) { int dpi = 0; WindowManager windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); Display display = windowManager.getDefaultDisplay(); DisplayMetrics displayMetrics = new DisplayMetrics(); @SuppressWarnings("rawtypes") Class c; try { c = Class.forName("android.view.Display"); @SuppressWarnings("unchecked") Method method = c.getMethod("getRealMetrics", DisplayMetrics.class); method.invoke(display, displayMetrics); dpi = displayMetrics.heightPixels; } catch (Exception e) { e.printStackTrace(); } return dpi; }