您的位置:首页 > 移动开发 > Android开发

一周学习工作总结:

2015-11-12 15:13 513 查看

1.android textView优化 加载方式理解

textView是安卓中诸多视图的父类,方法多样,实现灵活,基于textView可以实现很多功能,提升textView效率便十分重要。

优化方案如下:

预渲染:首先初始化配置做缓存,预计宽度和文字大小之后,用配置好的代码进行渲染。

原理:

textview显示在视图中的流程如下,首先调用meature方法计算textView的长度和宽度,然后调用layout方法,将textView显示

在父布局相应位置。

textView具有动态调整宽度和行数的功能,计量行数时,首先判断其是否为单行isBoring,如果是单行则调用BoringLayout作为

布局,将其显示在一行内,如果是非单行但是有最大长度限制,则使用StaticLayout来调整布局,使其显示特定文字,如果没有长

度限制,则使用DynamicLaout,使textView调用Layout.draw方法,一行一行渲染文本。

具体方案

重写 onDraw onMeasure onLayout 方法,缩减每个具体textView加载工作,加快每帧渲染效率。

参考链接:

http://ragnraok.github.io/textview-pre-render-research.html

参考项目:

https://github.com/ragnraok/StaticLayoutView

2.ViewGroup优化:优化item,优化整个adpater,加速listView加载。

如果一个item过于复杂,可以将其拆分成多个小的item。

问题:掉帧(系统每隔16.7ms发出渲染信号,应在16.7ms完成应用逻辑,使系统达到60fps每秒)

listView被加入布局时,adapter的getview方法将被回调。在16.7ms内,可见listview的getview方法被按照顺序执行,

一旦包含复杂控件,16.7ms无法完成渲染,用户便只能看到上一帧的效果,这时就发生了掉帧,尤其在中低端设备,

16ms渲染很困难。

解决方案:

getView方法中每个View进行拆分。例如facebook、微博每条博客信息包含

1)头部:用户名、用户头像、发送时间、操作按钮;

2)内容页:用户发送的文字和表情、转发人文字、最初创作人的文字、图片、视频等九宫格信息。

3)底部操作:点赞、转发、评论等操作功能。

其中,底部、头部布局相同、内容页信息变化较大,将一条完整信息作为一个getView的View布局,在有些设备上容易

发生掉帧,可以采用拆分布局方式,adpter将视图类型设置为3种,头部、内容页、底部操作,各作为单个View,获取

一条博客信息时,一条信息完整显示实际调用getView方法三次;

同时头部、底部信息重用较多,每次只有内容页会动态加载,粒度更小,相应速度也更快。

参考链接:http://blog.aaapei.com/article/2015/02/facebookxin-wen-ye-listviewyou-hua

3.js进行信息校验、回退等功能

项目中需要对身份证、手机号进行校验,代码如下:

function IdentityCodeValid(code) {
var city={11:"北京",12:"天津",13:"河北",14:"山西",15:"内蒙古",21:"辽宁",22:"吉林",23:"黑龙江 ",31:"上海",32:"江苏",33:"浙江",34:"安徽",35:"福建",36:"江西",37:"山东",41:"河南",42:"湖北 ",43:"湖南",44:"广东",45:"广西",46:"海南",50:"重庆",51:"四川",52:"贵州",53:"云南",54:"西藏 ",61:"陕西",62:"甘肃",63:"青海",64:"宁夏",65:"新疆",71:"台湾",81:"香港",82:"澳门",91:"国外 "};
var tip = "";
var pass= true;

if(!code || !/^\d{6}(18|19|20)?\d{2}(0[1-9]|1[12])(0[1-9]|[12]\d|3[01])\d{3}(\d|X)$/i.test(code)){
tip = "身份证号格式错误";
pass = false;
}

else if(!city[code.substr(0,2)]){
tip = "地址编码错误";
pass = false;
}
else{
//18位身份证需要验证最后一位校验位
if(code.length == 18){
code = code.split('');
//∑(ai×Wi)(mod 11)
//加权因子
var factor = [ <
4000
span class="hljs-number">7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2 ];
//校验位
var parity = [ 1, 0, 'X', 9, 8, 7, 6, 5, 4, 3, 2 ];
var sum = 0;
var ai = 0;
var wi = 0;
for (var i = 0; i < 17; i++)
{
ai = code[i];
wi = factor[i];
sum += ai * wi;
}
var last = parity[sum % 11];
if(parity[sum % 11] != code[17]){
tip = "校验位错误";
pass =false;
}
}
}
//if(!pass) alert(tip);
return pass;
}

$container.on('click', '#check', function () {
$text1 = $('#text1').val();
$text1 = $.trim($text1);
$text2 = $('#text2').val();
$text2 = $.trim($text2);

//$showDialog1=true;
$showDialog2=true;
//if($text1.length == 11)
//{
//  $showDialog1=false;
//}
$select =$('#select2').val();
//手机号,只需要校验前三位
if($select ==1 && ($text2.length==11 || $text2.length==12 ))
{
if((/^1[3|4|5|7|8][0-9]\d{4,8}$/.test($text2))){
//alert("不是完整的11位手机号或者正确的手机号前七位");
//document.mobileform.mobile.focus();
//return false;
$showDialog2=false;
}
}
else if($select ==2 && ($text2.length==15 || $text2.length==18 ))
{
$res= IdentityCodeValid($text2);
if($res)
{
$showDialog2=false;
}

}else if($text2.length == 0)
{
$showDialog2=false;
}
//检查位数
/*
if($showDialog1  )
{
$('#dialog1').show();
$('#dialog1').find('.weui_btn_dialog').on('click', function () {
$('#dialog1').hide();
});
}
else */ if($showDialog2  )
{
$('#dialog2').show();
$('#dialog2').find('.weui_btn_dialog').on('click', function () {
$('#dialog2').hide();
});
}

else{
$("form").submit();
}

});
... javascript'''


js实现返回上一页功能:

$container.on('click', '#backbtn', function () {
window.history.go(-1);
});
... javascript'''


4.html5日历选择期在ios系统中不可用

原代码:

<input type="date">
... html'''


改为选用此框架:http://www.lovewebgames.com/jsmodule/mobile-select-date.html

更改日期分隔符1920/01/01 为1920-01-01,在js文件中将所有表示日期分割的符号“/”都修改为“-”。

**注意:**test,

* = =*。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息