15.瀑布流、测量

排行界面

TopProtocol :json数据就是写字符串,所以不需要写bean对象
  1. public class TopProtocol extends BaseProtocol<List<String>> {
  2. @Override
  3. public List<String> paserJson(String json) {
  4. List<String> datas=new ArrayList<String>();
  5. try {
  6. JSONArray array=new JSONArray(json);
  7. for(int i=0;i<array.length();i++){
  8. String str=array.getString(i);
  9. datas.add(str);
  10. }
  11. return datas;
  12. } catch (JSONException e) {
  13. e.printStackTrace();
  14. return null;
  15. }
  16. }
  17. @Override
  18. public String getKey() {
  19. return "hot";
  20. }
  21. }
DrawableUtils :用代码创建状态选择器 和圆角
  1. public class DrawableUtils {
  2. public static GradientDrawable createShape(int color){
  3. GradientDrawable drawable=new GradientDrawable();//相当于shape
  4. drawable.setCornerRadius(UiUtils.dip2px(5));//设置4个角的弧度
  5. drawable.setColor(color);// 设置颜色
  6. return drawable;
  7. }
  8. public static StateListDrawable createSelectorDrawable(Drawable pressedDrawable,Drawable normalDrawable){
  9. // <selector xmlns:android="http://schemas.android.com/apk/res/android" android:enterFadeDuration="200">
  10. // <item android:state_pressed="true" android:drawable="@drawable/detail_btn_pressed"></item>
  11. // <item android:drawable="@drawable/detail_btn_normal"></item>
  12. // </selector>
  13. StateListDrawable stateListDrawable=new StateListDrawable();
  14. stateListDrawable.addState(new int[]{android.R.attr.state_pressed}, pressedDrawable);// 按下显示的图片
  15. stateListDrawable.addState(new int[]{}, normalDrawable);// 抬起显示的图片
  16. return stateListDrawable;
  17. }
  18. }
TopFragment :使用代码创建、随机色
MATCH_PARENT 、FILL_PARENT是-1且他俩个没有任何区别,WRAP_CONTENT是-2 
  1. public class TopFragment extends BaseFragment {
  2. private List<String> datas;
  3. @Override
  4. public View createSuccessView() {
  5. ScrollView scrollView=new ScrollView(UiUtils.getContext());
  6. scrollView.setBackgroundResource(R.drawable.grid_item_bg_normal);
  7. LinearLayout layout=new LinearLayout(UiUtils.getContext());
  8. int padding=UiUtils.dip2px(13);
  9. layout.setPadding(padding, padding, padding, padding);
  10. layout.setOrientation(LinearLayout.VERTICAL);// 设置线性布局的方向
  11. int backColor = 0xffcecece;
  12. Drawable pressedDrawable=DrawableUtils.createShape(backColor);// 按下显示的图片
  13. for(int i=0;i<datas.size();i++){
  14. TextView textView=new TextView(UiUtils.getContext());
  15. final String str=datas.get(i);
  16. textView.setText(str);
  17. Random random=new Random(); //创建随机
  18. int red = random.nextInt(200)+22;
  19. int green = random.nextInt(200)+22;
  20. int blue = random.nextInt(200)+22;//有可能都是0或255成白色或者黑色了
  21. int color=Color.rgb(red, green, blue);//范围 0-255
  22. GradientDrawable createShape = DrawableUtils.createShape(color); // 默认显示的图片
  23. StateListDrawable createSelectorDrawable = DrawableUtils.createSelectorDrawable(pressedDrawable, createShape);// 创建状态选择器
  24. textView.setBackgroundDrawable(createSelectorDrawable);
  25. textView.setTextColor(Color.WHITE);
  26. //textView.setTextSize(UiUtils.dip2px(14));
  27. int textPaddingV = UiUtils.dip2px(4);
  28. int textPaddingH = UiUtils.dip2px(7);
  29. textView.setPadding(textPaddingH, textPaddingV, textPaddingH, textPaddingV); //设置padding
  30. textView.setClickable(true);//设置textView可以被点击
  31. textView.setOnClickListener(new OnClickListener() { // 设置点击事件
  32. @Override
  33. public void onClick(View v) {
  34. Toast.makeText(UiUtils.getContext(), str, 0).show();
  35. }
  36. });
  37. layout.addView(textView,new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT, -2));// -2 包裹内容
  38. }
  39. scrollView.addView(layout);
  40. return scrollView;
  41. }
  42. @Override
  43. protected LoadResult load() {
  44. TopProtocol protocol=new TopProtocol();
  45. datas = protocol.load(0);
  46. return checkData(datas);
  47. }
  48. }
到目前为止实现的效果是这样的,将LinearLayout使用一个自定义控件


Flowlayout 
原理

827512-20151120194307608-686612542.png
827512-20151120194308327-246111244.png
  1. public class Flowlayout extends ViewGroup {
  2. private int horizontolSpacing=UiUtils.dip2px(13);
  3. private int verticalSpacing=UiUtils.dip2px(13);
  4. public Flowlayout(Context context) {
  5. super(context);
  6. }
  7. public Flowlayout(Context context, AttributeSet attrs, int defStyle) {
  8. super(context, attrs, defStyle);
  9. }
  10. private Line currentline;// 当前的行
  11. private int useWidth=0;// 当前行使用的宽度
  12. private List<Line> mLines=new ArrayList<Flowlayout.Line>();
  13. private int width;
  14. public Flowlayout(Context context, AttributeSet attrs) {
  15. super(context, attrs);
  16. }
  17. // 测量 当前控件Flowlayout
  18. // 父类是有义务测量每个孩子的
  19. @Override
  20. protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
  21. // TODO Auto-generated method stub
  22. // MeasureSpec.EXACTLY;
  23. // MeasureSpec.AT_MOST;
  24. // MeasureSpec.UNSPECIFIED;
  25. mLines.clear();
  26. currentline=null;
  27. useWidth=0;
  28. int widthMode = MeasureSpec.getMode(widthMeasureSpec);
  29. int heightMode = MeasureSpec.getMode(heightMeasureSpec); // 获取当前父容器(Flowlayout)的模式
  30. width = MeasureSpec.getSize(widthMeasureSpec)-getPaddingLeft()-getPaddingRight();
  31. int height = MeasureSpec.getSize(heightMeasureSpec)-getPaddingBottom()-getPaddingTop(); // 获取到宽和高
  32. int childeWidthMode;
  33. int childeHeightMode;
  34. // 为了测量每个孩子 需要指定每个孩子测量规则
  35. childeWidthMode=(widthMode==MeasureSpec.EXACTLY)?MeasureSpec.AT_MOST:widthMode;
  36. childeHeightMode=heightMode==MeasureSpec.EXACTLY?MeasureSpec.AT_MOST:heightMode;
  37. int childWidthMeasureSpec=MeasureSpec.makeMeasureSpec(childeWidthMode, width);
  38. int childHeightMeasureSpec=MeasureSpec.makeMeasureSpec(childeHeightMode, height);
  39. currentline=new Line();// 创建了第一行
  40. for(int i=0;i<getChildCount();i++) {
  41. View child=getChildAt(i);
  42. System.out.println("孩子的数量:"+getChildCount());
  43. // 测量每个孩子
  44. child.measure(childWidthMeasureSpec, childHeightMeasureSpec);
  45. int measuredWidth = child.getMeasuredWidth();
  46. useWidth+=measuredWidth;// 让当前行加上使用的长度
  47. if(useWidth<=width){
  48. currentline.addChild(child);//这时候证明当前的孩子是可以放进当前的行里,放进去
  49. useWidth+=horizontolSpacing;
  50. if(useWidth>width){
  51. //换行
  52. newLine();
  53. }
  54. }else{
  55. //换行
  56. if(currentline.getChildCount()<1){
  57. currentline.addChild(child); // 保证当前行里面最少有一个孩子
  58. }
  59. newLine();
  60. }
  61. }
  62. if(!mLines.contains(currentline)){
  63. mLines.add(currentline);// 添加最后一行
  64. }
  65. int totalheight=0;
  66. for(Line line:mLines){
  67. totalheight+=line.getHeight();
  68. }
  69. totalheight+=verticalSpacing*(mLines.size()-1)+getPaddingTop()+getPaddingBottom();
  70. System.out.println(totalheight);
  71. setMeasuredDimension(width+getPaddingLeft()+getPaddingRight(),resolveSize(totalheight, heightMeasureSpec));
  72. }
  73. private void newLine() {
  74. mLines.add(currentline);// 记录之前的行
  75. currentline=new Line(); // 创建新的一行
  76. useWidth=0;
  77. }
  78. private class Line{
  79. int height=0; //当前行的高度
  80. int lineWidth=0;
  81. private List<View> children=new ArrayList<View>();
  82. /**
  83. * 添加一个孩子
  84. * @param child
  85. */
  86. public void addChild(View child) {
  87. children.add(child);
  88. if(child.getMeasuredHeight()>height){
  89. height=child.getMeasuredHeight();
  90. }
  91. lineWidth+=child.getMeasuredWidth();
  92. }
  93. public int getHeight() {
  94. return height;
  95. }
  96. /**
  97. * 返回孩子的数量
  98. * @return
  99. */
  100. public int getChildCount() {
  101. return children.size();
  102. }
  103. public void layout(int l, int t) {
  104. lineWidth+=horizontolSpacing*(children.size()-1);
  105. int surplusChild=0;
  106. int surplus=width-lineWidth;
  107. if(surplus>0){
  108. surplusChild=surplus/children.size();
  109. }
  110. for(int i=0;i<children.size();i++){
  111. View child=children.get(i);
  112. // getMeasuredWidth() 控件实际的大小
  113. // getWidth() 控件显示的大小
  114. child.layout(l, t, l+child.getMeasuredWidth()+surplusChild, t+child.getMeasuredHeight());
  115. l+=child.getMeasuredWidth()+surplusChild;
  116. l+=horizontolSpacing;
  117. }
  118. }
  119. }
  120. // 分配每个孩子的位置
  121. @Override
  122. protected void onLayout(boolean changed, int l, int t, int r, int b) {
  123. l+=getPaddingLeft();
  124. t+=getPaddingTop();
  125. for(int i=0;i<mLines.size();i++){
  126. Line line=mLines.get(i);
  127. line.layout(l,t); //交给每一行去分配
  128. t+=line.getHeight()+verticalSpacing;
  129. }
  130. }
  131. }
如果不要平均分配那些步骤,实现的效果是这样的
827512-20151120194312874-1799108277.png



自定义一个圆形的进度条
  1. public class ProgressView extends View {
  2. public ProgressView(Context context) {
  3. super(context);
  4. }
  5. public ProgressView(Context context, AttributeSet attrs, int defStyle) {
  6. super(context, attrs, defStyle);
  7. }
  8. public ProgressView(Context context, AttributeSet attrs) {
  9. super(context, attrs);
  10. }
  11. // 绘制控件
  12. @Override
  13. protected void onDraw(Canvas canvas) {
  14. super.onDraw(canvas);
  15. //canvas.drawBitmap(bitmap, left, top, paint);
  16. /*oval 圆的模型 矩形
  17. * startAngle 开始的角度
  18. * sweepAngle 范围的角度
  19. * useCenter 是否填充中间部分
  20. * paint 画笔
  21. */
  22. //canvas.drawArc(oval, startAngle, sweepAngle, useCenter, paint);
  23. }
  24. }



来自为知笔记(Wiz)


转载于:https://www.cnblogs.com/sixrain/p/4982185.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/256390.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linear-gradient线性渐变

background:linear-gradient(180deg, sliver 20%, skyblue 80%, gray 100%);180deg 是线性渐变的角度,水平方向;如果是90deg,则是垂直方向. silver 20% 是最上面的颜色和该颜色所在的位置,可以为负值,,如 linear-gradient(180deg, silver -7%, pink 80%, skyblue 127%);的效果是…

C# —— 简单工厂设计模式详述

一、基本概念 众所周知&#xff0c;C#是一种面向对象的语言&#xff0c;而其中封装&#xff0c;继承&#xff0c;多态是面向对象的三大重要特征&#xff0c;简单工厂的设计模式则可以完全体现这些特征。要彻底理解这个模式&#xff0c;必须要先将封装&#xff08;访问修饰符的…

工业相机常用类型详述

一、工业相机定义 工业相机是应用于工业领域、安防和交通等对相机要求较高领域的摄像机&#xff0c;功能就是将光信号转变成有序的电信号&#xff0c;此信号经过模数转换为数字信号&#xff0c;然后传递给图像处理器。与一般的家用相机相比&#xff0c;其具有更高的稳定性能&a…

机器学习——SVM之python实现数据样本标准化和归一化

目录 一、标准化和归一化的目的 1、标准化 2、归一化 二、标准化和归一化常用的理论公式 1、归一化 2、标准化 三、python实现SVM样本数据标准化和归一化 1、标准化 2、归一化 本文源代码&#xff1a;《机器学习——支持向量机SVM之python实现简单实例一》 一、标准化…

[黑群晖经典教程] 一步一步建立自己的黑群晖

【申明&#xff1a;本文并非本人所作&#xff0c;为内部网络中一位大神所写&#xff0c;个人觉得写得很好&#xff0c;遂原文搬了过来&#xff0c;如有侵犯原作者的权利&#xff0c;请及时与我联系】 PS:有好几个兄弟觉得我擅自转发&#xff0c;不是很妥。解释一下&#xff1a;…

C++和Opencv4.5 实现全景图像拼接

前言 最近刚下了最新版的opencv4.5&#xff0c;急不可待的试下操作&#xff0c;就用了opencv自带的Stitcher类拼接下图像&#xff0c;结果傻眼了&#xff0c;程序显示Stitcher没有createDefault成员&#xff0c;看了好久&#xff0c;终于找到了解决方法。 Stitcher原理 Stit…

机器学习——python实现SVM模型w,b的查看

基于源代码&#xff1a;《机器学习——支持向量机SVM之python实现简单实例一》进行讲解 1、线性模型 这里以二特征三类&#xff0c;一对多策略为案例 kernel “linear”&#xff1a;线性核&#xff0c;参数有w&#xff0c;b 线性模型的决策边界是&#xff1a;w0iTx0i w1i…

移动端输入框弹出键盘控制

在移动端&#xff0c;我们公司通过输入框主要收集用户的姓名和电话&#xff0c;以下是对输入框获取焦点时&#xff0c;控制弹出键盘的样式来增强用户体验。 输入姓名 我们的用户都是中国人&#xff0c;输入用户名为中文&#xff0c;所以弹出键盘是输入中文状态即可&#xff0c;…

相机标定(一) —— 深入理解齐次坐标及其作用

一、什么是齐次坐标和齐次坐标系 齐次坐标 齐次坐标是一个相机标定问题的关键理论之一&#xff0c;所以就此问题分析一下。 单从定义上来讲&#xff0c;齐次坐标&#xff08;投影坐标&#xff09;就是用N1维来代表N维坐标&#xff08;点和向量&#xff09;&#xff0c;也可说…

机器学习——图解SVM中gamma和c参数的作用

参数c和gamma的作用 我们通过下图详解参数c的作用&#xff0c;首先我们以一个简单的线性分类器为例&#xff0c;上一个博客中我们知道影响分类器的主要因素是支持向量&#xff0c;即虚线上的样本&#xff0c;如下图可知&#xff1a; 但当正负样本的分布在如下情况时&#xff0…

面试题(十四)

唐巧前辈说这些都是 iOS 的基础问题&#xff0c;应该对此深入的了解。当初看到时&#xff0c;大部分回答不上来&#xff0c;因为平时没有好好思考整理过。这里大部分的概念大多会在学习 OC 的过程中遇到过&#xff0c;但还是得经过写代码才能有更深的理解。反正我当初看那些设计…

工业相机基础知识详述 —— 焦平面,像平面,弥散圆,光圈,分辨率,景深,接口,靶面尺寸

一、焦平面 想到焦平面&#xff0c;很多人不由自主就想到不就是焦点所在的垂直于光轴的平面吗&#xff1f;其实其背后隐藏这更多的东西。 1&#xff09;焦点不止一个 对于一般拍摄场景来说&#xff0c;光通过一个凸透镜&#xff0c;汇聚不到一个点&#xff0c;越靠近中轴线的…

相机标定(二)深入理解四大坐标系与其变换关系

一、前言 视觉系统一共有四个坐标系&#xff1a;像素平面坐标系&#xff08;u,v&#xff09;、图像坐标系&#xff08;x,y&#xff09;、相机坐标系&#xff08;Xc,Yc,Zc&#xff09;和世界坐标系&#xff08;Xw,Yw,Zw&#xff09;&#xff0c;如下图所示。每种坐标系之间均存…

相机标定(三) —— 畸变校正

一、前言 根据针孔模型&#xff0c;物体和成像之间参数会满足相似三角形的关系。但现实中会存在装配误差和透视失真等原因&#xff0c;导致这种关系无法成立&#xff0c;使理想成像与实际成像存在误差&#xff0c;这种误差即称为畸变。 畸变分为径向畸变&#xff0c;切向畸变和…

SVG技术入门:线条动画实现原理

相信大家都见到过这样神奇的技术&#xff1a;一副线条构成的画能自动画出自己。非常的酷。Jake Archibald是这种SVG技术的首创者&#xff0c;并且写了一篇非常好的文章来描述它是如何实现的。Brian Suda也在24 Ways网站上讨论过它。 Polygon使用它在一篇设计方面的文章里创造出…

机器学习——人工神经网络之BP算法编程(python二分类数据集:马疝病数据集)

目录 一、理论知识回顾 1、神经网络模型 2、明确任务以及参数 1&#xff09;待估参数&#xff1a; 2&#xff09;超参数&#xff1a; 3&#xff09;任务 3、神经网络数学模型定义 1&#xff09;激活函数 ​ 2&#xff09;各层权重、阈值定义 3&#xff09;各层输入输…

Halcon例程(基于多个标定图的单目相机标定)详解—— Camera_calibration_multi_image.hdev

一、前言 在我的工业相机专栏里已经将相机标定涉及到的理论部分讲解完毕&#xff0c;为什么要标定以及标定要求出什么参数呢&#xff0c;用一个Halcon 例程来帮助理解。 这个例程是比较经典的标定程序&#xff0c;基本将标定过程讲的比较清楚&#xff0c;用的标定图像是系统自…

SkipList 跳表

为什么选择跳表 目前经常使用的平衡数据结构有&#xff1a;B树&#xff0c;红黑树&#xff0c;AVL树&#xff0c;Splay Tree, Treep等。 想象一下&#xff0c;给你一张草稿纸&#xff0c;一只笔&#xff0c;一个编辑器&#xff0c;你能立即实现一颗红黑树&#xff0c;或者AVL树…

机器学习——深度学习之卷积神经网络(CNN)——LeNet卷积神经网络结构

目录 一、卷积神经网络 1、卷积神经的作用 2、LeNet 1&#xff09;数据库准备——minst 2&#xff09;模型 二、关于卷积神经网络结构的一些术语定义 1、特征图&#xff08;Feature map&#xff09; 2、height&#xff08;长度&#xff09;、width&#xff08;宽度&…

工业相机(3D)主要参数详述

一、前言 准确的完成相机选型是一个视觉工程师必备的技能&#xff0c;而选型前必须对其内部参数了如指掌。工业相机是一种比较复杂的产品&#xff0c;其参数很多&#xff0c;每个参数可能会有不同的标准&#xff0c;下面对主要的参数会做比较详细的阐述。 二、参数详述 2.1 …