平板中UI 模拟餐馆真实布局

原创 2015年11月19日 14:26:14

最近项目有个需求是实现模拟餐馆真实的餐桌布局,后台给出的数据实体是:

1.

private int height;     //参照的基准高度
private int width;      //参照的基准宽度
private int id;
private String name;
private String roomImg;        //房间的图片
private TablesModel[] tables;  //餐桌实体
2.

private int coordinateX;    //餐桌的X坐标
private int coordinateY;    //餐桌的Y坐标
private int height;         //餐桌的高度
private int width;          //餐桌的宽度
private int id;
private String name;
private int roomId;
private String tableImg;    //餐桌的图片

实现代码:

 private void showRoomsUI(ViewGroup group, RestRoomsModel roomsModel) {
        group.removeAllViews();
        referenceWidth = roomsModel.getWidth();
        referenceHeight = roomsModel.getHeight();
        final TablesModel[] tablesModels = roomsModel.getTables();
        for (int i = 0; i < tablesModels.length; i++) {
            View view = LayoutInflater.from(this)
                    .inflate(R.layout.table_layout /* resource id */, group /* parent */, false);
            setLayout(view, getScaleX(tablesModels[i]), getScaleY(tablesModels[i]),
                    getScaleW(tablesModels[i]), getScaleH(tablesModels[i]));

            ImageView table_img = (ImageView) view.findViewById(R.id.iv_table_img);
            final TextView table_name = (TextView) view.findViewById(R.id.tv_table_name);
            table_name.setText(tablesModels[i].getName());
            AsyncImageLoader.displayImage(tablesModels[i].getTableImg(), table_img);

            group.addView(view);
          
        }
    }

   /**
     * 得到餐桌的宽和高应该缩放的比例
     * @return
     */
    private double getScale() {
        double sh, sw;
        if (WidgetController.getScreenHeight() > WidgetController.getScreenWidth()) {
            sh = WidgetController.getScreenWidth();
            sw = WidgetController.getScreenHeight();
        } else {
            sh = WidgetController.getScreenHeight();
            sw = WidgetController.getScreenWidth();
        }

        // 同比例放大时 检测是高度先充满还是宽带先充满
        if (sw / referenceWidth > sh / referenceHeight) { //高度先充满
            return sh / referenceHeight;
        } else {    //宽度先充满
            return sw / referenceWidth;
        }
    }

    /**
     * 得到餐桌 X 坐标应该缩放的比例
     * @return
     */
    private double getXScale() {
        double sw;
        if (WidgetController.getScreenHeight() > WidgetController.getScreenWidth()) {
            sw = WidgetController.getScreenHeight();
        } else {
            sw = WidgetController.getScreenWidth();
        }

        return sw / referenceWidth;
    }

    /**
     * 得到餐桌 Y 坐标应该缩放的比例
     * @return
     */
    private double getYScale() {
        double sh;
        if (WidgetController.getScreenHeight() > WidgetController.getScreenWidth()) {
            sh = WidgetController.getScreenWidth();
        } else {
            sh = WidgetController.getScreenHeight();
        }

        return sh / referenceHeight;
    }

    /**
     * 得到餐桌的高度
     * @param tablesModel
     * @return
     */
    private int getScaleH(TablesModel tablesModel) {
        return (int) (tablesModel.getHeight() * getScale());
    }

    /**
     * 得到餐桌的宽度
     * @param tablesModel
     * @return
     */
    private int getScaleW(TablesModel tablesModel) {
        return (int) (tablesModel.getWidth() * getScale());
    }

    /**
     * 得到餐桌相对于自己设备的 X 坐标
     * @param tablesModel
     * @return
     */
    private int getScaleX(TablesModel tablesModel) {
        return (int) (tablesModel.getCoordinateX() * getXScale());
    }

    /**
     * 得到餐桌相对于自己设备的 Y 坐标
     * @param tablesModel
     * @return
     */
    private int getScaleY(TablesModel tablesModel) {
        return (int) (tablesModel.getCoordinateY() * getYScale()) + UIUtility.dp2px(48, this);
    }

    /**
     * 动态设置View位置
     *
     * @param view   View
     * @param x      X坐标
     * @param y      Y坐标
     * @param width  按照比例缩放后的宽度
     * @param height 按照比例缩放后的高度
     */
    public void setLayout(View view, int x, int y, int width, int height) {
        ViewGroup.MarginLayoutParams margin = new ViewGroup.MarginLayoutParams(view.getLayoutParams());
        margin.leftMargin = x;
        margin.topMargin = y;
        RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(margin);
        layoutParams.height = height;
        layoutParams.width = width;
        view.setLayoutParams(layoutParams);
    }


一道面试题:餐馆模拟

前阵子遇到一个面试题,当时没有做出来,后来断断续续的用了一周的时间做了出来,但感觉也不完全对,先来看看题目,稍后再讨论。 问题 模拟一个餐馆,三个厨师,二个服务员,厨师单独做菜,2分钟一个菜,服务...

android 平板获取真实宽高(包括状态栏)

出于目前android平板方面的书籍非常少很多有关android平板与android手机开发之间的区别的文章更是凤毛麟资,本文是对andriod平板新手而写,高手勿喷。 关于android手机屏幕与...

大屏时代的生态变迁_看平板手机的拇指热键与界面布局

原文链接 大屏时代的生态变迁,看平板手机的拇指热键与界面布局 博文视点 2017-05-11 09:52:33 浏览73 评论0 android http 布局 Blog 触...

平板灯布局分析及计划细致事变

光源的布局重要有以下质料: (铝框架) 1.铝框架     表面布局,及LED散热重要结构——一样通常利用AL6063,铝挤模,前期本钱投入低,表面处置处罚雅观,散热结果好,前些日子去看展也有...

使用Genymotion模拟器模拟平板设备

在最近的项目开发中,遇到平板适配问题。使用限定符layout-large创建平板布局。因为我是用的是genymotion模拟器,所以需要模拟平板,但是百度许久不到答案。 后来发现,在genymoti...

利用Fragment编写简易新闻界面,布局同时适应Android手机和平板电脑

大家好,最近从事培训工作碰到一个练习题,利用Fragment编写简易新闻界面,并且布局能同时适应手机和平板电脑,这是书本上的一个练习题,题目本身没多大难度,个人觉得作者代码的模块化做得比较好,所以拿出...

Android平板上类似于电脑的网格布局一种实现策略

平板上网格列表的实现在平板上,很多app里面都有类似于电脑的那种列表,可以上下滑动,之后每一列有很多类别,每一个类别占用空间不同,实现起来有些复杂,下面直接上图 这里中间还没有分割线,如果有分割线,...

android-支持多种屏幕[声明适用于 Android 3.2 的平板电脑布局] 七

对于第一代运行 Android 3.0 的平板电脑,声明平板电脑 的正确方式是将它们放在有 xlarge 配置限定符的目录(例如 res/layout-xlarge/)中。为适应其他类型的平板电脑和屏...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:平板中UI 模拟餐馆真实布局
举报原因:
原因补充:

(最多只允许输入30个字)