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
如果一个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
项目中需要对身份证、手机号进行校验,代码如下:
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 = [ 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'''
原代码:
"date">
... html'''
改为选用此框架:http://www.lovewebgames.com/jsmodule/mobile-select-date.html
更改日期分隔符1920/01/01 为1920-01-01,在js文件中将所有表示日期分割的符号“/”都修改为“-”。
**注意:**test,
* = =*。