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); }}
[ { "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
- JsonView beta1
- JsonView
- jsonView
- jsonview插件
- jsonview json查看工具
- Spring3.0+JsonView/Jackson
- 火狐浏览器插件jsonView
- @JsonView 简单介绍
- 火狐JSONView 安装
- chrome jsonView插件安装
- chrome jsonView插件安装
- chrome jsonView插件安装
- @JsonView 简单介绍
- [Jackson] @JsonView的使用
- @JsonView 简单介绍
- chrome jsonView插件安装
- chrome jsonView插件安装
- @JsonView 简单介绍
- 小娜老师的讲义-Docker基础知识-网络基础配置
- 【每天进步一点点】jquery 自动补全autocomplete
- MyEclipse中使用Maven创建web项目
- MFC通过URL下载并保存文件代码
- android中?attr/**与@drawable/**或@color/**等的区别
- JsonView beta1
- Android逆向工程之反编译注入代码
- Java NIO学习笔记之二-图解ByteBuffer
- 项目中有多个resource文件夹时,load问题
- Tomcat的server.xml配置文件解析
- 几个字符串函数的实现
- String类型内存转换,你明白为什么吗?
- android studio找不到subversion
- CAT 配置文件加载说明