15.屏幕适配

屏幕适配 
  •  主流屏幕: 1280*720, 遵循原则: 不用AbsoluteLayout(绝对布局), 多用相对布局&线性布局(权重), 要用dp,不用px
  • 开发后期, 在不同分辨率屏幕上测试(480*800,1920*1080), 如果没出现太大问题(影响正常使用), 就可以上线

如果后期测出问题怎么办?
  •  图片适配
不是很常用,分别在drawable各放一套图,但会导致软件体积很大
  • 布局适配
不是很常用,  layout-800x480 专门适配480*800的屏幕
  • 尺寸适配
dp和px的关系: dp = px/设备密度

float density = getResources().getDisplayMetrics().density;
System.out.println("设备密度:" + density);

320*240(0.75), 480*320(1),480*800(1.5),1280*720(2)

values->dimens.xml  values-1280x720
  •  权重适配
android:weightSum="3"
  • 代码适配
获取屏幕宽高,动态计算控件大小
在智慧北京引导页下面的圆点写死了,侧边栏也在大屏幕会拉出很长,现在修改:
1.创建工具类
  1. public class DensityUtils {
  2. /**
  3. * dp转px
  4. */
  5. public static int dp2px(Context ctx, float dp) {
  6. float density = ctx.getResources().getDisplayMetrics().density;//获取屏幕像素密度
  7. int px = (int) (dp * density + 0.5f);// 4.9->5 4.4->4
  8. return px;
  9. }
  10. public static float px2dp(Context ctx, int px) {
  11. float density = ctx.getResources().getDisplayMetrics().density;
  12. float dp = px / density;
  13. return dp;
  14. }
  15. }
2.引导页面
小红点(dp)
  1. <View
  2. android:id="@+id/view_red_point"
  3. android:layout_width="10dp"
  4. android:layout_height="10dp"
  5. android:background="@drawable/shape_point_red" />
小灰点
  1. // 初始化引导页的小圆点
  2. for (int i = 0; i < mImageIds.length; i++) {
  3. View point = new View(this);
  4. point.setBackgroundResource(R.drawable.shape_point_gray);// 设置引导页默认圆点
  5. //这里面是像素dx,转换成dp
  6. LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
  7. DensityUtils.dp2px(this, 10), DensityUtils.dp2px(this, 10));
  8. if (i > 0) {
  9. params.leftMargin = DensityUtils.dp2px(this, 10);// 设置圆点间隔
  10. }
  11. point.setLayoutParams(params);// 设置圆点的大小
  12. llPointGroup.addView(point);// 将圆点添加给线性布局
  13. }

3.主页面:在代码中修改
  1. public void onCreate(Bundle savedInstanceState) {
  2. super.onCreate(savedInstanceState);
  3. requestWindowFeature(Window.FEATURE_NO_TITLE);
  4. setContentView(R.layout.activity_main);
  5. setBehindContentView(R.layout.left_menu);// 设置侧边栏
  6. SlidingMenu slidingMenu = getSlidingMenu();// 获取侧边栏对象
  7. slidingMenu.setTouchModeAbove(SlidingMenu.TOUCHMODE_FULLSCREEN);// 设置全屏触摸
  8. int width = getWindowManager().getDefaultDisplay().getWidth();// 获取屏幕宽度
  9. slidingMenu.setBehindOffset(width * 200 / 320);// 设置预留屏幕的宽度,按比例
  10. initFragment();
  11. }
美工做的








原文地址:https://www.cnblogs.com/sixrain/p/4919352.html