雲瀏覽器的相關技術難點介紹

 

您能夠到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(間距)實現

相關文章
相關標籤/搜索