屏幕适配的那些坑,零基础编写android项目之布局

作者:江苏福彩快三计算机网络

一个6年的菜鸟,在4年之前做的一些功能(二),一个64年

*前戏:**针对上一篇列出来的功能点,今天和大家分享下这个自定义的公式是怎么设计的,由于我的第一篇博客在首页被管理员移走了,大家可以点击这里来跳转,看下第一篇的目录结构。本人作为老菜鸟,和大家分享的也是一些老菜鸟的想法,大神千万别喷我.*

 

设计背景:当初为什么要设计这个自定义的计算公式呢,原因就是,这个价格是不确定的,计算方式也是不确定的,那如果在代码里面写死,那将来修改起来会比较麻烦,作为老菜鸟,我想偷懒了,也是为了省事。

 

如何设计:这对目前项目的情况,计算的过程应该是按照线性的方式来计算的,那么问题就简单了。

首先我们先要定义一个范围控件,这个控件的目的就是,在某个区间之内,设置固定的金额或者单价,

 图片 1

 

 

一下我列出了部分代码,供大家提供思路

    

  1 public partial class RolesUserControl :  UserControl
  2 
  3     {
  4 
  5         public delegate void DelLast(object o, DeleteEventArgs e);
  6 
  7  
  8 
  9         public event DelLast onLeftTextBox;
 10 
 11  
 12 
 13         public delegate void DeleteControl(object o, DeleteEventArgs e);
 14 
 15         public event DeleteControl onDelete;
 16 
 17  
 18 
 19         /// <summary>
 20 
 21         /// 控件索引
 22 
 23         /// </summary>
 24 
 25         public int Index { get; set; }
 26 
 27  
 28 
 29         /// <summary>
 30 
 31         /// 是否验证成功
 32 
 33         /// </summary>
 34 
 35         public bool isRegistOK { get; set; }
 36 
 37  
 38 
 39         /// <summary>
 40 
 41         /// 是否启用关闭
 42 
 43         /// </summary>
 44 
 45         public bool ShowClose
 46 
 47         {
 48 
 49             set
 50 
 51             {
 52 
 53                 this.pictureBox1.Enabled = value;
 54 
 55             }
 56 
 57         }
 58 
 59  
 60 
 61         /// <summary>
 62 
 63         /// 是否显示关闭
 64 
 65         /// </summary>
 66 
 67         public bool ShowCloseVisible
 68 
 69         {
 70 
 71             set
 72 
 73             {
 74 
 75                 this.pictureBox1.Visible = value;
 76 
 77             }
 78 
 79         }
 80 
 81  
 82 
 83         private int _dropDownListType = 2;
 84 
 85  
 86 
 87         /// <summary>
 88 
 89         /// 交易类型
 90 
 91         /// 1:金额
 92 
 93         /// 2:单价
 94 
 95         /// </summary>
 96 
 97         public int DropDownListType { get { return this._dropDownListType; } }
 98 
 99  
100 
101         public RolesUserControl()
102 
103         {
104 
105             InitializeComponent();
106 
107         }
108 
109  
110 
111         /// <summary>
112 
113         /// 构造
114 
115         /// </summary>
116 
117         /// <param name="strLast"></param>
118 
119         public RolesUserControl(string strLast)
120 
121         {
122 
123             InitializeComponent();
124 
125             this.tb_last1.Text = strLast;
126 
127         }
128 
129  
130 
131         /// <summary>
132 
133         /// 鼠标移开TextBox
134 
135         /// </summary>
136 
137         /// <param name="sender"></param>
138 
139         /// <param name="e"></param>
140 
141         private void tb_last2_Leave(object sender, EventArgs e)
142 
143         {
144 
145             decimal d = 0.00m;
146 
147             if (!decimal.TryParse(this.tb_last2.Text, out d))
148 
149             {
150 
151                 isRegistOK = false;
152 
153                 this.tb_last2.Text = "请在这里输入格式为24.5的数据";
154 
155                 return;
156 
157             }
158 
159  
160 
161             if (decimal.Parse(this.tb_last1.Text.Trim()) >= d)
162 
163             {
164 
165                 isRegistOK = false;
166 
167                 this.tb_last2.Text = "下限数据应该大于上限数据";
168 
169                 return;
170 
171             }
172 
173  
174 
175             if (onLeftTextBox != null)
176 
177             {
178 
179                 DeleteEventArgs dea = new DeleteEventArgs();
180 
181                 dea.ControlName = this.Name;
182 
183                 dea.Index = this.Index;
184 
185                 dea.StrText = this.tb_last2.Text.Trim();
186 
187                 this.onLeftTextBox(sender, dea);
188 
189             }
190 
191             this.isRegistOK = true;
192 
193  
194 
195         }
196 
197  
198 
199         /// <summary>
200 
201         /// 点击关闭
202 
203         /// </summary>
204 
205         /// <param name="sender"></param>
206 
207         /// <param name="e"></param>
208 
209         private void pictureBox1_Click(object sender, EventArgs e)
210 
211         {
212 
213             if (this.onDelete != null)
214 
215             {
216 
217                 DeleteEventArgs e1 = new DeleteEventArgs();
218 
219                 e1.ControlName = this.Name;
220 
221                 e1.Index = this.Index;
222 
223                 onDelete(sender, e1);
224 
225             }
226 
227         }
228 
229  
230 
231         /// <summary>
232 
233         /// 切换类型,是使用单价还是使用金额
234 
235         /// </summary>
236 
237         /// <param name="sender"></param>
238 
239         /// <param name="e"></param>
240 
241         private void ddl_type_SelectedIndexChanged(object sender, Telerik.WinControls.UI.Data.PositionChangedEventArgs e)
242 
243         {
244 
245             if (this.ddl_type.Text == "金额")
246 
247             {
248 
249                 radLabel1.Text = "吨   金额:";
250 
251                 tb_amount.Visible = true;
252 
253                 tb_amount.Text = "";
254 
255                 this._dropDownListType = 1;
256 
257             }
258 
259             else
260 
261             {
262 
263                 radLabel1.Text = "吨   单价:";
264 
265                 tb_amount.Visible = false;
266 
267                 tb_amount.Text = "";
268 
269                 this._dropDownListType = 2;
270 
271             }
272 
273         }
274 
275  
276 
277         /// <summary>
278 
279         /// 判断是否满足条件
280 
281         /// </summary>
282 
283         /// <param name="sender"></param>
284 
285         /// <param name="e"></param>
286 
287         private void tb_amount_Leave(object sender, EventArgs e)
288 
289         {
290 
291             decimal d = 0.00m;
292 
293             if (!decimal.TryParse(this.tb_amount.Text, out d))
294 
295             {
296 
297                 isRegistOK = false;
298 
299                 this.tb_amount.Text = "请在这里输入格式为24.5的数据";
300 
301                 return;
302 
303             }
304 
305  
306 
307             if (onLeftTextBox != null)
308 
309             {
310 
311                 DeleteEventArgs dea = new DeleteEventArgs();
312 
313                 dea.ControlName = this.Name;
314 
315                 dea.Index = this.Index;
316 
317                 dea.StrText = this.tb_last2.Text.Trim();
318 
319                 this.onLeftTextBox(sender, dea);
320 
321             }
322 
323             this.isRegistOK = true;
324 
325         }
326 
327  
328 
329         private void tb_amount_KeyPress(object sender, KeyPressEventArgs e)
330 
331         {
332 
333             if ((e.KeyChar >= 48 && e.KeyChar <= 57) || e.KeyChar == 190 || e.KeyChar == 110 || e.KeyChar == 13 || e.KeyChar == 8 || e.KeyChar == 46)
334 
335             { }
336 
337             else
338 
339             {
340 
341                 tb_amount.Text = "";
342 
343                 MessageBox.Show("请输入数字");
344 
345                 return;
346 
347             }
348 
349         }
350 
351 }

 

 

 

那么对于上限,其实他也是个线性的,那么我们也来建立一个控件

 图片 2

 

这个控件用来计算最后临界值。

下面是重点代码,供大家解读

  1 /// <summary>
  2 
  3         /// 添加保存事件
  4 
  5         /// </summary>
  6 
  7         /// <param name="sender"></param>
  8 
  9         /// <param name="e"></param>
 10 
 11         private void radButton2_Click(object sender, EventArgs e)
 12 
 13         {
 14 
 15             if (this.tb_RoleName.Text.Trim() == "")
 16 
 17             {
 18 
 19                 this.MessageBoxShow("请输入角色名称");
 20 
 21                 return;
 22 
 23             }
 24 
 25  
 26 
 27             //解析界面数据
 28 
 29             Model.AutoWater_Sys_BaseRoles br = new Model.AutoWater_Sys_BaseRoles();
 30 
 31             br.RolesName = this.tb_RoleName.Text.Trim();
 32 
 33             br.CreateBy = this.CurrentUserName;
 34 
 35             br.CreateOn = DateTime.Now;
 36 
 37             br.IsUsing = true;
 38 
 39             br.IsDefault = false;
 40 
 41             br.RowState = 1;
 42 
 43             br.ID = Guid.NewGuid();
 44 
 45  
 46 
 47             List<Model.AutoWater_Sys_BaseRolesDetail> lbrd = new List<Model.AutoWater_Sys_BaseRolesDetail>();
 48 
 49  
 50 
 51             List<RolesUserControl> _List = new List<RolesUserControl>();
 52 
 53             //开始范围
 54 
 55             //rolesUserControl1 ,校验数据是否正确
 56 
 57             _List.Add(this.rolesUserControl1);
 58 
 59             string strMsg="";
 60 
 61             bool isVaild = this.VaildRolesUserControl(this.rolesUserControl1, ref strMsg);
 62 
 63             if (!isVaild)
 64 
 65             {
 66 
 67                 _List.Clear();
 68 
 69                 MessageBoxShow(strMsg);
 70 
 71                 return;
 72 
 73             }
 74 
 75             //遍历Panel
 76 
 77             foreach (Control c in this.radPanel1.Controls)
 78 
 79             {
 80 
 81                 isVaild = this.VaildRolesUserControl(c as RolesUserControl, ref strMsg);
 82 
 83                 if (!isVaild)
 84 
 85                 {
 86 
 87                     _List.Clear();
 88 
 89                     MessageBoxShow(strMsg);
 90 
 91                     return;
 92 
 93                 }
 94 
 95                 _List.Add(c as RolesUserControl);
 96 
 97             }
 98 
 99             string strValue1,strValue2,strValue3,strValues4;
100 
101             _List.ForEach(t => {
102 
103                 //Last1
104 
105                 strValue1 = (t.Controls.Find("tb_last1", true)[0] as RadTextBox).Text;
106 
107                 //Last2
108 
109                 strValue2 = (t.Controls.Find("tb_last2", true)[0] as RadTextBox).Text;
110 
111                 //Price
112 
113                 if (t.DropDownListType == 1)
114 
115                 {
116 
117                     strValue3 = (t.Controls.Find("tb_amount", true)[0] as RadTextBox).Text;
118 
119                 }
120 
121                 else
122 
123                 {
124 
125                     strValue3 = (t.Controls.Find("ddl_price", true)[0] as RadDropDownList).Text;
126 
127                 }
128 
129  
130 
131                 lbrd.Add(new Model.AutoWater_Sys_BaseRolesDetail() {
132 
133                  BaseTablesID=br.ID,
134 
135                   ID=Guid.NewGuid(),
136 
137                    BetweenValue=decimal.Parse(strValue2)-decimal.Parse(strValue1),
138 
139                     CountType=t.DropDownListType,
140 
141                      CountTypeValue=decimal.Parse(strValue3),
142 
143                       CreateBy=this.CurrentUserName,
144 
145                        CreateOn=DateTime.Now,
146 
147                         DownValue=decimal.Parse(strValue1),//下限不低于
148 
149                          UpValue = decimal.Parse(strValue2),//上限不超过
150 
151                           SortID=t.Index,
152 
153                 });
154 
155             });
156 
157  
158 
159             //检查范围N
160 
161             //单价
162 
163             strValues4 = (this.userLastRolesControl1.Controls.Find("ddl_price", true)[0] as RadDropDownList).Text;
164 
165             //吨数范围
166 
167             strValue3= (this.userLastRolesControl1.Controls.Find("tb_last2", true)[0] as RadTextBox).Text;
168 
169             if (strValues4 != "" && strValue3!="")
170 
171             {
172 
173                 lbrd.Add(new Model.AutoWater_Sys_BaseRolesDetail() {
174 
175                  BaseTablesID=br.ID,
176 
177                   SortID=9,
178 
179                    BetweenValue=decimal.Parse(strValue3),
180 
181                     UpValue=0.00m,
182 
183                       DownValue = decimal.Parse(strValue3),
184 
185                       CreateOn=DateTime.Now,
186 
187                        CreateBy=this.CurrentUserName,
188 
189                         ID=Guid.NewGuid(),
190 
191                          CountTypeValue=decimal.Parse(strValues4),
192 
193                           CountType=3,
194 
195                 });
196 
197             }
198 
199  
200 
201             Combin<Model.AutoWater_Sys_BaseRoles, List<Model.AutoWater_Sys_BaseRolesDetail>> combinList = new Combin<Model.AutoWater_Sys_BaseRoles, List<Model.AutoWater_Sys_BaseRolesDetail>>(br,lbrd);
202 
203             bool isAddOK=SettingHelper.Init.AddBaseRoles(combinList);
204 
205             if (isAddOK)
206 
207             {
208 
209                 this.MessageBoxShow("建立规则成功!");
210 
211                 combinList = null;
212 
213                 lbrd.Clear();
214 
215                 br = null;
216 
217                 lbrd = null;
218 
219                 this.Close();
220 
221             }
222 
223             else
224 
225             {
226 
227                 this.MessageBoxShow("建立规则失败!");
228 
229             }
230 
231         }

 

 

到此以上就是设置了定义计算规则的逻辑,是不是很简单,有了这些数据的规则之后,接下来就是解析这些数据了,有兴趣的朋友可以自己设计下,然后自己解析,因为这些在老菜鸟看来这些都是儿科的玩意,好了今天就和大家分享到这里,明天给大家分享下,我这个老菜鸟是如何开发发票设计器的,如何来动态设计发票模板,各位88

前戏: 针对上一篇列出来的功能点,今天和大家分享下这个自定义的公式是怎么...

屏幕适配的那些坑

来自 CocoaChina 2014-12-15 资讯

前面我们对android有了基础的认识,接下来就针对布局和图片表格控件GridView做一下介绍。

[ 转载自 CocoaChina ]

图片 3

Layout五大布局分为LinearLayout线性布局、RelativeLayout相对布局、TableLayout表格布局、FrameLayout框架布局、AbsoluteLayou绝对布局,下面我们就拿用的最多的线性布局和相对布局做详解。

背景

最近在做 iPhone4 和 iPhone6 及 iPhone6 plus 的适配工作。由于历史原因没有用 AutoLayout ,也由于历史原因老代码的布局全是用数字一个一个写死的。这就给适配带来了莫大的困难。比如下面这段代码:

  1. UILabel *infoLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 241, 320, 28)];

    1. ...

0这种数字还好说,241就完全让人摸不着头脑,至于320这个改成屏幕宽度倒也就还好,但是28这种神奇数字又是什么呢。这种代码虽然写起来容易,但是维护困难,可读性极差,尤其是有多个控件布局的时候,依赖关系不明显,如果调整布局需要挨个重新计算并设置值,极难维护。

集大成者莫过于此:

  1. CGRect rect = CGRectMake(12.2 *320 42.5*,((totalRows-1)%3)*55 2,42.5,42.5);

屏幕适配的分享今天早上看到这代码差点就抱着键盘哭了出来。

下面和大家聊一聊屏幕适配中需要注意的内容。

大前提是:纯粹通过代码设置坐标和大小的布局方案(我觉得还是 xib autolayout 的组合适配起来更轻松一点)。

GridView图片表格控件也是比较常用的空间,它可以以表格的形式显示图片资源,比如旅游app中让各景点图片罗列出来,是一个不错的控件选择。

合理设计

布局虽说是个体力活,但同时也是个艺术活。之所以称之为设计,是因为同样的设计稿可能有很多种实现方式。UIKit 提供了很多现成可用的控件,如何充分利用这些控件实现自己的布局结果就是一个需要思考的过程了。

举个简单的例子,一个滑动挂断电话的按钮,你可以通过 UIImageView 实现,添加按下的监听然后跟随手指移动,松手之后再动画回到原地即可。你也可以用 UIScrollView 实现,设置 ContentSize 宽于屏幕,从而控制滑块范围。当然你也可以用 UISlider 实现,只需要设置滑块的图像即可。各有优劣,自行判断。

不多说,零基础编写android项目之布局篇开始:

数据语义

如果我想让宽度为100的按钮位于屏幕三分之一处,我可以设置它的 x 值为 57 轻松完成任务。这样虽然简单,但是过段时间再回来维护代码的时候会对这样的神奇数字不知所措,如果要调整布局更是举步维艰。我觉得比较好的方法是把数据由来列出来,像这样:

  1. float x = kScreenWidth / 3 - btnWidth / 2;

这样看起来就轻松多了:屏幕的三分之一处再往左半个宽度,也就是 x 的值。

原文链接:
http://jingyan.baidu.com/article/c85b7a640c02d6003bac95a5.html

相对布局

我们常常遇到很多控件同时出现的情况,比如三个从上往下依次间隔10像素的按钮,可以这样实现:

  1. CGRect rect1 = CGRectMake(0,0,100,44);

  2. CGRect rect2 = CGRectMake(0,54,100,44);

  3. CGRect rect3 = CGRectMake(0,108,100,44);

但是如果我们想把这三个按钮同时下移,那我们就需要挨个设置一遍。比较好的方案是通过相对布局来实现。

  1. CGRect rect1 = CGRectMake(0,0,100,44);

  2. CGRect rect2 = CGRectMake(0,rect1.origin.y rect1.size.height,100,44);

  3. CGRect rect3 = CGRectMake(0,rect2.origin.y rect2.size.height,100,44);

当然什么场景使用相对布局,针对哪些控件使用相对布局,这些就是我们需要设计的问题了。

一、LinearLayout线性布局

层次关系

一般情况下,一个页面内会出现很多控件,如果都通过 addSubview 添加到视图中很容易混乱。可以通过一些 UIView 作为容器辅助布局。个人觉得可以给控件们安排好深度,同个深度的控件再进行分组,有助于管理。

①我们需要知道线性布局的使用范围,一般LinearLayout用在没有特殊规则的布局上,因为LinearLayout只可以水平、垂直排列,比如计算器项目等。下面我们针对用户登录窗口的布局来介绍LinearLayout。

灵活精准

布局代码的灵活性十分重要。比如两个和屏幕等宽的按钮,如果通过160设置宽度,现在iPhone6一出之后就纷纷中枪了。再比如那种 CollectionView 的单元格宽度高度写死了44.5的,最好是通过计算动态获取。虽然有一定的计算量,但是在后期如果遇到设计变更什么的,只需要改个宏定义的 CELLS_PER_ROW 这样的值就可以实现新需求,十分方便。更重要的是,这样的代码往往是有意义的,所有的值和布局结果都是可以语义化表达的,这样会让整个代码鲜活起来,充满生命力。

②开始编写布局代码,你可以先用鼠标直接拖动控件到想要放的位置,看看效果如何,你会发现线性布局智能拖动成垂直显示方式,因为android:orientation="vertical"这句代码的作用,它表示该布局以垂直方向显示各控件,如果不加这句则默认以horizontal方式水平显示。

③各属性含义:

1、LinearLayout:可以嵌套并且必须要有layout_width和layout_height属性,其值有match_parent匹配父控件、wrap_content包裹匹配控件、fill_parent填充父控件;

2、orientation:控制是水平排列还是垂直排列;

3、background:设置背景;

4、gravity:设置该布局中内容的对齐方式;

5、layout_gravity:设置该布局本身的对齐方式;

本文由江苏福彩快三发布,转载请注明来源

关键词: 江苏福彩快三