① 最流行的四種移動端布局方式,看這一篇文章就夠了
眾所周知,pc端呢目前處於一種三家分晉,即三種內核(webkit,blink,gecko),當然算上馬上要更換內核的IE那就是四個。而我們的移動端呢,那就是萬余基於webkit了,所以各位進行移動端web開發時,只考慮webkit的適配就可以了,怎麼樣,開不開心 ?
我們先來看看什麼是視口,視口就是瀏覽器顯示頁面內容的屏幕區域。 視口可以分為布局視口、視覺視口和理想視口,他又可以分成一下四種
一般移動設備的瀏覽器都默認設置了一個布局視口,用於解決早期的PC端頁面在手機上顯示的問題。
iOS, android基本都將這個視口解析度設置為 980px,所以PC上的網頁大多都能在手機上呈現,只不過元素看上去很小,一般默認可以通過手動縮放網頁。
字面意思,它是用戶正在看到的網站的區域。注意:是網站的區域。
我們可以通過縮放去操作視覺視口,但不會影響布局視口,布局視口仍保持原來的寬度。
為了使網站在移動端有最理想的瀏覽和閱讀寬度而設定
理想視口,對設備來講,是最理想的視口尺寸
需要手動添寫meta視口標簽通知瀏覽器操作
meta視口標簽的主要目的:布局視口的寬度應該與理想視口的寬度一致,簡單理解就是設備有多寬,我們布局的視口就多寬
最標準的viewport設置
視口寬度和設備保持一致
視口的默認縮放比例1.0
不允許用戶自行縮放
最大允許的縮放比例1.0
最小允許的縮放比例1.0
ps:注意二倍圖或者三倍圖問題
流式布局,就是百分比布局,也稱非固定像素布局。
通過盒子的寬度設置成百分比來根據屏幕的寬度來進行伸縮,不受固定像素的限制,內容向兩側填充。
流式布局方式是移動web開發使用的比較常見的布局方式。
父盒子開啟display:flex後,默認為不換行,所以使用flex-wrap:wrap;使其換行
使用justify-content: space-around; 使其子盒子主軸間距平均分配
使用align-content: space-around; 使其子盒子側軸間距平均分配
方案1
①假設設計稿是750px
②假設我們把整個屏幕劃分為15等份(劃分標准不一可以是20份也可以是10等份)
③每一份作為html字體大小,這里就是50px
④那麼在320px設備的時候,字體大小為320/15就是 21.33px
⑤用我們頁面元素的大小除以不同的 html字體大小會發現他們比例還是相同的
⑥比如我們以750為標准設計稿
⑦一個100 100像素的頁面元素在 750屏幕下, 就是 100/ 50 轉換為rem 是 2rem 2rem 比例是1比1
⑧320屏幕下, html字體大小為21.33 則 2rem= 42.66px 此時寬和高都是 42.66 但是寬和高的比例還是 1比1
⑨但是已經能實現不同屏幕下 頁面元素盒子等比例縮放的效果
總結:
①最後的公式:頁面元素的rem值 = 頁面元素值(px) / (屏幕寬度 / 劃分的份數)
②屏幕寬度/劃分的份數就是 htmlfont-size 的大小
③或者:頁面元素的rem值 = 頁面元素值(px) / html font-size 字體大小
方案2
1.less+rem+媒體查詢
2.lflexible.js+rem
響應式需要一個父級做為布局容器,來配合子級元素來實現變化效果。
原理就是在不同屏幕下,通過媒體查詢來改變這個布局容器的大小,再改變裡面子元素的排列方式和大小,從而實現不同屏幕下,看到不同的頁面布局和樣式變化。
父容器版心的尺寸劃分
超小屏幕(手機,小於 768px):設置寬度為 100%
小屏幕(平板,大於等於 768px):設置寬度為 750px
中等屏幕(桌面顯示器,大於等於 992px):寬度設置為 970px
大屏幕(大桌面顯示器,大於等於 1200px):寬度設置為 1170px
但是我們也可以根據實際情況自己定義劃分
直接拿Bootstrap 預先定義好的樣式來使用
修改Bootstrap 原來的樣式,注意權重問題
學好Bootstrap 的關鍵在於知道它定義了哪些樣式,以及這些樣式能實現什麼樣的效果
② 微軟Win10你的手機新增支持同時運行多個安卓App
1月31日消息外媒 Windows Latest 報道,去年,Windows 10 Your Phone(你的手機)應用更新了部分 Galaxy 手機的 Android 應用串流功能,現在微軟又增加了對多個 Android 應用的支持。這項功能也在逐步推出。
安裝更新後,通過支持的三星手機,你就可以在 Windows 10 上同時運行多個 Android 應用。對於非三星手機,Android 應用支持可能會通過 Project Latte 項目落地,預計它也將支持 APK 側載。
Your Phone 應用目前允許人們在 Windows 10 上運行單個 Android 應用,微軟希望通過支持多個應用來改善整體體驗。從截圖中可以看到,你可以同時運行多達三個 Android 應用。
遺憾的是,安卓應用串流的支持還僅限於三星 Galaxy 手機,對其他手機的支持還沒有得到官方確認。
多份報告顯示,微軟一直在秘密進行 「Project Latte」項目,將 Android 應用帶到 Windows 10 上。Project Latte 將基於 Windows Linux 子系統,它已經升級了 GUI 應用和 GPU 加速支持。
通過 Your Phone,你可以使用三星 Galaxy 手機將 Android 應用流式傳輸到你的 PC 上,微軟現在正在讓安卓應用原生運行。
不過這不會有任何 Google Play 服務的支持,但有計劃使用 Windows API 來填補這一空白,開發者不需要做任何重大修改就可以在商店中提交應用。
原生 Android 應用支持預計將在 Windows 10 2021 年秋季更新中出現。
③ 移動端頁面 一般用什麼寫
移動端頁面一般使用以下技術進行開發:
HTML5:
CSS3:
javaScript:
框架和庫:
原生應用開發:
混合應用開發:
跨平台應用開發:
根據具體需求和項目規模,開發者可以選擇適合的技術棧進行移動端頁面的開發。
④ android中怎麼解析復雜的xml文件
本文主要講解Android開發中如何對XML文件的解析,由於XML文件具有與平台無關,廣泛應用於數據通信中,因此解析XML文件就顯得很有意義。Android對XML文件解析的方法主要有3種。 通常有三種方式:DOM、SAX和PULL,下面就分別針對這三種方式來進行討論。
文件內容如下所示:
那麼就是要對此XML文件做解析。下面我們就分別用DOM,SAX和PULL三種方式,分別對此XML文件做解析。
DOM方式
DOM方式解析xml是先把xml文檔都讀到內存中,然後再用DOM API來訪問樹形結構,並獲取數據。由DOM解析的方式可以知道,如果XML文件很大的時候,處理效率就會變得比較低,這也是DOM方式的一個缺點。
現在我們來解析上文中提到的有關天氣預報信息相關的xml文件。什麼是解析呢?說的通俗一點,就是將這個帶標簽的XML文件識別出來,並抽取一些相關的,對我們有用的信息來給我們使用。那在這個文件里,時間,天氣,溫度,以及圖標對我們來說是需要得到的。我們要對其做解析。
解析的具體思路是:
1. 將XML文件載入進來。
2. 獲取文檔的根節點
3. 獲取文檔根節點中所有子節點的列表
4. 獲取子節點列表中需要讀取的節點信息
根據這4個步驟,我們進行開發:
首先就是如何載入XML文件,假設此文件來源於網路。
SAX方式
SAX是Simple API for XML的縮寫。是一個包也可以看成是一些介面。
相比於DOM而言SAX是一種速度更快,更有效,佔用內存更少的解析XML文件的方法。它是逐行掃描,可以做到邊掃描邊解析,因此SAX可以在解析文檔的任意時刻停止解析。非常適用於Android等移動設備。
SAX是基於事件驅動的。所謂事件驅動就是說,它不用解析完整個文檔,在按內容順序解析文檔過程中,SAX會判斷當前讀到的字元是否符合XML文件語法中的某部分。如果符合某部分,則會觸發事件。所謂觸發事件,就是調用一些回調方法。當然android的事件機制是基於回調方法的,在用SAX解析xml文檔時候,在讀取到文檔開始和結束標簽時候就會回調一個事件,在讀取到其他節點與內容時候也會回調一個事件。在SAX介面中,事件源是org.xml.sax包中的XMLReader,它通過parser()方法來解析XML文檔,並產生事件。事件處理器是org.xml.sax包中ContentHander、DTDHander、ErrorHandler,以及EntityResolver這4個介面。
這四個介面的詳細說明如下:
事件處理器名稱
事件處理器處理的事件
XMLReader注冊方法
ContentHander
XML文檔的開始與結束,
XML文檔標簽的開始與結束,接收字元數據,跳過實體,接收元素內容中可忽略的空白等。
setContentHandler(ContentHandler h)
DTDHander
處理DTD解析時產生的相應事件
setDTDHandler(DTDHandler h)
ErrorHandler
處理XML文檔時產生的錯誤
setErrorHandler(ErrorHandler h)
EntityResolver
處理外部實體
setEntityResolver(EntityResolver e)
我們用來做內容解析的回調方法一般都定義在ContentHandler介面中。
ContentHandler介面常用的方法:
startDocument()
當遇到文檔的開頭的時候,調用這個方法,可以在其中做一些預處理的工作。
endDocument()
當文檔結束的時候,調用這個方法,可以在其中做一些善後的工作。
startElement(String namespaceURI, String localName,String qName, Attributes atts)
當讀到開始標簽的時候,會調用這個方法。namespaceURI就是命名空間,localName是不帶命名空間前綴的標簽名,qName是帶命名空間前綴的標簽名。通過atts可以得到所有的屬性名和相應的值。
endElement(String uri, String localName, String name)
在遇到結束標簽的時候,調用這個方法。
characters(char[] ch, int start, int length)
這個方法用來處理在XML文件中讀到的內容。例如:<high data="30"/>主要目的是獲取high標簽中的值。
第一個參數用於存放文件的內容,後面兩個參數是讀到的字元串在這個數組中的起始位置和長度,使用new String(ch,start,length)就可以獲取內容。
注意:
SAX的一個重要特點就是它的流式處理,當遇到一個標簽的時候,它並不會紀錄下之前所碰到的標簽,即在startElement()方法中,所有能夠知道的信息,就是標簽的名字和屬性,至於標簽的嵌套結構,上層標簽的名字,是否有子元屬等等其它與結構相關的信息,都是不知道的,都需要你的程序來完成。這使得SAX在編程處理上沒有DOM方便。
現在我們截取一段XML文件來做解析,其調用方法是這樣的:
<?xml version="1.0"?> ----------> startDocument()
<weather> ----------> startElement
<forecast_information> ----------> startElement
<city> ----------> startElement
beijing ----------> characters
</city> ----------> endElement
</forecast_information > ----------> endElement
</weather > ----------> endElement
文檔結束 ----------> endDocument()
SAX的解析步驟:
首先需要注意的是:
SAX還為其制定了一個Helper類:DefaultHandler它實現了ContentHandler這個介面,但是其所有的方法體都為空,在實現的時候,你只需要繼承這個類,然後重載相應的方法即可。
使用SAX解析XML文件一般有以下五個步驟:
1、創建一個SAXParserFactory對象;
2、調用SAXParserFactory中的newSAXParser方法創建一個SAXParser對象;
3、然後在調用SAXParser中的getXMLReader方法獲取一個XMLReader對象;
4、實例化一個DefaultHandler對象
5、連接事件源對象XMLReader到事件處理類DefaultHandler中
6、調用XMLReader的parse方法從輸入源中獲取到的xml數據
7、通過DefaultHandler返回我們需要的數據集合。
我們仍然來解析上述那個天氣預報的XML文件。
編寫代碼如下:
[java] view plain
mySAX.setOnClickListener(new Button.OnClickListener(){
@Override
public void onClick(View v) {
try{
String url = "http://www.google.com/ig/api?&weather=beijing";
DefaultHttpClient client = new DefaultHttpClient();
HttpUriRequest req = new HttpGet(url);
HttpResponse resp = client.execute(req);
HttpEntity ent = resp.getEntity();
InputStream stream = ent.getContent(); //將文件導入流,因此用InputStream
SAXParserFactory saxFactory = SAXParserFactory.newInstance(); //獲取一個對象
SAXParser saxParser = saxFactory.newSAXParser();//利用獲取到的對象創建一個解析器
XMLContentHandler handler = new XMLContentHandler();//設置defaultHandler
saxParser.parse(stream, handler);//進行解析
stream.close();//關閉流
/*XMLReader xmlReader = saxFactory.newSAXParser().getXMLReader(); //獲取一個XMLReader
xmlReader.setContentHandler(handler);
xmlReader.parse(new InputSource(stream));
stream.close();*/
}catch(Exception e){
e.printStackTrace();
}
}
});
}
public class XMLContentHandler extends DefaultHandler {
private static final String TAG = "XMLContentHandler";
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
Log.i(TAG, "解析內容:"+new String(ch,start,length));
}
@Override
public void endDocument() throws SAXException {
super.endDocument();
Log.i(TAG, "文檔解析完畢。");
}
@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
Log.i(TAG, localName+"解析完畢");
}
@Override
public void startDocument() throws SAXException {
Log.i(TAG, "開始解析... ...");
}
@Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
Log.i(TAG, "解析元素:"+localName);
if(localName.equals("high")){
Log.i(TAG, "解析元素:"+localName);
i++;
if(i==2){
highestTmp.setText(String.valueOf((Integer.parseInt(attributes.getValue(0))-32)*5/9));
}
}
}
}
上面的那段注釋:
[java] view plain
/*XMLReader xmlReader =saxFactory.newSAXParser().getXMLReader(); //獲取一個XMLReader
xmlReader.setContentHandler(handler);
xmlReader.parse(newInputSource(stream));
stream.close();*/
是用XMLReader來做解析的另外一種方法。效果是一樣的。這里可以傳流,也可以傳一個字元串,如下所示:是傳字元串。
[java] view plain
xmlReader.parse(new InputSource(new StringReader(xmlStr)));
PULL方式
除了可以使用 SAX和DOM解析XML文件,也可以使用Android內置的Pull解析器解析XML文件。 Pull解析器的運行方式與 SAX 解析器相似。它也是事件觸發的。Pull解析方式讓應用程序完全控制文檔該怎麼樣被解析。比如開始和結束元素事件,使用parser.next()可以進入下一個元素並觸發相應事件。通過Parser.getEventType()方法來取得事件的代碼值,解析是在開始時就完成了大部分處理。事件將作為數值代碼被發送,因此可以使用一個switch對感興趣的事件進行處理。
Pull解析是一個遍歷文檔的過程,每次調用next(),nextTag(), nextToken()和nextText()都會向前推進文檔,並使Parser停留在某些事件上面,但是不能倒退。然後把文檔設置給Parser。
Android中對Pull方法提供了支持的API,主要是
org.xmlpull.v1.XmlPullParser;
org.xmlpull.v1.XmlPullParserFactory;
二個類,其中主要使用的是XmlPullParser,XmlPullParserFactory是一個工廠,用於構建XmlPullParser對象。
應用程序通過調用XmlPullParser.next()等方法來產生Event,然後再處理Event。
我們仍然拿上述天氣預報的XML文件的一部分來做例子。
例如:需要解析的XML文件是:
[java] view plain
<forecast_conditions>
<day_of_week data="周三"/>
<low data="22"/>
<high data="29"/>
<icon data="/ig/images/weather/chance_of_rain.gif"/>
<condition data="可能有雨"/>
</forecast_conditions>
這部分XML文件中day_of_week,low,high等是TAG,data是ATTRIBUTEA。當然,如果有<></>夾在開始和結束符號之間的部分,則為TXET。
要想解析文檔先要構建一個XmlPullParser對象。
[java] view plain
final XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
factory.setNamespaceAware(true);
final XmlPullParser parser = factory.newPullParser();
parser.setInput(new StringReader("xmlStr");
這里的xmlStr就是上邊的XML文件。
此時,文檔剛被初始化,所以它應該位於文檔的開始,事件為START_DOCUMENT,可以通過XmlPullParser.getEventType()來獲取。然後調用next()會產生
START_TAG,這個事件告訴應用程序一個標簽已經開始了,調用getName()會返回" day_of_week ";若有TEXT,則再next()會產生TEXT事件,調用getText()會返回TEXT,由於此處沒有,所以再next(),會產生END_TAG,這個告訴你一個標簽已經處理完了,再next()直到最後處理完TAG,會產生END_DOCUMENT,它告訴你整個文檔已經處理完成了。除了next()外,nextToken()也可以使用,只不過它會返回更加詳細的事件,比如COMMENT, CDSECT, DOCDECL, ENTITY等等非常詳細的信息。如果程序得到比較底層的信息,可以用nextToken()來驅動並處理詳細的事件。需要注意一點的是TEXT事件是有可能返回空白的White Spaces比如換行符或空格等。
nextTag()--會忽略White Spaces,如果可以確定下一個是START_TAG或END_TAG,就可以調用nextTag()直接跳過去。通常它有二個用處:當START_TAG時,如果能確定這個TAG含有子TAG,那麼就可以調用nextTag()產生子標簽的START_TAG事件;當END_TAG時,如果確定不是文檔結尾,就可以調用nextTag()產生下一個標簽的START_TAG。在這二種情況下如果用next()會有TEXT事件,但返回的是換行符或空白符。
nextText()--只能在START_TAG時調用。當下一個元素是TEXT時,TEXT的內容會返回;當下一個元素是END_TAG時,也就是說這個標簽的內容為空,那麼空字串返回;這個方法返回後,Parser會停在END_TAG上。
小結一下,如果在一個XML文檔中我們只需要前面一部分數據,但是使用SAX方式或DOM方式會對整個文檔進行解析,盡管XML文檔中後面的大部分數據我們其實都不需要解析,因此這樣實際上就浪費了處理資源。使用PULL方式正合適。
當點擊三種方式的任何一個按鈕時,均能夠得到相同的結果