云浏览器的相关技术难点介绍

 

您能够到http://yun.la/download.html下载该浏览器,或者是到安卓市场,91助手网站下载各类版本包括第一个版本,谷姐(第二个版本) html

云导航,云社交,云应用3个模块的滑动特效: java

尝试过本身作,可是难度太大,使用android自带的ViewFlipper,可是在实际使用中没有UC浏览器的缓慢滑动特效,随便滑动一小段距离就会翻到下一页,3个页面有种飘飞的感受,速度太快; android

Gallery适合用于滑动图片,而不是xml布局;也参考了开源项目viewFlow,可是里面的内容太复杂; 数据库

期间上网找了不少demo,也不行; 浏览器

最后选择了使用ViewPager的jar包,结果能实现缓慢,稳定滑动,增长用户体验友好性,同时简化了代码 服务器

(最后考虑是否写上实现原理) cookie

"手机分类导航,6个选项": dom

新建窗口实现: 异步

难点: ide

1)保证在只有一个新建窗口页面的时候能够随着当前浏览页面变换网站相关信息,若是没有浏览网页就默认设置为谷姐网站,

在自定义的BrowserWebViewClient 的onPageStarted中设置全局变量Config.str_URL,而后在

在自定义的WebChromeClientonReceivedTitle设置全局List,而后经过循环替换List中的谷姐网址

           if (Config.newpages.size() <= 5) {

              HashMap<String, Object> map = new HashMap<String, Object>();

              map.put("itemUrl", Config.str_URL);

              map.put("itemText", str_Name);

for(int i =0; i<Config.newpages.size(); i++){

String url = (String)Config.newpages.get(i).get("itemUrl");

                  if(Config.newpages.size()==1){

                     Config.newpages.set(0, map);

                  }else{

                     if(url.indexOf("http://www.goojje.com/")!= -1){

                         Config.newpages.set(i, map);

                         break;

                     }

                  }

                 

              }

           }

2)点击首页新建窗口按钮弹出popupwindow速度很慢,反复查找后分析发现是ListViewadapter中每次要去联网下载网站ICON,原来的作法是每次先在本地查找网站的ICON是否存在,若是不存在就联网查找,若是仍是找不到就设置为默认的ICON,尝试了用handler开个线程,或者用异步加载方式联网下载ICON,仍是解决不了快速显示popupwindow问题,查找资料后发现能够在WebViewClientonPageStarted或者是WebChromeClientonReceivedIcon中能够接收到浏览网页的ICON,项目中选择onPageStarted中存储ICON到指定目录,结果解决了新建窗口弹出慢的问题

3)首页新建窗口按钮要实现按下和抬起的时候图片背景切换,最多能够新建5个窗口,难点:每一个窗口有2个图片要切换,一共有10张图片要切换,在xml中配置很难实现,而后在java代码中经过设置setOnTouchListener,把新建窗口数量存储到全局变量List类型Config.newpages中,而后在按下和抬起事件中分别判断Config.newpagessize大小是多少,而后用switch,case根据不一样大小设置不一样的背景

4)新建窗口的列表条目没法彻底显示,列表下面的按钮也没法彻底显示,分析了android:layout_heightandroid:layout_weight,android:padding,android:layout_margin等各方面的缘由,仍是不能解决,尝试了

public  void setListViewHeightBasedOnChildren(ListView listView) {

       ListAdapter listAdapter = listView.getAdapter();

       if(listAdapter == null){

           return;

       }

       ViewGroup.LayoutParams params = listView.getLayoutParams();

       int totalHeight = 0;

       if(listAdapter.getCount()!=0){

           for ( int i = 0; i < listAdapter.getCount(); i++ ){

              View listItem = listAdapter.getView(i, null, listView);

              listItem.measure(0, 0);

              totalHeight += listItem.getMeasuredHeight();

           }

           params.height = totalHeight + (listView.getDividerHeight() * (listAdapter.getCount() - 1));

       }else{

           params.height = 0;

       }

       listView.setLayoutParams(params);

    }

计算ListView高度的办法,可是仍是不行,ListView下面的按钮仍是没法彻底显示,

查找不少资料后采用自定义ListView控件,关闭ListView滚动条的方式解决,具体内容以下

public class CustomisedListView extends ListView{

 

    public CustomisedListView(Context context) {

       super(context);

    }

 

    public CustomisedListView(Context context, AttributeSet attrs, int defStyle) {

       super(context, attrs, defStyle);

    }

 

    public CustomisedListView(Context context, AttributeSet attrs) {

       super(context, attrs);

    }

 

    @Override

    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {

       int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2,  

                MeasureSpec.AT_MOST);

       super.onMeasure(widthMeasureSpec, expandSpec);

    }

}

该方法也适合解决ListViewScrollView冲突的问题,对GridView也适用

5)在按下新建窗口内容条目的时候,背景会变黄色,具体颜色根据不一样的手机显示不一样颜色,尝试过android:listSelector=”@drawable/new_page_down.png”,或者设置android:cacheColorHint="#00000000",或者是android:listSelector="@android :color/transparent",也不行,解决办法:在ListView控件中设置android:listSelector="#00000000"

6)点击新建窗口popupwindow中的新建窗口按钮,popupwindow消失后新建窗口按钮所占区域会变白,原来是用selector的设置按钮的按下抬起切换背景图片效果,具体代码相似  <item android:drawable="@drawable/ic_menu_menu_normal" android:state_pressed="false"/>

    <item android:drawable="@drawable/ic_menu_menu_down" android:state_pressed="true" />

尝试了  <item android:state_pressed="true" android:drawable="@drawable/prompt_choose_down" />

    <item android:state_focused="true" android:state_enabled="true"

    android:drawable="@drawable/prompt_choose_down" />

    <item android:state_enabled="true"

     android:drawable="@drawable/prompt_choose_normal" />和其余办法搭配

android:state_focusedandroid:state_enabledandroid:state_pressedandroid:state_focusedandroid:state_window_focusedandroid:drawable各类属性,仍是没法解决,

最后在java代码中的onTouch设置背景解决问题,思考分析是该按钮是在popupwindow中,因此用xml配置不合适,在dialog中能够使用xml配置,不会出现上面的问题

添加设置经常使用网站:切横屏转到竖屏的时候,非空的选项内容会复制到最后一个选项中,通过查找,

GridView的适配器中去除控件复用的代码,具体是 

if (convertView== null) {} else {

              viewCache = (ViewCache) rowView.getTag();

           }

下载模块:难点:

进入QQ邮箱后下载附件,选择浏览器,下载后出错,发现URL是加密过的,相似http://sz.mail.store.qq.com/F8286F9A52920236EEA4EB54CDCB3BD087AA5E47A查找资料分析后发现是没有把cookie设置,解决办法:获取cookie,而后向服务端发送请求时设置cookie,

CookieSyncManager.createInstance(Main.this);

CookieManager cookieManager = CookieManager.getInstance();

cookie = cookieManager.getCookie(url);

conn.setRequestProperty("Cookie", mParent.getmCookies());

断点续传:主要思路是从数据库中查找出上次下载的进度,而后用RandomAccessFile设置进度点,

在HttpUrlConnection向服务器发送请求时设置Range属性,conn.setRequestProperty("Range", "bytes="+ (downloaded) + "-" + endPosition);若是下载中中止下载就向数据库表更新进度,

正在下载列表中按钮的文本切换(启动/暂停):要实现的效果是整个列表中

1)  若是是正在下载的任务,按钮就显示为暂停,2)若是是已经暂停的任务就显示为开始,3)若是已是暂停的任务,退出浏览器重进入的时候要显示为暂停;遇到的问题:常常是当手机按下的时候,任务暂停时,按钮又马上显示为开始,或者是新加任务的时候原来暂停的任务又马上显示为开始,

解决办法:给下载任务实体添加是否从数据库中查找出来的标志位mIsFromDb,从数据库中查找出来时设置为true,在正在下载的ListView的适配器中该标志位若是为true则按钮文本设置为开始,若是是false,设置为暂停,在适配器中同时给按钮添加setOnTouchListener,在按下时,若是按钮文本是暂停,就设置为继续,同时mIsFromDb设置为true,若是按钮文本是继续,就设置为暂停,mIsFromDb设置为false,

下载进度条的更新:要实现的效果,随着下载内容的增长,不断改变进度条,实现方法:把下载任务实体经过handler发送到handleMessage中根据实体中的已经下载量来设置ProgressBar

当下载完成时所有当前页面都要实现弹出对话框自定义实体类EventController在该类中添加自定义的下载接口List<IDownloadEventsListener> mDownloadListeners而后在全部Activity中添加Activity实例到该List,在IDownloadEventsListener接口中定义方法onDownloadEvent,而后在全部Activity中实现IDownloadEventsListener该接口中的onDownloadEvent方法,在下载完成后就弹出对话框;期间遇到的问题:若是有5个页面,出现的状况是下载完成后对话框会弹出5次,解决办法:

EventController中只调用对顶端的activityonDownloadEvent方法,具体是用mDownloadListeners.get(mDownloadListeners.size()-1)

下载完成弹出对话框的实现:用Activity来作,具体作法:

设置窗口notitle, setContentView,初始化和设置xml里面的控件及相关事件,在activity中添加属性android:theme="@style/dialog"

通知栏的下载状态标示:使用NotificationNotificationManager,具体实现:

mNotification = new Notification(R.drawable.download_anim, mContext

                   .getString(R.string.DownloadNotification_DownloadStart), System

                   .currentTimeMillis());其中R.drawable.download_anim是动画xml,而后建立Intent对象用来在点击通知栏的时候进入下载页面Activity,设置mNotification.setLatestEventInfo,用来显示通知栏中的提示文字,设置mNotificationManager.notify(mNotificationId, mNotification);发送通知到通知栏中

系统设置 难点:页面要画成长方形的矩形,四个角是圆角,解决办法:把Layout的布局背景用shape,设置属性gradient(背景颜色渐变),stroke(描边),corners(设置圆角),padding(间距)实现

相关文章
相关标签/搜索