JsonView beta1

根据json布局控件,适合控制 简易图墙 布局,支持控件嵌套,暂时支持内外边距,tro(toTheRightOf ,位于控件右边),tbo(toTheBottomOf,位于控件下面),背景颜色,图片,点击等,w指定占父布局宽度的比例,h指定自身高度与自身宽度的比例,id为控件设置id,tro和tbo后的数值为id,表明在对应控件右边或下边。具体支持属性如下。

public class SimpleView {
    public int  ml;
    public int  mr;
    public int  mt;
    public int  mb;
    public int  pl;
    public int  pt;
    public int  pr;
    public int  pb;
    public double  w;
    public double  h;
    public int  id;
    public String  bgColor;
    public String srcUrl;
    public String  click;
    public int tro;
    public int tbo;
}

json中,每一个[ ] 对应一个父布局,[ ] 中第一个元素为该父布局的属性(内外边距,背景等),其余元素每一个对应一个子控件。

json示例如下:

[
  {
    "ml":0,
    "mr":0,
    "mt":0,
    "mb":0,
    "pl":0,
    "pt":0,
    "pr":0,
    "pb":0,
    "w":0.99,
    "h":0.66,
    "bgColor":"#e1e1e1",
    "bg":"http://...png....1",
    "click":"xx://xx"
  },

  {
    "id":1,
    "ml":0,
    "mr":0,
    "mt":0,
    "mb":0,
    "pl":0,
    "pt":0,
    "pr":0,
    "pb":0,
    "w":0.66,
    "h":1,
    "bgColor":"#00ff00",
    "srcUrl":"http://img2.3lian.com/2014/c7/12/d/77.jpg",
    "click":"xx://xx"

  },
  {
    "id":2,
    "tro":1,
    "ml":0,
    "mr":0,
    "mt":0,
    "mb":0,
    "pl":0,
    "pt":0,
    "pr":0,
    "pb":0,
    "w":0.33,
    "h":0.5,
    "bgColor":"#0000ff",
    "srcUrl":"http://pic3.bbzhi.com/fengjingbizhi/gaoqingkuanpingfengguangsheyingps/show_fengjingta_281299_11.jpg",
    "click":"xx://xx"
  },
  {
    "id":3,
    "tro":1,
    "tbo":2,
    "ml":0,
    "mr":0,
    "mt":0,
    "mb":0,
    "pl":0,
    "pt":0,
    "pr":0,
    "pb":0,
    "w":0.33,
    "h":0.5,
    "bgColor":"#ffff00",
    "srcUrl":"http://www.bz55.com/uploads1/allimg/120312/1_120312100435_8.jpg",
    "click":"xx://xx"
  },
  {
    "id":4,
    "tro":1,
    "tbo":3,
    "ml":0,
    "mr":0,
    "mt":0,
    "mb":0,
    "pl":0,
    "pt":0,
    "pr":0,
    "pb":0,
    "w":0.17,
    "h":2,
    "bgColor":"#ff0000",
    "srcUrl":"http://pic3.bbzhi.com/fengjingbizhi/gaoqingkuanpingfengguangsheyingps/show_fengjingta_281299_11.jpg",
    "click":"xx://xx"
  },
  {
    "id":5,
    "tro":4,
    "tbo":3,
    "ml":0,
    "mr":0,
    "mt":0,
    "mb":0,
    "pl":0,
    "pt":0,
    "pr":0,
    "pb":0,
    "w":0.18,
    "h":2,
    "bgColor":"#00ff00",
    "srcUrl":"http://www.bz55.com/uploads1/allimg/120312/1_120312100435_8.jpg",
    "click":"xx://xx"
  }
]
对应效果图如下:



关键代码如下:(需要使用imageloader加载图片和fastjson解析json)

package view.mogu.com.simplehtml;

import android.annotation.SuppressLint;
import android.content.Context;
import android.graphics.Color;
import android.support.annotation.NonNull;
import android.text.TextUtils;
import android.util.AttributeSet;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.Toast;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.nostra13.universalimageloader.core.ImageLoader;

import java.lang.reflect.Field;
import java.math.BigDecimal;
import java.util.List;

/**
 * Created by wanjian on 2016/10/8.
 */

public class JsonView extends ViewGroup {
    public JsonView(Context context) {
        super(context);
    }

    public JsonView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public JsonView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    @SuppressLint("NewApi")
    public JsonView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
        super(context, attrs, defStyleAttr, defStyleRes);
    }

    @Override
    protected void onLayout(boolean changed, int l, int t, int r, int b) {
        for (int i = 0; i < getChildCount(); i++) {
            View view = getChildAt(i);
            if (view.getVisibility() == GONE) {
                continue;
            }

            int left = 0;
            int top = 0;
            LayoutParams param = ((LayoutParams) view.getLayoutParams());
            View leftView = findBrotherById(param.getToTheRightOf());
            if (leftView != null) {
                left = leftView.getRight() + ((LayoutParams) leftView.getLayoutParams()).rightMargin + param.leftMargin;
            }else{
                left=getPaddingLeft()+ param.leftMargin;
            }

            View topView = findBrotherById(param.getToTheBottomOf());
            if (topView != null) {
                top = topView.getBottom() + ((LayoutParams) topView.getLayoutParams()).bottomMargin + param.topMargin;
            }else{
                top=getPaddingTop()+param.topMargin;
            }
            view.layout(left, top, left+param.width, top+param.height);

        }
    }

    private View findBrotherById(int id) {
        if (id == 0) {
            return null;
        }
        for (int i = 0; i < getChildCount(); i++) {
            View view = getChildAt(i);
            if (view.getId() == id && id != 0) {
                return view;
            }
        }
        return null;
    }

    private ViewGroup.LayoutParams param;
    public void inflat(String simpleHtml, int width, ViewGroup.LayoutParams param) {
//        parent.generateLayoutParams(new )
        this.param=param;
        List<Object> viewgroup = JSON.parseArray(simpleHtml);
        innerInflat(viewgroup, width);
    }

    protected void innerInflat(List<Object> viewgroup, int width) {
        if (viewgroup == null || viewgroup.size() == 0) {
            return;
        }

        Object obj = viewgroup.get(0);
        if (obj instanceof JSONObject) {
            final SimpleView simpleView = parseJsonObject((JSONObject) obj);
            setPadding(simpleView.pl, simpleView.pt, simpleView.pr, simpleView.pb);
            if (param!=null){
                param.width= (int) (width*simpleView.w);
                param.height= (int) (param.width*simpleView.h);
                setLayoutParams(param);
            }
            initView(simpleView, JsonView.this);
        } else {
            return;
        }

        for (int i = 1; i < viewgroup.size(); i++) {
            Object o = viewgroup.get(i);
            if (o instanceof List) {
                List<Object> views = (List<Object>) o;
                if (views.size() > 0) {
                    Object child = views.get(0);
                    if (child instanceof JSONObject) {
                        SimpleView simpleView = parseJsonObject((JSONObject) child);
                        JsonView view = createViewGroup(simpleView, width);
                        addView(view);
                        view.innerInflat(views, (int) (width * simpleView.w));
                    }
                }
            } else if (o instanceof JSONObject) {
                View view = createChildView(parseJsonObject((JSONObject) o), width);

                addView(view);
            }
        }
    }

    private SimpleView parseJsonObject(JSONObject jsobj) {
        SimpleView simpleView=new SimpleView();
        Field []fs=SimpleView.class.getDeclaredFields();
        for (Field f : fs) {
            String name=f.getName();
            Object obj=jsobj.get(name);
            try {
                f.setAccessible(true);
                if (obj instanceof BigDecimal){
                    f.set(simpleView,((BigDecimal) obj).doubleValue());
                }else{
                    f.set(simpleView, obj);
                }
                f.setAccessible(false);
            } catch (Exception e) {

            }
        }


        return simpleView;
    }

    private View createChildView(SimpleView simpleView, int width) {
        View view = createView(simpleView);
        LayoutParams param = createLayoutParam(simpleView, width);
        view.setLayoutParams(param);
        view.setId(simpleView.id);
        view.setPadding(simpleView.pl, simpleView.pt, simpleView.pr, simpleView.pb);
        initView(simpleView, view);
        return view;

    }

    private void initView(final SimpleView simpleView, View view) {
        try {
            int color = Color.parseColor(simpleView.bgColor);
            view.setBackgroundColor(color);

        } catch (Exception e) {
        }
        if (!TextUtils.isEmpty(simpleView.click)) {
            view.setOnClickListener(new OnClickListener() {
                @Override
                public void onClick(View v) {
                    Toast.makeText(getContext(), "click: "+simpleView.click, Toast.LENGTH_SHORT).show();
                }
            });
        }
    }

    protected View createView(SimpleView simpleView) {
        ImageView iv = new ImageView(getContext());
        try {
            iv.setBackgroundColor(Color.parseColor(simpleView.bgColor));
        } catch (Exception e) {
        }
        iv.setScaleType(ImageView.ScaleType.CENTER_CROP);
        ImageLoader.getInstance().displayImage(simpleView.srcUrl,iv);
        return iv;
    }

    private JsonView createViewGroup(SimpleView simpleView, int width) {
        JsonView jsonView = new JsonView(getContext());
        LayoutParams param = createLayoutParam(simpleView, width);
        jsonView.setLayoutParams(param);
        jsonView.setId(simpleView.id);
        return jsonView;
    }

    @NonNull
    private LayoutParams createLayoutParam(SimpleView simpleView, int width) {
        LayoutParams param = new LayoutParams( (int)(width * simpleView.w), (int)(width * simpleView.w * simpleView.h));
        param.setMargins(simpleView.ml, simpleView.mt, simpleView.mr, simpleView.mb);
        param.setToTheRightOf(simpleView.tro);
        param.setToTheBottomOf(simpleView.tbo);
        return param;
    }

    class LayoutParams extends MarginLayoutParams {

        public LayoutParams(Context c, AttributeSet attrs) {
            super(c, attrs);
        }

        public LayoutParams(int width, int height) {
            super(width, height);
        }

        public LayoutParams(MarginLayoutParams source) {
            super(source);
        }

        public LayoutParams(ViewGroup.LayoutParams source) {
            super(source);
        }

        int toTheRightOf;
        int toTheBottomOf;

        public void setToTheRightOf(int toTheRightOf) {
            this.toTheRightOf = toTheRightOf;
        }

        public void setToTheBottomOf(int toTheBottomOf) {
            this.toTheBottomOf = toTheBottomOf;
        }

        public int getToTheRightOf() {
            return toTheRightOf;
        }

        public int getToTheBottomOf() {
            return toTheBottomOf;
        }
    }

}


package view.mogu.com.simplehtml;

/**
 * Created by wanjian on 2016/10/8.
 */

public class SimpleView {
    public int  ml;
    public int  mr;
    public int  mt;
    public int  mb;
    public int  pl;
    public int  pt;
    public int  pr;
    public int  pb;
    public double  w;
    public double  h;
    public int  id;
    public String  bgColor;
    public String srcUrl;
    public String  click;
    public int tro;
    public int tbo;
}

使用姿势:(json文件放在assets文件夹中)

package view.mogu.com.simplehtml;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.FrameLayout;

import com.nostra13.universalimageloader.core.ImageLoader;
import com.nostra13.universalimageloader.core.ImageLoaderConfiguration;

import java.io.IOException;
import java.io.InputStream;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        ImageLoaderConfiguration configuration = ImageLoaderConfiguration.createDefault(this);
        ImageLoader.getInstance().init(configuration);

        JsonView htmlView=new JsonView(MainActivity.this);

        try {
            InputStream inputStream=getAssets().open("layout3.json");
            byte[]b=new byte[inputStream.available()];
            inputStream.read(b);
            htmlView.inflat(new String(b),getResources().getDisplayMetrics().widthPixels,new FrameLayout.LayoutParams(0,0));
        } catch (IOException e) {
            e.printStackTrace();
        }
        setContentView(htmlView);
    }
}



附 几个json对应的布局
[
  {
    "ml":0,
    "mr":0,
    "mt":5,
    "mb":5,
    "pl":0,
    "pt":0,
    "pr":0,
    "pb":0,
    "w":1,
    "h":1.5,
    "bgColor":"#e1e1e1",
    "bg":"http://...png....1",
    "click":"xx://xx"
  },

  {
    "id":1,
    "ml":0,
    "mr":0,
    "mt":10,
    "mb":0,
    "pl":0,
    "pt":0,
    "pr":0,
    "pb":0,
    "w":0.5,
    "h":1,
    "bgColor":"#00ff00",
    "srcUrl":"http://img2.3lian.com/2014/c7/12/d/77.jpg",
    "click":"xx://xx"

  },
  {
    "id":2,
    "tro":1,
    "ml":5,
    "mr":0,
    "mt":10,
    "mb":0,
    "pl":0,
    "pt":0,
    "pr":0,
    "pb":0,
    "w":0.25,
    "h":1,
    "bgColor":"#0000ff",
    "srcUrl":"http://pic3.bbzhi.com/fengjingbizhi/gaoqingkuanpingfengguangsheyingps/show_fengjingta_281299_11.jpg",
    "click":"xx://xx"
  },
  {
    "id":3,
    "tro":2,
    "ml":5,
    "mr":0,
    "mt":10,
    "mb":10,
    "pl":0,
    "pt":0,
    "pr":0,
    "pb":0,
    "w":0.25,
    "h":1,
    "bgColor":"#ffff00",
    "srcUrl":"http://www.bz55.com/uploads1/allimg/120312/1_120312100435_8.jpg",
    "click":"xx://xx"

  },
  [
    {
      "ml":0,
      "mr":0,
      "mt":0,
      "mb":0,
      "pl":0,
      "pt":0,
      "pr":0,
      "pb":0,
      "w":0.5,
      "h":0.5,
      "tro":1,
      "tbo":2,
      "bgColor":"#00ffff",
      "srcUrl":"http://img3.iqilu.com/data/attachment/forum/201308/21/192654ai88zf6zaa60zddo.jpg",
      "click":"xx://xx"
    },

    {
      "id":1,
      "ml":0,
      "mr":0,
      "mt":0,
      "mb":0,
      "pl":0,
      "pt":0,
      "pr":0,
      "pb":0,
      "w":0.5,
      "h":1,
      "bgColor":"#ffffff",
      "srcUrl":"http://img2.3lian.com/2014/c7/12/d/77.jpg",
      "click":"xx://xx"

    },
    {
      "id":2,
      "tro":1,
      "ml":0,
      "mr":0,
      "mt":0,
      "mb":0,
      "pl":0,
      "pt":0,
      "pr":0,
      "pb":0,
      "w":0.25,
      "h":1,
      "bgColor":"#000000",
      "srcUrl":"http://h.hiphotos.baidu.com/image/h%3D200/sign=fc55a740f303918fc8d13aca613c264b/9213b07eca80653893a554b393dda144ac3482c7.jpg",
      "click":"xx://xx"
    },
    {
      "id":3,
      "tro":2,
      "ml":0,
      "mr":0,
      "mt":0,
      "mb":0,
      "pl":0,
      "pt":0,
      "pr":0,
      "pb":0,
      "w":0.25,
      "h":1,
      "bgColor":"#e1e1e1",
      "srcUrl":"http://pic3.bbzhi.com/fengjingbizhi/gaoqingkuanpingfengguangsheyingps/show_fengjingta_281299_11.jpg",
      "click":"xx://xx"

    }

  ]

]



[
  {
    "ml":0,
    "mr":0,
    "mt":0,
    "mb":0,
    "pl":0,
    "pt":0,
    "pr":0,
    "pb":0,
    "w":0.99,
    "h":1,
    "bgColor":"#e1e1e1",
    "bg":"http://...png....1",
    "click":"xx://xx"
  },

  {
    "id":1,
    "ml":0,
    "mr":0,
    "mt":0,
    "mb":0,
    "pl":0,
    "pt":0,
    "pr":0,
    "pb":0,
    "w":0.66,
    "h":1,
    "bgColor":"#00ff00",
    "srcUrl":"http://img2.3lian.com/2014/c7/12/d/77.jpg",
    "click":"xx://xx"

  },
  {
    "id":2,
    "tro":1,
    "ml":0,
    "mr":0,
    "mt":0,
    "mb":0,
    "pl":0,
    "pt":0,
    "pr":0,
    "pb":0,
    "w":0.33,
    "h":1,
    "bgColor":"#0000ff",
    "srcUrl":"http://pic3.bbzhi.com/fengjingbizhi/gaoqingkuanpingfengguangsheyingps/show_fengjingta_281299_11.jpg",
    "click":"xx://xx"
  },
  {
    "id":3,
    "tro":1,
    "tbo":2,
    "ml":0,
    "mr":0,
    "mt":0,
    "mb":0,
    "pl":0,
    "pt":0,
    "pr":0,
    "pb":0,
    "w":0.33,
    "h":1,
    "bgColor":"#ffff00",
    "srcUrl":"http://www.bz55.com/uploads1/allimg/120312/1_120312100435_8.jpg",
    "click":"xx://xx"
  },
  {
    "id":4,
    "tro":0,
    "tbo":1,
    "ml":0,
    "mr":0,
    "mt":0,
    "mb":0,
    "pl":0,
    "pt":0,
    "pr":0,
    "pb":0,
    "w":0.33,
    "h":1,
    "bgColor":"#ff0000",
    "srcUrl":"http://www.bz55.com/uploads1/allimg/120312/1_120312100435_8.jpg",
    "click":"xx://xx"
  },
  {
    "id":5,
    "tro":4,
    "tbo":1,
    "ml":0,
    "mr":0,
    "mt":0,
    "mb":0,
    "pl":0,
    "pt":0,
    "pr":0,
    "pb":0,
    "w":0.33,
    "h":1,
    "bgColor":"#00ff00",
    "srcUrl":"http://pic3.bbzhi.com/fengjingbizhi/gaoqingkuanpingfengguangsheyingps/show_fengjingta_281299_11.jpg",
    "click":"xx://xx"
  },
  {
    "id":6,
    "tro":5,
    "tbo":1,
    "ml":0,
    "mr":0,
    "mt":0,
    "mb":0,
    "pl":0,
    "pt":0,
    "pr":0,
    "pb":0,
    "w":0.33,
    "h":1,
    "bgColor":"#00ffff",
    "srcUrl":"http://img2.3lian.com/2014/c7/12/d/77.jpg",
    "click":"xx://xx"
  }


]



[
  {
    "ml":0,
    "mr":0,
    "mt":0,
    "mb":0,
    "pl":0,
    "pt":0,
    "pr":0,
    "pb":0,
    "w":0.99,
    "h":1,
    "bgColor":"#e1e1e1",
    "bg":"http://...png....1",
    "click":"xx://xx"
  },

  {
    "id":1,
    "ml":0,
    "mr":0,
    "mt":0,
    "mb":0,
    "pl":0,
    "pt":0,
    "pr":0,
    "pb":0,
    "w":0.33,
    "h":1,
    "bgColor":"#00ff00",
    "srcUrl":"http://img2.3lian.com/2014/c7/12/d/77.jpg",
    "click":"xx://xx"

  },
  {
    "id":2,
    "tro":0,
    "tbo":1,
    "ml":0,
    "mr":0,
    "mt":0,
    "mb":0,
    "pl":0,
    "pt":0,
    "pr":0,
    "pb":0,
    "w":0.33,
    "h":1,
    "bgColor":"#0000ff",
    "srcUrl":"http://pic3.bbzhi.com/fengjingbizhi/gaoqingkuanpingfengguangsheyingps/show_fengjingta_281299_11.jpg",
    "click":"xx://xx"
  },
  {
    "id":3,
    "tro":0,
    "tbo":2,
    "ml":0,
    "mr":0,
    "mt":0,
    "mb":0,
    "pl":0,
    "pt":0,
    "pr":0,
    "pb":0,
    "w":0.33,
    "h":1,
    "bgColor":"#ffff00",
    "srcUrl":"http://www.bz55.com/uploads1/allimg/120312/1_120312100435_8.jpg",
    "click":"xx://xx"
  },
  {
    "id":4,
    "tro":1,
    "tbo":0,
    "ml":0,
    "mr":0,
    "mt":0,
    "mb":0,
    "pl":0,
    "pt":0,
    "pr":0,
    "pb":0,
    "w":0.66,
    "h":1,
    "bgColor":"#ff0000",
    "srcUrl":"http://www.bz55.com/uploads1/allimg/120312/1_120312100435_8.jpg",
    "click":"xx://xx"
  },
  {
    "id":5,
    "tro":3,
    "tbo":4,
    "ml":0,
    "mr":0,
    "mt":0,
    "mb":0,
    "pl":0,
    "pt":0,
    "pr":0,
    "pb":0,
    "w":0.33,
    "h":1,
    "bgColor":"#00ff00",
    "srcUrl":"http://pic3.bbzhi.com/fengjingbizhi/gaoqingkuanpingfengguangsheyingps/show_fengjingta_281299_11.jpg",
    "click":"xx://xx"
  },
  {
    "id":6,
    "tro":5,
    "tbo":4,
    "ml":0,
    "mr":0,
    "mt":0,
    "mb":0,
    "pl":0,
    "pt":0,
    "pr":0,
    "pb":0,
    "w":0.33,
    "h":1,
    "bgColor":"#00ffff",
    "srcUrl":"http://img2.3lian.com/2014/c7/12/d/77.jpg",
    "click":"xx://xx"
  }


]


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值