`
achilies
  • 浏览: 626 次
  • 性别: Icon_minigender_1
  • 来自: 广州
最近访客 更多访客>>
社区版块
存档分类
最新评论

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

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

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

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

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

期间上网找了很多demo,也不行;

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

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

新建窗口实现:

难点:

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

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

在自定义的WebChromeClient的onReceivedTitle设置全局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速度很慢,反复查找后分析发现是ListView的adapter中每次要去联网下载网站ICON,原来的做法是每次先在本地查找网站的ICON是否存在,如果不存在就联网查找,如果还是找不到就设置为默认的ICON,尝试了用handler开个线程,或者用异步加载方式联网下载ICON,还是解决不了快速显示popupwindow问题,查找资料后发现可以在WebViewClient的onPageStarted或者是WebChromeClient的onReceivedIcon中可以接收到浏览网页的ICON,项目中选择onPageStarted中存储ICON到指定目录,结果解决了新建窗口弹出慢的问题


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


4)新建窗口的列表条目无法完全显示,列表下面的按钮也无法完全显示,分析了android:layout_height,android: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);

    }

}


该方法也适合解决ListView和ScrollView冲突的问题,对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_focused,android:state_enabled,android:state_pressed,android:state_focused,android:state_window_focused,android: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中只调用对顶端的activity的onDownloadEvent方法,具体是用mDownloadListeners.get(mDownloadListeners.size()-1)

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

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

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

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(间距)实现


下面的是云浏览器的安装包
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics