一周学习工作总结:

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 = [ 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,
* = =*

展开阅读全文

没有更多推荐了,返回首页