UWP開發入門(25)——通過Radio控制Bluetooth, WiFi_網頁設計公司

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

當全世界的人們隨著網路時代而改變向上時您還停留在『網站美醜不重要』的舊有思維嗎?機會是留給努力改變現況的人們,別再浪費一分一秒可以接觸商機的寶貴時間!

回顧寫了許久的UWP開發入門,竟然沒有講過通過Windows.Devices.Radios.Radio來控制Bluetooth和WiFi等功能的開關。也許是因為相關的API設計的簡單好用,以至於被我給忽略了。最近工作中有涉及這塊的內容,不妨一起來回顧下,順便看看一些新的發現。

在Windows 10以前,想要控制Bluetooth,WiFi等功能,那麻煩大了。得操作ManagementBaseObject,ManagementEventWatcher 等一系列WMI提供的API,寫出來的代碼又臭又長。其間還夾着複雜的WMI query字符串,十分難用。

升級到Windows 10后,我們通過Windows.Devices.Radios.Radio可以方便的獲取控制Bluetooth和WiFi的對象。

var radios = await Radio.GetRadiosAsync();
Bluetooth = radios.FirstOrDefault(r => r.Kind == RadioKind.Bluetooth);
WiFi = radios.FirstOrDefault(r => r.Kind == RadioKind.Bluetooth);

在拿到上面的Bluetooth和WiFi的Radio實例后,就可以通過

Public event TypedEventHandler<Radio, object> StateChanged;

來監聽Radio實例的狀態改變,可以說通過寥寥幾行代碼,就可以替代以往大量繁瑣的操作。

而設置Bluetooth和WiFi設備On/Off的狀態,也非常簡單。

public IAsyncOperation<RadioAccessStatus> SetStateAsync(RadioState value);

RadioState枚舉如同字面的意思:

    public enum RadioState
    {
        //
        // Summary:
        //     The radio state is unknown, or the radio is in a bad or uncontrollable state.
        Unknown = 0,
        //
        // Summary:
        //     The radio is powered on.
        On = 1,
        //
        // Summary:
        //     The radio is powered off.
        Off = 2,
        //
        // Summary:
        //     The radio is powered off and disabled by the device firmware or a hardware switch
        //     on the device.
        Disabled = 3
    }

這裏需要提一下的是,在第一次更改狀態前,UWP APP需要向用戶申請權限。

慢着慢着,貌似忘記給UWP APP向Windows要權限了,我們要編輯Package.aaxmanifest文件,在Capabilities節點加上DeviceCapability這一行才行。

  <Capabilities>
    <Capability Name="internetClient" />
    <DeviceCapability Name="radios"></DeviceCapability>
  </Capabilities>

 

這回運行起來,才真的可以操作Bluetooth和WiFi了。

是不是覺得幾行代碼就能寫出一個控制Bluetooth和WiFi的APP了?事實也確實如此。

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

透過資料庫的網站架設建置,建立公司的形象或購物系統,並提供最人性化的使用介面,讓使用者能即時接收到相關的資訊

如果人生只如初見那般美好,UWP的處境就不會如此難堪了。對於某軟提供了完善UWP API的功能,開發起來那是一個爽快。但要是沒有或是沒來得及提供,UWP就顯得頗為尷尬了。

我們不妨看下RadioKind的枚舉,很顯然如果想操作FM radio就得另尋他法。而MobileBoardband即Cellular也是從1703版本才開始得到支持。

那是不是意味這MobileBroadband就可以像Bluetooth和WiFi一樣通過

public static IAsyncOperation<IReadOnlyList<Radio>> GetRadiosAsync();

來獲取實例對象了,還真不是,欲知如何操作,且聽下回《UWP開發入門(26)——通過Radio控制Cellular》。

實際是我Sample code還沒整理好。所以分成了兩篇來寫。

有感日前MS Store里的網易雲音樂UWP也被替換成Win32版本,可嘆國產的UWP APP越來越少。某軟畫了個好餅,可惜不能讓人在Windows生態上通過UWP掙到錢。好技術生不逢時出不了頭,真是可惜。

同時也能感覺到某軟的妥協和進步,現如今的UWP,結合desktop extension以及desktop bridge技術。只要公司的APP能通過某軟的審核,功能方面已經無限接近傳統desktop APP了。可惜一個Windows平台做Win32和UWP兩個產品,燒的錢可不是小數目。總不能用愛發電吧。

希望Win7早日被淘汰,WinUI 3.0能進一步融合UWP和Win32。距離上一次某軟說要重振desktop開發已經過去蠻久了。

本篇提到的相關Sample code在GitHub:

https://github.com/manupstairs/UWPSamples/tree/master/UWPSamples/RadioDevice

 

 

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

※想知道最厲害的網頁設計公司嚨底家"!

RWD(響應式網頁設計)是透過瀏覽器的解析度來判斷要給使用者看到的樣貌

為什麼國產品牌SUV能贏合資品牌?你買車會選誰?_網頁設計

網頁設計最專業,超強功能平台可客製化

窩窩以「數位行銷」「品牌經營」「網站與應用程式」「印刷品設計」等四大主軸,為每一位客戶客製建立行銷脈絡及洞燭市場先機。

從是否引入全新車型,合資品牌內部便要經過長時間的項目討論。出於商業上的原因,合資品牌的外資方對於新車型的引入,是持極其謹慎的態度的。所以,儘管合資品牌的中方人員已經意識到這一問題,但往往也是處於干著急的情況,畢竟中方在大部分的情況下,是沒有獨立開發新車型的權力的。

根據乘聯會公布的數據显示,2016年上半年,國內SUV銷量共計391.5萬輛。而中國自主品牌以56.6%的絕對性優勢,成功稱霸了這個時下國內最為火熱的汽車細分市場。在上半年SUV銷量前10排名中,自主品牌共佔到了6個席位。這就不禁讓人有一個疑問:合資品牌SUV為什麼會一敗塗地?

SUV市場的火熱

是合資品牌做夢都沒有想到的

2003年,國內的SUV銷量僅為9.74萬輛,連如今哈弗H6半年的銷量都達不到。但十年過後的2013年,國內的SUV銷量迅速膨脹至266.13萬輛,堪稱是火箭式的增長。對於多年來一直注重發展轎車市場的合資品牌來說,SUV市場誇張式的增長以及市場規模的龐大程度一直是一件讓它們難以相信的事情。這種對市場形勢的誤判,為合資品牌在SUV市場上的糟糕市場表現埋下了深深的伏筆。

十個手指頭能數完的合資SUV

早在1994年的日內瓦車展上,豐田便發布了被譽為“城市SUV鼻祖”的SUV車型—RAV4。比越野車更時尚的外觀,比普通轎車能寬裕的空間,比轎車略為優秀的通過能力,從全世界的範圍來說,SUV都是一種具有深深吸引力的車型。但可惜的是,消費者對於SUV的追捧,並沒有讓合資品牌加深在SUV車型上的研發,特別是針對中國市場。

直至8年之後,也就是2002年,才有了第一款國產的合資SUV—東風本田CRV的出現。這8年間,竟然沒有一家合資品牌在中國市場推出一款SUV車型,這是一件如今讓人無法相信的事情。而即便有了第一款國產合資SUV的出現,但合資品牌對於中國的SVU市場依舊沒有太多的重視。即便是在中國汽車市場具有絕對品牌影響力的大眾汽車,把途觀引入國內生產的時間已經是2009年的事情。

自主品牌已經贏在了起跑線上

相反,不少的自主品牌已經在SUV真槍實彈地幹了起來。譬如,大家眾所周知的雙環汽車(沒錯,就是那家被本田告上法庭,還反坑本田1600萬元賠償的雙環汽車),在2004年便山寨本田的CRV,推出了大名鼎鼎的雙環SRV。而如今國內SUV的銷量冠軍—長城汽車,在2002年也依靠皮卡的平台基礎,生產出了自家的第一款SUV—長城賽弗。更不要說具有傳奇色彩,賣到南美市場的奇瑞瑞虎。所以說,從第一步棋開始,

※推薦評價好的iphone維修中心

擁有專業的維修技術團隊,同時聘請資深iphone手機維修專家,現場說明手機問題,快速修理,沒修好不收錢

合資品牌便已經輸在了起跑線上。

合資品牌龜速一樣的產品研發

意識到落後的合資品牌開始奮力直追,但要知道合資車企的內部運營遠沒有自主品牌靈活。從是否引入全新車型,合資品牌內部便要經過長時間的項目討論。出於商業上的原因,合資品牌的外資方對於新車型的引入,是持極其謹慎的態度的。

所以,儘管合資品牌的中方人員已經意識到這一問題,但往往也是處於干著急的情況,畢竟中方在大部分的情況下,是沒有獨立開發新車型的權力的。在確定要引入全新的SUV車型以後,還要進行一定的本土化適配、車輛測試等長時間的流程。比如國內著名的合資品牌–X安X特的一款SUV,整車試驗的流程,便有4000多項。所以,目前合資品牌的SUV研發以及生產的速度,完全可以用緩慢去形容。

自主品牌的地頭蛇優勢

但相比合資品牌,自主品牌完全就是地頭蛇一般的靈活。依靠國外成熟的SUV進行逆向研發,大大縮小研發所需的研發。再通過三菱、愛信等成熟的零部件供應商,完成最核心的動力組裝。當然,自主品牌不但在產品的設計、製造有着相當的速度優勢。在推出全新車型的決策上,同樣具有優勢。譬如國內的某知名的自主品牌,自今年3月推出緊湊型SUV以來,依次又在5月、8月,相繼發布了兩款全新的緊湊型SUV。新品推出的速度之快,不僅讓業內人士感到詫異,消費者同樣感到詫異。

神一般的速度

更著名的,如漢騰汽車,今年的5月份才宣布完成品牌的發布。僅僅過了4月的時候,旗下的首款緊湊型SUV—漢騰X7便騰空出世。從品牌的構建,到產品的設計研發,再到生產線的投產,漢騰僅用了4個月的時間。這幾乎是世界上任何一家合資品牌都無法完成的事情。

不過,有部分的自主品牌存在過於追求投產速度,希望更早地享受到SUV市場的紅利,而在生產、製造環節存在把控不嚴的情況。也正是這個原因,談到自主SUV,許多的消費者第一時間都會拋出諸如“耐用性怎麼樣?”“小問題多不多”的疑問。這也是這種運作的靈活性給自主品牌帶來的負面影響。

不過儘管合資品牌SUV在產品的投放速度不如自主品牌,但根據相關的數據显示,截止2015年底,17萬以上區間的SUV市場,98%的市場份額依然由合資品牌所垄斷。而自主品牌主要活躍在中端(13-17萬)、次中端(9-13萬)、低端(9萬以下)等SUV市場。也就是說,儘管自主品牌佔據了SUV的大部分市場份額,但更具有盈利能力的高端SUV市場依然是合資品牌的天下。如何在保障銷量漂亮的同時,改善產品的質量,以及提高自身品牌在高端SUV市場的影響力,是目前自主品牌亟待需要思考的問題。

本站聲明:網站內容來源於http://www.auto6s.com/,如有侵權,請聯繫我們,我們將及時處理

台北網頁設計公司這麼多該如何選擇?

網動是一群專業、熱情、向前行的工作團隊,我們擁有靈活的組織與溝通的能力,能傾聽客戶聲音,激發創意的火花,呈現完美的作品

性能再升級 斯巴魯BRZ GT官圖曝光_貨運

※評比南投搬家公司費用收費行情懶人包大公開

搬家價格與搬家費用透明合理,不亂收費。本公司提供下列三種搬家計費方案,由資深專業組長到府估價,替客戶量身規劃選擇最經濟節省的計費方式

新款的斯巴魯BRZ GT車型是基於此前發布的新款BRZ打造的,外觀相比舊款車型的變化包括採用了經過重新設計的前保險杠,並換裝全LED頭尾燈組等。據了解到,BRZ GT將作為日規BRZ的高配車型銷售,其相比普通版BRZ增配了小型擾流板、新樣式的17英寸多輻式輪圈、Brembo布雷博制動系統以及SACHS品牌減振器等。

日前,斯巴魯發布了一組新款BRZ GT車型的官圖,新車將作為日規BRZ車系的高配車型進行銷售。其中手動擋車型起售價格為331.56萬日元(約合人民幣21.53萬元),自動擋車型起售價格為337.5萬日元(約合人民幣21.92萬元)。

新款的斯巴魯BRZ GT車型是基於此前發布的新款BRZ打造的,

※回頭車貨運收費標準

宇安交通關係企業,自成立迄今,即秉持著「以誠待人」、「以實處事」的企業信念

外觀相比舊款車型的變化包括採用了經過重新設計的前保險杠,並換裝全LED頭尾燈組等。據了解到,BRZ GT將作為日規BRZ的高配車型銷售,其相比普通版BRZ增配了小型擾流板、新樣式的17英寸多輻式輪圈、Brembo布雷博制動系統以及SACHS品牌減振器等。

內飾方面,除新的多功能行車電腦显示屏和多功能方向盤外,新款BRZ GT還增加了由Alcantara搭配真皮材料包裹的運動座椅等。

動力部分,新款BRZ GT將沿用FA20型2.0L水平對置自然吸氣發動機,其最大輸出功率208馬力,峰值扭矩211牛·米,與新款BRZ的普通版車型一致。傳動系統匹配的依然是6速手動及6速手自一體變速箱。本站聲明:網站內容來源於http://www.auto6s.com/,如有侵權,請聯繫我們,我們將及時處理

※智慧手機時代的來臨,RWD網頁設計為架站首選

網動結合了許多網際網路業界的菁英共同研發簡單易操作的架站工具,及時性的更新,為客戶創造出更多的網路商機。

青銅食器 鐘鳴鼎食_網頁設計公司_網頁設計公司

※自行創業缺乏曝光? 網頁設計幫您第一時間規劃公司的形象門面

網站的第一印象網頁設計,決定了客戶是否繼續瀏覽的意願。台北網動廣告製作的RWD網頁設計,採用精簡與質感的CSS語法,提升企業的專業形象與簡約舒適的瀏覽體驗,讓瀏覽者第一眼就愛上它。

中國古代青銅食器起源甚早,源遠流長,經夏商周三代而臻於隆盛。河南偃師二里頭遺址,就曾出土一件距今3500多年的平底圓鼎。商代之後,青銅食器逐漸作為主角登上歷史舞台。現藏於中國國家博物館的杜嶺方鼎,就是目前所見商代前期形體最大的青銅鼎。商代後期也就是殷墟時期,青銅食器開始以特定的組合方式出現,不但規模數量大幅度提升,而且面貌各異,精品迭出。尤其是大名鼎鼎的後母戊鼎(圖③),高133厘米,口長110厘米,口寬79厘米,重達832.84公斤,造型雄偉,氣勢恢宏,1939年一經發現就備受矚目,如今已成為中國國家博物館的代表性珍藏之一。

  青銅食器按其功能可以細分為烹煮器、盛食器、挹取器、切肉器等,其中烹煮盛食器種類數量最多,像鼎、簋(guǐ)、鬲(lì)、豆等都是後人耳熟能詳的門類。

  烹煮器:鼎、鬲、甗

  烹煮器主要有鼎、鬲、甗(yǎn)。

  鼎是殷周青銅器中數量最多、地位最重要的器類,主要用來烹煮肉食。商周墓葬出土的銅鼎內往往存有牛、羊、豬、魚、雞等各種動物遺骨,考古資料也證實了鼎的確切用途。

  鬲的功能和鼎相似,也是烹煮肉食的(圖①:西周戜(dié)伯鬲)。這點由東週隨葬陶鬲中發現有豚骨可推知。

  甗的上半部分為甑(zèng),下半部分為鬲(也有作鼎形的),中間有箄(bǐ),箄上有孔,甑置食物,鬲盛水,下舉火煮水,以蒸汽加熱食物,作用同於現在的蒸鍋。著名的殷墟婦好墓出土的三聯甗(圖⑥),由三個甑和一個長方形案狀的鬲組成,案上有三個圈形孔灶,用來承置甑體,不僅放置穩當,而且一次能加溫蒸好三份飯,構思非常奇巧。

  盛食器:簋、盨、簠、敦、豆

  盛食器則主要包括簋、盨(xǔ)(圖⑦:西周魯司徒伯吳盨)、簠(fǔ)(圖④:春秋捲曲夔紋簠)、敦(duì)、豆,主要用於盛放黍稷稻粱等主食。豆還可以盛放肉醬、肉汁、醬菜等食品,相當於今天的菜盤(圖②:戰國嵌紅銅獸紋豆)。

 挹取器匕、切肉器俎

※如何讓商品強力曝光呢? 網頁設計公司幫您建置最吸引人的網站,提高曝光率!

以設計的實用美學觀點,規劃出舒適、美觀的視覺畫面,有效提昇使用者的心理期待,營造出輕鬆、愉悅的網站瀏覽體驗。

  挹取器指的是匕,多放置於鼎、鬲、甗等器中,主要用來取肉食、飯食。切肉器指的是俎,是切肉用的几案,俎面上多有鏤孔,便於在切肉時擠壓出的肉汁滲流。(圖⑤:春秋王子臣俎)從功能上看,這些食器之間的關係十分密切,比如鼎、俎、匕就是一套完整處理肉食的裝備,用匕將肉從鼎中取出,放置在俎上切分,用於祭祀和宴饗。

  西周以降,週人重食,鼎簋等食器進而升級成為青銅禮器的核心,鼎為奇數、簋為偶數,形成“列鼎”的器用制度,即所謂“禮祭,天子九鼎,諸侯七,卿大夫五,元士三也”(《公羊傳》桓公二年何休注),某些情況下盨、簠也可以代替簋的位置。這種青銅食器禮器化的場景,還被頻頻載入詩歌。《詩經·週頌·絲衣》雲“鼐(nài)鼎及鼒(zī),兕(sì,古代犀牛一類的獸名)觥(gōng)其觩(qiú)”,描繪的正是周王祭祀行禮時的盛況,鼐指大鼎,鼒為小鼎,“鼐鼎及鼒”的意思就是尺寸大小有等差的一套鼎。考古發現也證實了這一描述。山西曲沃北趙晉侯墓地八號墓出土有五件晉侯蘇鼎,它們造型、紋樣、銘文全部相同,僅大小尺寸呈遞減陳設,這組晉侯蘇列鼎顯然是《絲衣》這首古詩生動的註腳。

  由此看來,古代中國青銅食器不僅單純作為實用器,而且被賦予了特殊的使命,彰顯的是尊卑貴賤的社會地位,是等級身份和行為規範的標誌,由此形成獨特的禮器體系,正所謂“藏禮於器”。

  例如1978年陝西扶風齊村出土的簋,體量巨大,通高59厘米,口徑43厘米,腹深23厘米,重達60公斤,是存世商周青銅簋中最大的一件,而它的主人正是赫赫有名的周厲王。《詩經·小雅·伐木》雲“於(wū)粲灑埽,陳饋八簋”,說的是天子九鼎八簋,通過這一件器物,我們就可以遙想西周天子氣像是何等的恢弘磅礴。西周青銅食器高度發達,還出現了很多新的器型,如簠、盨等。現藏於中國國家博物館的內史盨,便是年代最早的青銅盨之一。值得一提的是,中國國家博物館館藏名器西周大盂鼎,鼎內鑄有銘文291字,其中一段銘文記載的是商人因縱酒誤國,以致亡國的史實,使我們不由聯想到商紂王“以酒為池”的惡跡,這也是目前發現的唯一有關商人縱酒亡國的實物證據。

  東週時期,列國諸侯紛爭不休,青銅文化呈現出鮮明的地域差異,青銅食器也不例外,顯得爭奇鬥豔。

  1978年河南淅川下寺二號墓出土的七件王子午鼎是一套列鼎,器主是楚莊王之子王子午,其中最大的一件通高67.4厘米、口徑66厘米、重110.4公斤,出土時還附有一銅匕,是挹取鼎中之肉的工具。這種平底束腰形制的鼎,是東週時期楚文化的代表,現藏於中國國家博物館。

  長江下游乃至廣東、廣西等南方地區,則流行一種被稱作“越式鼎”的三足細瘦外撇的銅鼎,極具地方特色。至於河北、北京一帶,則常見一種世稱“燕式豆”的銅豆,同樣別具一格。由此可見,東週時期銅豆的地位上升,常與鼎作為固定組合出現。

  歷經數千年的滄桑,那些觥籌交錯的場面早已湮沒於歷史深處,但留存至今的一件件青銅食器足以讓我們浮想聯翩,去回味那個鐘鳴鼎食的時代。毋庸置疑,這些承載著中華文明基因的青銅食器,早已脫離了其本身的實用意義,演變為國家政權、社稷秩序的象徵,進而又演變為中華文化的象徵性符號,並將一代一代傳承下去。

  (作者為中國國家博物館館長,本報記者王珏整理。圖片由國家博物館提供)

  版式設計:沈亦伶

本站聲明:網站內容來http://www.societynews.cn/html/wh/fq/,如有侵權,請聯繫我們,我們將及時處理

※綠能、環保無空污,成為電動車最新代名詞,目前市場使用率逐漸普及化

台中景泰電動車行只是一個單純的理由,將來台灣的環境,出門可以自由放心的深呼吸,讓空氣回歸自然的乾淨,減少污染,留給我們下一代有好品質無空污的優質環境

南澗跳菜為節日添彩_網頁設計公司網頁設計公司,網頁設計,台北網頁設計

※想知道最厲害的網頁設計公司嚨底家"!

RWD(響應式網頁設計)是透過瀏覽器的解析度來判斷要給使用者看到的樣貌

  跳菜之猴子嬉鬧。
  適志宏攝

  跳菜之空手疊塔。
  適志宏攝

  “南澗跳菜”又被叫做“抬菜舞”或者“捧盤舞”,將舞蹈、音樂與雜技、飲食融為一體,是雲南南澗彝族自治縣群眾流傳已久的習俗。彝族跳菜2008年被列入第二批國家級非物質文化遺產名錄。

  “跳菜有‘宴席跳菜’和‘表演跳菜’兩種形式。‘表演跳菜’主要是在舞台上,菜不是真菜,主要是通過舞蹈和音樂來表現。我們日常做的主要是‘宴席跳菜’,抬的是真菜,這是每一次宴席慶典的必備儀式,往往是我們接待賓客的最高禮節。”跳菜隊隊長張玉香說。

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

透過資料庫的網站架設建置,建立公司的形象或購物系統,並提供最人性化的使用介面,讓使用者能即時接收到相關的資訊

  音樂聲響,張玉香和另一位隊員從廚房跳出,一人在前面引舞護菜,另一人在後面舞着托盤,兩人踏着節拍登場。輕快敏捷的舞步,幽默逗人的扮相,混着激昂的嗩吶聲,引起現場陣陣歡笑。

  “口功送菜”和“空中送菜”是張玉香的拿手絕技。在村裡跳菜,還有許多套路,張玉香說:“不管採用什麼樣的形式,最關鍵的就是保證把這些寓意吉祥的菜平平穩穩地上到桌上。”

  在舞姿的變化中,跳菜隊員們利落地把菜擺放到桌上。不僅跳舞有講究,擺菜的形式也很講究。“梅花形是我們常用的擺法,等這些農家菜上齊了,大家就可以一起享受這些美味佳肴啦。”張玉香說。

  版式設計:蔡華偉 張丹峰

本站聲明:網站內容來http://www.societynews.cn/html/wh/fq/,如有侵權,請聯繫我們,我們將及時處理

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

當全世界的人們隨著網路時代而改變向上時您還停留在『網站美醜不重要』的舊有思維嗎?機會是留給努力改變現況的人們,別再浪費一分一秒可以接觸商機的寶貴時間!

三秦大地看賀歲_包裝設計

※產品缺大量曝光嗎?你需要的是一流包裝設計!

窩窩觸角包含自媒體、自有平台及其他國家營銷業務等,多角化經營並具有國際觀的永續理念。

張燈結綵辭舊歲,龍騰虎躍鬧新春。三秦大地上,拜年賀歲的“傳統”與“現代”,正紅紅火火地交織相融。

一聲腰鼓、一個燈籠、一條視頻……這個春節里,陝北大地上,拜年,有老傳統、有新氣象,甚至有了國際范兒!

一聲腰鼓·記憶

一入臘月,延安的川梁溝峁里,年味漸濃。

在陝北過年,蜿蜒山徑上,秧歌隊、腰鼓陣已成為陝北人最溫暖的春節記憶。

“秧歌、腰鼓拜大年,就是‘沿門子’,就圖個紅火喜慶。”說起“沿門子”傳統,64歲的山王河村民張征侃侃而談,“正月敲敲打打,能保四季平安。”

很多年前,張征還是小伙子時,也曾是拜年的“絕對主力”。鏘鏘鑼鼓聲中,男男女女穿紅戴綠,娃娃們一個個小臉凍得通紅。秧歌、腰鼓在黃土地上奔騰開來,盡顯新年新氣象。

春去秋來,黃土地里“沿門子”,祝福了歲歲年年。一轉眼,“小娃娃”張軍明已過不惑之年,成了山王河村支書。30年時空流轉,村莊也“換了人間”:2萬多畝退耕地褪去黃沙、披上綠衣,經濟林木漫山遍野。富餘勞力搞起了“黃土風”腰鼓隊,還跨出國門,去過秘魯、新西蘭演出。

一個燈籠·傳承

西安東郊白鹿原上,82歲的王學坤,編了一輩子竹燈籠。握一把篾刀、坐一個馬扎,老人與燈籠結緣了一輩子,看慣了原上過年的喜慶與熱鬧。

灞橋孫家溝村的王學坤和侄孫王少波,春節前夕在院子的柿子樹下,忙着趕製竹燈籠。破竹、划篾、編織、收口、糊紙……十幾道工序下來,一個個精巧玲瓏的“火葫蘆”竹燈,就在爺孫倆手裡誕生了。

“在關中民俗里,‘外甥拜年,舅舅送燈’。火紅的燈籠,是小娃娃正月里最期盼的禮物。”今年40歲的王少波仍記得,兒時去舅家拜大年的場景。“大年初二進了門,挨個給姥爺、姥姥、舅舅磕頭。紅包裝兜里,心裏還盼着打燈籠哩。”

※自行創業缺乏曝光? 網頁設計幫您第一時間規劃公司的形象門面

網動廣告出品的網頁設計,採用精簡與質感的CSS語法,提升企業的專業形象與簡約舒適的瀏覽體驗,讓瀏覽者第一眼就愛上她。

白鹿原上,歲歲拜年,輩輩送燈。見證這一幕幕溫馨場景的竹編燈籠,已有300多年歷史。若論“原上編燈第一人”,當屬“非遺”傳承人王學坤;而跟爺爺學藝的王少波,已是王家的第九代傳人。

時代變遷,如今白鹿原上,建起了白鹿倉景區。王少波腦子活,在景區的“非遺”街上,開了一家“竹編燈籠”鋪子,平日里專攻編燈技藝。

王少波肯琢磨,要給老技藝融入新創意。端詳店裡的小物件兒,“燈籠檯燈”最有設計感,“燈籠花籃”工藝巧,成為年輕人拜年賀歲的時髦禮物……

“時代變,燈籠變,白鹿原也在變。”王少波十分感慨,“唯有這竹燈里藏着的拜年祝福,從未改變過。”

一條視頻·新潮

相機、自拍桿、三腳架……趁着飛曼谷的航班還沒到,李希梅又檢查了一遍行李。滿懷憧憬的旅途中,有個“重頭戲”——給家裡老人錄拜年視頻,送上異國他鄉美美的祝福。

前兩年,李希梅和丈夫結婚,定居西安。前陣兒剛入冬,身邊好幾個姐妹盤算着春節出國游,聽得多了,小兩口也動了心思。

臘月底出發前,夫妻倆回了趟渭南老家。“趕不上除夕,就提前給爺爺奶奶拜個年。”

爺爺奶奶,是李希梅最大的牽挂。前些年,她在美國留學時,每逢除夕夜,都惦記着“叮咚作響”彈出消息的家裡社交群。視頻群聊一開,先給長輩拜年。爺爺奶奶挺新潮,學會了發紅包;一幫小輩兒一擁而上,紅包個個“秒光”。

“每次放假回國,我都把自己的留學生活講給爺爺奶奶聽。”李希梅愛攝影,圖書館里的壁畫、海邊衝浪的年輕人、給美國室友做的火鍋……“爺爺奶奶年紀大了,但對外面世界的嚮往,一點兒都不少。”

如今,老人出國不方便,李希梅便帶上相機,用鏡頭記錄旅程。“我還想邀請幾位華人店家,站在鏡頭前,用中文送上新春祝福。”李希梅春節時還製作洋溢着泰國風情的拜年視頻,“發回去,爺爺奶奶肯定喜歡!”

“新年新氣象,新人新玩法。”李希梅笑言,“傳統中國年,也有國際范兒!”

本站聲明:網站內容來http://www.societynews.cn/html/wh/fq/,如有侵權,請聯繫我們,我們將及時處理

南投搬家公司費用需注意的眉眉角角,別等搬了再說!

上新台中搬家公司提供您一套專業有效率且人性化的辦公室搬遷、公司行號搬家及工廠遷廠的搬家服務

Sony Mobile 新旗艦 Xperia 1 III 爆料規格曝光:將搭載 S888 處理器、4K HDR 螢幕亮度提升_網頁設計

網頁設計最專業,超強功能平台可客製化

窩窩以「數位行銷」「品牌經營」「網站與應用程式」「印刷品設計」等四大主軸,為每一位客戶客製建立行銷脈絡及洞燭市場先機。

在首款搭載高通 Snapdragon 888 處理器的小米11 推出後,接下來在 2021 年包括華碩、黑鯊、聯想、LG、魅族、motorola、nubia、realme、OnePlus、OPPO、Sharp、vivo 與 ZTE 都確定將成為首批搭載的的手機品牌。而近期網傳 Sony Mobile  接下來的 Xperia 1 系列新旗艦 Xperia 1 III 也可能會搭載此處理器。

▲示意圖,圖為 Xperia 1 II

Sony Mobile 新旗艦 Xperia 1 III 爆料規格曝光:將搭載 S888 處理器、4K HDR 螢幕亮度提升

Sony Mobile 今年在台灣推出包括 Xperia 1 II 以及 Xperia 5 II 兩款旗艦級手機,而根據往年在 MWC(Mobile World Congress)也都會發表新機。然而受到疫情影響,接下來在 2021 年也還有許多變數。不過最近在 Twitter 也有人開始爆料 Xperia 1 系列下一代旗艦新機 Xperia 1 III(暫稱)的規格。

▲示意圖,圖為 Xperia 1 II

爆料指出 Xperia 1 III 將一樣採用 6.5 吋 4K OLED HDR 螢幕,不過螢幕亮度部分將比起 Xperia 1 II 提升 15% 。硬體規格方面,也機搭載高通 Snapdragon 888  5G 處理器、配備 8GB RAM 和 256GB ROM 。指紋辨識也延續採用側邊指紋辨識的方式,全機也支持 IP65/IP68 防塵防水等級。

▲示意圖,圖為 Xperia 1 II

而爆料尚未提到 Sony 一直以來強調的相機拍攝功能,若沒意外這次應繼續和蔡司認證的鏡頭,在相機鏡頭搭配、拍攝穩定性、夜拍方面進行升級。

▲示意圖,圖為 Xperia 1 II

不過爆料則有提到 Xperia 1 III 可能的售價,傳聞為 1,199 美元起(約合新台幣 33,770 元)。

▲圖片來源:Anthony (Twitter/@TheGalox_)

消息來源:Anthony (Twitter/@TheGalox_)

台北網頁設計公司這麼多該如何選擇?

網動是一群專業、熱情、向前行的工作團隊,我們擁有靈活的組織與溝通的能力,能傾聽客戶聲音,激發創意的火花,呈現完美的作品

延伸閱讀:
realme 7 5G 開箱動手玩|天璣 800U 處理器、5G+5G 雙卡雙待、120Hz 更新率螢幕、5000mAh大電量與 30W Dart 閃充,萬元內 5G 超值選擇

小米11 Pro 傳聞規格首次曝光:預計 2021 上半年推出, Redmi K11 將為同期最便宜 S888 旗艦新機之一

您也許會喜歡:

【推爆】終身$0月租 打電話只要1元/分

立達合法徵信社-讓您安心的選擇

※推薦評價好的iphone維修中心

擁有專業的維修技術團隊,同時聘請資深iphone手機維修專家,現場說明手機問題,快速修理,沒修好不收錢

全台區間測速路段懶人包_貨運

※評比南投搬家公司費用收費行情懶人包大公開

搬家價格與搬家費用透明合理,不亂收費。本公司提供下列三種搬家計費方案,由資深專業組長到府估價,替客戶量身規劃選擇最經濟節省的計費方式

今年上半年因省道台61線西濱公路彰化段區間測速發生爭議後,全台區間測速裝置大都多停用。經經濟部標準檢驗局訂定區間平均速率裝置檢定檢查技術規範後,警方將在2021年元月起陸續送檢37處裝置,待通過後就會加入執法。由於先前實施區間測速路段的超速罰單大增,倍增的區間測速路段上路後恐將成習慣飆速的汽車及機車車主荷包大失血。

什麼是【區間測速】? 超速會罰多少? 哪些路段將實施區間測速呢? 以下作一整理與說明:

掌握最新電信資費訊息,請加入小丰子3C俱樂部粉絲頁!

小丰子3C俱樂部

 

過去警察取締超速,大都採用固定式超速照相機,導致不少習慣超速開車的人都是快到固定式超速照相機地點才減速。為降低超速肇事,台灣警方參考國外做法自民國107年於新北市萬里隧道啟用【區間測速】,上路2年來共有18處區間測速裝置陸續加入執法,對於減少違規及降低交通事故發生有顯著成效。今年上半年因省道台61線西濱公路彰化段區間測速發生爭議而暫停後,在「區間平均速率裝置檢定檢查技術規範」110年元旦上路,警方將在全台裝置37處【區間測速】設施,陸續加入執法,多數路段最快2021年2月將重啟區間測速。以下是區間測速規定與目前全台預定實施路段:

 

1.區間測速規定:

「區間平均速率」指車輛行經某路段特定兩點之間(距離固定),除以所行駛的時間,即為平均速率。現行「雷達測速」也是偵測車輛在雷達波特定範圍內移動距離與時間差的關係計算車速(只是距離很短),一般認定是定點的測速,實際上也算是區間平均速率。
區間平均速率執法(簡稱區間測速),由點延伸為線,可大幅增加速率控制的有效範圍,除可抑制瞬間超速行為外,重點特色在於可減少車輛間行駛速度的差異,達到控制車行速度趨於穩定的效果,預期將會更有助減少事故發生。

 

區間測速大都使用在封閉或半封閉路段,且以常違規或易肇事的路段為主,實施區間測速的路段會設置「警52」警告牌面,一般道路設於起點前方100-300公尺(高快速公路為300-1000公尺),附牌文字為「前方區間測速長度○公里」。

 

在實施測速路段內必須依速限規定行駛,因速率係以平均值認定,故偶然不慎超速應不至於立刻構成違規,後續再注意減速即可,亦即存有補救之機會(固定桿則無)。以下是以台北市自強隧道通過的秒數換算車速。

 

※回頭車貨運收費標準

宇安交通關係企業,自成立迄今,即秉持著「以誠待人」、「以實處事」的企業信念

行經區間測速路段若超速,將依行駛道路種類限速規定與透過經過時間換算的車速加以罰款。若是行駛快速道路超速逾10公里(時速101公里、通過時間約187秒)汽車罰緩至少3000元以上、6000元以下。汽、機車行駛限速50公里路段,時速60公里以上開罰,採累進制罰款,機車超速至少1200元、汽車超速至少1600元,各式車輛超速100公里以上均罰款2萬4千元,車輛超速愈高、罰款愈多。不管汽車或機車只要超速,就會收到以下超速照片與罰單通知。

 

2.區間測速實施路段:

目前警方將陸續在宜蘭縣、台北市、新北市、桃園市、苗栗縣、台中市、彰化縣、 高雄市、屏東縣、台東縣、花蓮縣..等37處路段設置區間測速。
以下區間測速資訊僅供參考,實際路段以交通警察局公布為準:

 PS: *苗栗兩路段夜間8時至隔日6時降為50公里

 

其中,北宜公路全路段被分成八路段實施區間測速,被網友喻為【區間測速大Boss】!

 

因應【區間測速】實施,目前已有區間測速超警示APP可以下載。不過,版主尚未實測過該APP,實際效果為何不得而知就是。

 

您也許會喜歡:

【推爆】終身$0月租 打電話只要1元/分

立達合法徵信社-讓您安心的選擇

※智慧手機時代的來臨,RWD網頁設計為架站首選

網動結合了許多網際網路業界的菁英共同研發簡單易操作的架站工具,及時性的更新,為客戶創造出更多的網路商機。

一篇有趣的負載均衡算法實現_網頁設計公司

※自行創業缺乏曝光? 網頁設計幫您第一時間規劃公司的形象門面

網站的第一印象網頁設計,決定了客戶是否繼續瀏覽的意願。台北網動廣告製作的RWD網頁設計,採用精簡與質感的CSS語法,提升企業的專業形象與簡約舒適的瀏覽體驗,讓瀏覽者第一眼就愛上它。

文章已經收錄在 Github.com/niumoo/JavaNotes ,更有 Java 程序員所需要掌握的核心知識,歡迎Star和指教。
歡迎關注我的公眾號,文章每周更新。

負載平衡(Load balancing)是一種在多個計算機(網絡、CPU、磁盤)之間均勻分配資源,以提高資源利用的技術。使用負載均衡可以最大化服務吞吐量,可能最小化響應時間,同時由於使用負載均衡時,會使用多個服務器節點代單點服務,也提高了服務的可用性。

負載均衡的實現可以軟件可以硬件,硬件如大名鼎鼎的 F5 負載均衡設備,軟件如 NGINX 中的負載均衡實現,又如 Springcloud Ribbon 組件中的負載均衡實現。

如果看到這裏你還不知道負載均衡是幹嘛的,那麼只能放一張圖了,畢竟沒圖說個啥。

負載均衡要做到在多次請求下,每台服務器被請求的次數大致相同。但是實際生產中,可能每台機器的性能不同,我們會希望性能好的機器承擔的請求更多一些,這也是正常需求。

如果這樣說下來你看不懂,那我就再舉個例子好了,一排可愛的小熊(服務器)站好。

這時有人(用戶)要過來打臉(請求訪問)。

那麼怎麼樣我們才能讓這每一個可愛的小熊被打的次數大致相同呢?

又或者熊 4 比較胖,抗擊打能力是別人的兩倍,我們怎麼提高熊 4 被打的次數也是別人的兩倍呢?

又或者每次出手的力度不同,有重有輕,恰巧熊 4 總是承受這種大力度啪啪打臉,熊 4 即將不省熊事,還要繼續打它嗎?

這些都是值的思考的問題。

說了那麼多,口乾舌燥,我雙手已經饑渴難耐了,迫不及待的想要擼起代碼了。

1. 隨機訪問

上面說了,為了負載均衡,我們必須保證多次出手后,熊 1 到熊 4 被打次數均衡。比如使用隨機訪問法,根據數學上的概率論,隨機出手次數越多,每隻熊被打的次數就會越相近。代碼實現也比較簡單,使用一個隨機數,隨機訪問一個就可以了。

/** 服務器列表 */
private static List<String> serverList = new ArrayList<>();
static {
    serverList.add("192.168.1.2");
    serverList.add("192.168.1.3");
    serverList.add("192.168.1.4");
    serverList.add("192.168.1.5");
}

/**
 * 隨機路由算法
 */
public static String random() {
    // 複製遍歷用的集合,防止操作中集合有變更
    List<String> tempList = new ArrayList<>(serverList.size());
    tempList.addAll(serverList);
    // 隨機數隨機訪問
    int randomInt = new Random().nextInt(tempList.size());
    return tempList.get(randomInt);
}

因為使用了非線程安全的集合,所以在訪問操作時操作的是集合的拷貝,下面幾種輪詢方式中也是這種思想。

寫一個模擬請求方法,請求10w次,記錄請求結果。

※綠能、環保無空污,成為電動車最新代名詞,目前市場使用率逐漸普及化

台中景泰電動車行只是一個單純的理由,將來台灣的環境,出門可以自由放心的深呼吸,讓空氣回歸自然的乾淨,減少污染,留給我們下一代有好品質無空污的優質環境

public static void main(String[] args) {
    HashMap<String, Integer> serverMap = new HashMap<>();
    for (int i = 0; i < 20000; i++) {
        String server = random();
        Integer count = serverMap.get(server);
        if (count == null) {
            count = 1;
        } else {
            count++;
        }
        // 記錄
        serverMap.put(server, count);
    }
    // 路由總體結果
    for (Map.Entry<String, Integer> entry : serverMap.entrySet()) {
        System.out.println("IP:" + entry.getKey() + ",次數:" + entry.getValue());
    }
}

運行得到請求結果。

IP:192.168.1.3,次數:24979
IP:192.168.1.2,次數:24896
IP:192.168.1.5,次數:25043
IP:192.168.1.4,次數:25082

每台服務器被訪問的次數都趨近於 2.5w,有點負載均衡的意思。但是隨機畢竟是隨機,是不能保證訪問次數絕對均勻的。

2. 輪詢訪問

輪詢訪問就簡單多了,拿上面的熊1到熊4來說,我們一個接一個的啪啪 – 打臉,熊1打完打熊2,熊2打完打熊3,熊4打完打熊1,最終也是實現了被打均衡。但是保證均勻總是要付出代價的,隨機訪問中需要隨機,輪詢訪問中需要什麼來保證輪詢呢?

/** 服務器列表 */
private static List<String> serverList = new ArrayList<>();
static {
    serverList.add("192.168.1.2");
    serverList.add("192.168.1.3");
    serverList.add("192.168.1.4");
    serverList.add("192.168.1.5");
}
private static Integer index = 0;

/**
 * 隨機路由算法
 */
public static String randomOneByOne() {
    // 複製遍歷用的集合,防止操作中集合有變更
    List<String> tempList = new ArrayList<>(serverList.size());
    tempList.addAll(serverList);
    String server = "";
    synchronized (index) {
        index++;
        if (index == tempList.size()) {
            index = 0;
        }
        server = tempList.get(index);;
    }
    return server;
}

由代碼里可以看出來,為了保證輪詢,必須記錄上次訪問的位置,為了讓在併發情況下不出現問題,還必須在使用位置記錄時進行加鎖,很明顯這種互斥鎖增加了性能開銷。

依舊使用上面的測試代碼測試10w次請求負載情況。

IP:192.168.1.3,次數:25000
IP:192.168.1.2,次數:25000
IP:192.168.1.5,次數:25000
IP:192.168.1.4,次數:25000

3. 輪詢加權

上面演示了輪詢方式,還記的一開始提出的熊4比較胖抗擊打能力強,可以承受別人2倍的挨打次數嘛?上面兩種方式都沒有體現出來熊 4 的這個特點,熊 4 竊喜,不痛不癢。但是熊 1 到 熊 3 已經在崩潰的邊緣,不行,我們必須要讓胖着多打,能者多勞,提高整體性能。

/** 服務器列表 */
private static HashMap<String, Integer> serverMap = new HashMap<>();
static {
    serverMap.put("192.168.1.2", 2);
    serverMap.put("192.168.1.3", 2);
    serverMap.put("192.168.1.4", 2);
    serverMap.put("192.168.1.5", 4);
}
private static Integer index = 0;

/**
 * 加權路由算法
 */
public static String oneByOneWithWeight() {
    List<String> tempList = new ArrayList();
    HashMap<String, Integer> tempMap = new HashMap<>();
    tempMap.putAll(serverMap);
    for (String key : serverMap.keySet()) {
        for (int i = 0; i < serverMap.get(key); i++) {
            tempList.add(key);
        }
    }
    synchronized (index) {
        index++;
        if (index == tempList.size()) {
            index = 0;
        }
        return tempList.get(index);
    }
}

這次記錄下了每台服務器的整體性能,給出一個數值,數值越大,性能越好。可以承受的請求也就越多,可以看到服務器 192.168.1.5 的性能為 4,是其他服務器的兩倍,依舊 10 w 請求測試。

IP:192.168.1.3,次數:20000
IP:192.168.1.2,次數:20000
IP:192.168.1.5,次數:40000
IP:192.168.1.4,次數:20000

192.168.1.5 承擔了 2 倍的請求。

4. 隨機加權

隨機加權的方式和輪詢加權的方式大致相同,只是把使用互斥鎖輪詢的方式換成了隨機訪問,按照概率論來說,訪問量增多時,服務訪問也會達到負載均衡。

/** 服務器列表 */
private static HashMap<String, Integer> serverMap = new HashMap<>();
static {
    serverMap.put("192.168.1.2", 2);
    serverMap.put("192.168.1.3", 2);
    serverMap.put("192.168.1.4", 2);
    serverMap.put("192.168.1.5", 4);
}
/**
 * 加權路由算法
 */
public static String randomWithWeight() {
    List<String> tempList = new ArrayList();
    HashMap<String, Integer> tempMap = new HashMap<>();
    tempMap.putAll(serverMap);
    for (String key : serverMap.keySet()) {
        for (int i = 0; i < serverMap.get(key); i++) {
            tempList.add(key);
        }
    }
    int randomInt = new Random().nextInt(tempList.size());
    return tempList.get(randomInt);
}

依舊 10 w 請求測試,192.168.1.5 的權重是其他服務器的近似兩倍,

IP:192.168.1.3,次數:19934
IP:192.168.1.2,次數:20033
IP:192.168.1.5,次數:39900
IP:192.168.1.4,次數:20133

5. IP-Hash

上面的幾種方式要麼使用隨機數,要麼使用輪詢,最終都達到了請求的負載均衡。但是也有一個很明顯的缺點,就是同一個用戶的多次請求很有可能不是同一個服務進行處理的,這時問題來了,如果你的服務依賴於 session ,那麼因為服務不同, session 也會丟失,不是我們想要的,所以出現了一種根據請求端的 ip 進行哈希計算來決定請求到哪一台服務器的方式。這種方式可以保證同一個用戶的請求落在同一個服務上。

private static List<String> serverList = new ArrayList<>();
static {
    serverList.add("192.168.1.2");
    serverList.add("192.168.1.3");
    serverList.add("192.168.1.4");
    serverList.add("192.168.1.5");
}

/**
 * ip hash 路由算法
 */
public static String ipHash(String ip) {
    // 複製遍歷用的集合,防止操作中集合有變更
    List<String> tempList = new ArrayList<>(serverList.size());
    tempList.addAll(serverList);
    // 哈希計算請求的服務器
    int index = ip.hashCode() % serverList.size();
    return tempList.get(Math.abs(index));
}

6. 總結

上面的四種方式看似不錯,那麼這樣操作下來真的體現了一開始說的負載均衡嗎?答案是不一定的。就像上面的最後一個提問。

又或者每次出手的力度不同,有重有輕,恰巧熊 4 總是承受這種大力度啪啪打臉,熊 4 即將不省熊事,還要繼續打它嗎?

服務器也是這個道理,每次請求進行的操作對資源的消耗可能是不同的。比如說某些操作它對 CPU 的使用就是比較高,也很正常。所以負載均衡有時不能簡單的通過請求的負載來作為負載均衡的唯一依據。還可以結合服務的當前連接數量、最近響應時間等維度進行總體均衡,總而言之,就是為了達到資源使用的負載均衡。

最後的話

文章已經收錄在 Github.com/niumoo/JavaNotes ,歡迎Star和指教。更有一線大廠面試點,Java程序員需要掌握的核心知識等文章,也整理了很多我的文字,歡迎 Star 和完善,希望我們一起變得優秀。

文章有幫助可以點個「」或「分享」,都是支持,我都喜歡!
文章每周持續更新,要實時關注我更新的文章以及分享的乾貨,可以關注「 未讀代碼 」公眾號或者我的博客。

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

※如何讓商品強力曝光呢? 網頁設計公司幫您建置最吸引人的網站,提高曝光率!

以設計的實用美學觀點,規劃出舒適、美觀的視覺畫面,有效提昇使用者的心理期待,營造出輕鬆、愉悅的網站瀏覽體驗。

第四篇-用Flutter手擼一個抖音國內版,看看有多炫_網頁設計公司

※想知道最厲害的網頁設計公司嚨底家"!

RWD(響應式網頁設計)是透過瀏覽器的解析度來判斷要給使用者看到的樣貌

前言

這次對布局進行優化,主要包含了首頁tabview pageview 以及添加幾個按鈕的操作過程.主要使用到stack層疊布局,tabpview和pageview,tabview兩個頁面,一個關注,一個推薦,左右切換,pageview被包含在tabview裏面.

布局優化

抖音的頂部appbar 是懸浮層疊展示,而flutter的層疊組件是stack, 因此最外面採用stack, 其次中間是tabview,分別是關注和推薦兩個選項卡,關注在沒有登錄的時候會彈出一個提示需要認證登錄的頁面,這裏加了兩個頁面,subscriptionScreen.dart,另外一個是loginScreen.dart

 @override
  Widget build(BuildContext context) {
    return Scaffold(
      //backgroundColor: Colors.transparent,
      body: Stack(
        //fit: StackFit.expand,
        children: <Widget>[
          TabBarView(
            controller: _tabController,
            children: <Widget>[
              Subscription(),
              PageView(
                allowImplicitScrolling: true,
                controller: _pageController,
                children: <Widget>[
                  Trending(),
                ],
                onPageChanged: (int index) {
                  setState(() {
                    currentIndex = index;
                  });
                },
              ),
            ],
          ),
          Column(
            children: [
              AppBar(
                backgroundColor: Colors.transparent,
                elevation: 0,
                centerTitle: true,
                leading: IconButton(
                    icon: Icon(Icons.tv),
                    onPressed: () {
                      print('點擊了直播按鈕');
                    }),
                actions: <Widget>[
                  //導航欄右側菜單
                  IconButton(
                      icon: Icon(Icons.search),
                      onPressed: () {
                        print('點擊了搜索按鈕');
                      }),
                ],
                title: TabBar(
                  indicator: UnderlineTabIndicator(
                      borderSide: BorderSide(width: 2.0, color: Colors.white),
                      insets: EdgeInsets.symmetric(horizontal: 18.0)),
                  labelStyle: TextStyle(fontSize: 18),
                  isScrollable: true,
                  controller: _tabController,
                  tabs: toptabs,
                  onTap: (index) {
                    print(index);
                  },
                ),
              )
            ],
          ),
        ],
      ),
      bottomNavigationBar: bottomItems(),
    );
  }

  

底部彈出提示認證頁面

在 onTap 方法里

Scaffold.of(context).showBottomSheet<void>((BuildContext context) {
          return Login();
        });

BottomSheet 是一個底部滑出的組件

new BottomSheet(
    onClosing: () {},
    builder: (BuildContext context) {
        return new Text('aaa');
    },
),

通常很少直接使用 BottomSheet 而是使用 showModalBottomSheet。直接時候的時候看到的知識 builder 里的內容。

Future<T> showModalBottomSheet <T>({
    @required BuildContext context,
    @required WidgetBuilder builder
});

看一個示例

new MaterialButton(
    color: Colors.blue,
    child: new Text('點我'),
    onPressed: () {
        showModalBottomSheet(
            context: context,
            builder: (BuildContext context) {
                return new Container(
                    height: 300.0,
                    child: new Image.network(this.imgurl),
                );
            },
        ).then((val) {
            print(val);
        });
 

 

 具體詳細介紹參考官網.

 

 

關注頁面

 

 整個頁面布局,左右都有邊距,頂部也有邊距,所有採用Container包含,邊距使用padding: EdgeInsets.only(top: 150.0, left: 65.0, right: 65.0),  背景顏色 color: Color.fromRGBO(14, 15, 26, 1),依次image,另外使用sizebox佔用空間,

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

當全世界的人們隨著網路時代而改變向上時您還停留在『網站美醜不重要』的舊有思維嗎?機會是留給努力改變現況的人們,別再浪費一分一秒可以接觸商機的寶貴時間!

其他的中間層都是居中,所以採用center都是居中,另外登錄按鈕是佔滿屏幕的,所以也採用SizeBox,並且把width:設置為double.infinity,這樣就佔滿屏幕,button採用默認的RaisedButton,在button的onpressed事件調用showBottomSheet

import 'package:flutter/material.dart';
import 'package:flutter_app/Screens/loginScreen.dart';

class Subscription extends StatefulWidget {
  @override
  State<StatefulWidget> createState() => _SubscriptionState();
}

class _SubscriptionState extends State<Subscription>
    with TickerProviderStateMixin {
  final GlobalKey<ScaffoldState> scaffoldKey = GlobalKey<ScaffoldState>();
  @override
  Widget build(BuildContext context) {
    return Container(
      padding: EdgeInsets.only(top: 150.0, left: 65.0, right: 65.0),
      color: Color.fromRGBO(14, 15, 26, 1),
      child: Column(
          crossAxisAlignment: CrossAxisAlignment.start,
          children: <Widget>[
            Image(image: AssetImage("assets/images/int_1581491273221.png")),
            SizedBox(height: 20),
            Center(
              child: Text(
                '你還沒有登錄',
                style: TextStyle(
                    color: Colors.white,
                    fontSize: 20.0,
                    fontWeight: FontWeight.w400),
              ),
            ),
            SizedBox(height: 10),
            Center(
              child: Text(
                '登錄賬號,查看你關注的精彩內容',
                style: TextStyle(
                    color: Color.fromRGBO(253, 253, 253, 0.6),
                    fontSize: 14.0,
                    fontWeight: FontWeight.w400),
              ),
            ),
            SizedBox(height: 20),
            SizedBox(
              width: double.infinity,
              child: RaisedButton(
                color: Color.fromRGBO(252, 1, 86, 1),
                child: Text(
                  '登錄',
                  style: TextStyle(color: Colors.white),
                ),
                onPressed: () {
                  Scaffold.of(context)
                      .showBottomSheet<void>((BuildContext context) {
                    return Login();
                  });
                },
              ),
            ),
          ]),
    );
  }
}

 

登錄頁面

布局如下圖:

 

 

這個頁面整體布局頂部,左右都有邊距,因此使用Container比較合適,設置背景顏色為color: Colors.white, 邊距設置為padding:EdgeInsets.only(top: 25.0, left: 25.0, right: 25.0, bottom: 50.0),整體布局採用Column,因為是上下布局,因此Column 設置

crossAxisAlignment: CrossAxisAlignment.start,頂部的布局是左邊一個clear圖標按鈕,右邊一個幫助按鈕,所以使用
Row布局,並且設置Row的mainAxisAlignment: MainAxisAlignment.spaceBetween,這樣就左右布局了,其他依次採用SizeBox佔位, 中間則採用Center來展示文字控件,底部的登錄部分因為包含標籤 超鏈接,所有採用RichText比較合適,包含TextSpan即可.

全部代碼如下:

import 'package:flutter/gestures.dart';
import 'package:flutter/material.dart';
import 'package:url_launcher/url_launcher.dart';

class Login extends StatefulWidget {
  @override
  State<StatefulWidget> createState() => _LoginState();
}

class _LoginState extends State<Login> {
  TapGestureRecognizer _myTapGestureRecognizer;
  @override
  void initState() {
    super.initState();
    _myTapGestureRecognizer = TapGestureRecognizer()
      ..onTap = () {
        launch('https://open.douyin.com/platform');
      };
  }

  @override
  void dispose() {
    _myTapGestureRecognizer.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Container(
      color: Colors.white,
      padding:
          EdgeInsets.only(top: 25.0, left: 25.0, right: 25.0, bottom: 50.0),
      child: Column(
        crossAxisAlignment: CrossAxisAlignment.start,
        children: [
          Row(
            mainAxisAlignment: MainAxisAlignment.spaceBetween,
            children: [
              IconButton(
                icon: Icon(Icons.clear),
                onPressed: () {
                  Navigator.pop(context);
                },
                color: Colors.black,
              ),
              Text('幫助', style: TextStyle(color: Colors.black)),
            ],
          ),
          SizedBox(
            height: 150.0,
          ),
          Center(
            child: Text('180****2520',
                style: TextStyle(color: Colors.black, fontSize: 38)),
          ),
          Center(
            child: Text('認證服務由中國電信提供',
                style: TextStyle(
                    color: Color.fromRGBO(53, 53, 53, 1), fontSize: 12)),
          ),
          SizedBox(
            height: 50.0,
          ),
          SizedBox(
            width: double.infinity,
            child: RaisedButton(
              color: Color.fromRGBO(252, 1, 86, 1),
              child: Text(
                '本機號碼一鍵登錄',
                style: TextStyle(color: Colors.white),
              ),
              onPressed: () {
                showBottomSheet(
                    context: context, builder: (context) => Login());
              },
            ),
          ),
          SizedBox(
            height: 2.0,
          ),
          SizedBox(
            width: double.infinity,
            child: OutlineButton(
              color: Color.fromRGBO(252, 1, 86, 1),
              child: Text(
                '其他手機號碼登錄',
                style: TextStyle(color: Colors.black),
              ),
              onPressed: () {
                showBottomSheet(
                    context: context, builder: (context) => Login());
              },
            ),
          ),
          SizedBox(
            height: 5.0,
          ),
          Center(
              child: RichText(
            text: TextSpan(
              children: [
                TextSpan(
                  text: '登錄即表明同意',
                  style: TextStyle(color: Color.fromRGBO(53, 53, 53, 0.8)),
                ),
                TextSpan(text: '  '),
                TextSpan(
                  text: '用戶協議',
                  style: TextStyle(color: Color.fromRGBO(0, 164, 219, 0.8)),
                ),
                TextSpan(text: '  '),
                TextSpan(
                  text: '和',
                  style: TextStyle(color: Color.fromRGBO(53, 53, 53, 0.8)),
                ),
                TextSpan(text: '  '),
                TextSpan(
                  text: '隱私政策',
                  style: TextStyle(color: Color.fromRGBO(0, 164, 219, 0.8)),
                ),
              ],
            ),
          )),
          Center(
              child: RichText(
            text: TextSpan(
              children: [
                TextSpan(
                  text: '以及',
                  style: TextStyle(color: Color.fromRGBO(53, 53, 53, 0.8)),
                ),
                TextSpan(text: '  '),
                TextSpan(
                    text: '《中國電信認證服務條款》',
                    style: TextStyle(color: Color.fromRGBO(0, 164, 219, 0.8)),
                    recognizer: _myTapGestureRecognizer),
              ],
            ),
          )),
          Expanded(
              flex: 1,
              child: Center(
                  heightFactor: 25.0,
                  child: Text('其他方式登錄',
                      style:
                          TextStyle(color: Color.fromRGBO(0, 164, 219, 0.8))))),
        ],
      ),
    );
  }
}

變更記錄

本次變更主要體現在首頁的選項卡設計,需要層疊展示,並且透明的採用appbar显示出頂部的關注、推薦按鈕,另外新增了關注頁,登錄頁,並且把底部按鈕以及右邊的按鈕都加上了觸發時間

 

接下來要完成的雙擊心形按鈕點贊,評論頁面,分享頁面,這些都可以採用showmodalbottomsheet方法打開一個底部抽屜頁面

 

還有底部的首頁刷新,消息頁面,拍短視頻頁面,消息頁面,我的個人信息頁面

 

結語

請繼續關注本博客,其他頁面持續更新完成,源碼地址:https://github.com/WangCharlie/douyin,歡迎fork和star,謝謝!!!

 

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

透過資料庫的網站架設建置,建立公司的形象或購物系統,並提供最人性化的使用介面,讓使用者能即時接收到相關的資訊