Android屏幕适配

首先写上三个工具类(这三个工具类在哪里都可以进行使用,中小型企业通用)

JettApplication.java
/**
 * 为了方便框架内部使用Application和得到context上下文.
 */
public class JettApplication extends Application {
    private static JettApplication instance;

    public static synchronized JettApplication getInstance() {
        return instance;
    }

    @Override
    public void onCreate() {
        super.onCreate();
        instance = this;
    }
}
UIUtils.java
/**
 * 用来按美工的基准值生成真实设备上需要的宽高值.
 */
public class UIUtils {
    private static UIUtils instance;
    public static final float STANDARD_WIDTH = 1080F;
    //1920 - 48  48像素是做状态栏 电量WIFI等等.
    public static final float STANDARD_HEIGHT = 1872F;
    /**
     * 基准值的默认值是48像素,但是有可能是其他的.
     * 那么状态栏的高度怎么拿到呢?
     * 我们可以通过安卓系统提供的一个类进行获取.
     * com.android.internal下面有一个R文件,下面有一个内部类
     * 在内部类里面定义了状态的宽高,可以通过反射拿到
     */
    private static final String DIMEN_CLASS = "com.android.internal.R&dimen";
    //"com.android.internal.R&dimen"里面的"system_bar_height"属性,状态栏的高度.
    private static final String SYSTEM_BAR_HEIGHT = "system_bar_height";
    //用来保存实际设备的值(在程序中取) 假设实际设备分辨率是480 800
    public float displayMetricsWidth;
    public float displayMetricsHeight;

    public static synchronized UIUtils getInstance(Context mContext) {
        if (instance == null) {
            instance = new UIUtils(mContext);
        }
        return instance;
    }


    //初始化
    private UIUtils(Context context) {
        //获取屏幕的真实宽高
        WindowManager windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
        //拿到DisplayMetrics对象后,在这里就可以存放宽高
        DisplayMetrics displayMetrics = new DisplayMetrics();
        if (this.displayMetricsWidth == 0.0F || this.displayMetricsHeight == 0.0F) {
            //获取当前显示的宽度,存放到DisplayMetrics里面.
            windowManager.getDefaultDisplay().getMetrics(displayMetrics);
            //获取状态框的高度
            int systemBarHeight = getSystemBarHeight(context);
            //处理真实的宽和高
            if (displayMetrics.widthPixels > displayMetrics.heightPixels) {
                //横屏(因为是横屏,屏幕翻转了,原来的宽,变成了DisplayMetrics属性里面的高)
                this.displayMetricsWidth = (float) displayMetrics.heightPixels;
                this.displayMetricsHeight = (float) displayMetrics.widthPixels - systemBarHeight;
            } else {
                //竖屏
                this.displayMetricsWidth = (float) displayMetrics.widthPixels;
                this.displayMetricsHeight = (float) displayMetrics.heightPixels - systemBarHeight;
            }
        }
    }

    /**
     * 获取状态框的高度
     */
    private int getSystemBarHeight(Context context) {
        return getValue(context, DIMEN_CLASS, SYSTEM_BAR_HEIGHT, 48);
    }

    /**
     * @param context        .
     * @param attrGroupClass 安卓源码中找到的存放维度的类.
     * @param attrName       状态框的信息.
     * @param defValue       默认值.
     * @return .
     */
    private int getValue(Context context, String attrGroupClass, String attrName, int defValue) {
        try {
            //获取类.
            Class e = Class.forName(attrGroupClass);
            //拿到对应的实例.
            Object obj = e.newInstance();
            //获取里面的信息
            Field field = e.getField(attrName);
            //状态栏的高度(获取到的是一个ID,需要转换成真实的高度)
            int x = Integer.parseInt(field.get(obj).toString());
            //转换成真实的高度(像素的方式).
            return context.getResources().getDimensionPixelOffset(x);
        } catch (Exception exception) {
            exception.printStackTrace();
        }
        return defValue;
    }

    /**
     * 开始获取缩放以后的结果.
     *
     * @param width .
     * @return .
     */
    public float getWidth(float width) {
        return width * this.displayMetricsWidth / STANDARD_WIDTH;
    }

    public float getHeight(float height) {
        return height * this.displayMetricsHeight / STANDARD_HEIGHT;
    }
}
ViewCalculateUtil.java
/**
 * 获取调用层传入的值进行设置.
 */
public class ViewCalculateUtil {
    public static void setViewLinearLayoutParam(View view, int width, int height, int topMargin, int bottomMargin, int leftMargin, int rightMargin) {
        LinearLayout.LayoutParams layoutParams = (LinearLayout.LayoutParams) view.getLayoutParams();
        if (width != LinearLayout.LayoutParams.MATCH_PARENT && width != LinearLayout.LayoutParams.WRAP_CONTENT) {
            layoutParams.width = (int) UIUtils.getInstance(JettApplication.getInstance()).getWidth(width);
        } else {
            layoutParams.width = width;
        }
        if (height != LinearLayout.LayoutParams.MATCH_PARENT && height != LinearLayout.LayoutParams.WRAP_CONTENT) {
            layoutParams.height = (int) UIUtils.getInstance(JettApplication.getInstance()).getHeight(height);
        } else {
            layoutParams.height = height;
        }
        //height是竖着缩放
        //width是横这缩放
        layoutParams.topMargin = (int) UIUtils.getInstance(JettApplication.getInstance()).getHeight(topMargin);
        layoutParams.bottomMargin = (int) UIUtils.getInstance(JettApplication.getInstance()).getHeight(bottomMargin);
        layoutParams.leftMargin = (int) UIUtils.getInstance(JettApplication.getInstance()).getWidth(leftMargin);
        layoutParams.rightMargin = (int) UIUtils.getInstance(JettApplication.getInstance()).getWidth(rightMargin);
        view.setLayoutParams(layoutParams);
    }
}

在Manifest里面进行设置application

    <application
        android:name=".JettApplication"
    </application>

然而用的时候呢,完成

ViewCalculateUtil.setViewLinearLayoutParam(textView1, 1080, 1872, 0, 0, 0, 0);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值