JsonView beta1

来源:互联网 发布:江铠同翟天临分手知乎 编辑:程序博客网 时间:2024/03/29 19:32

根据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"  }]


0 0
原创粉丝点击