2020氣候變遷績效報告:31國碳排下降 台灣退步居倒數第三

環境資訊中心綜合外電;鄒敏惠編譯、陳文姿報導

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※帶您來了解什麼是 USB CONNECTOR  ?

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

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

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

※廣告預算用在刀口上,網站設計公司幫您達到更多曝光效益

※教你寫出一流的銷售文案?

青年與未來世代日開跑 以能力建置實踐巴黎協定

文:林佳儀(政大外交所)

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※為什麼 USB CONNECTOR 是電子產業重要的元件?

網頁設計一頭霧水??該從何著手呢? 找到專業技術的網頁設計公司,幫您輕鬆架站!

※想要讓你的商品成為最夯、最多人討論的話題?網頁設計公司讓你強力曝光

※想知道最厲害的台北網頁設計公司推薦台中網頁設計公司推薦專業設計師”嚨底家”!!

新北清潔公司,居家、辦公、裝潢細清專業服務

雪梨再度籠罩有毒煙霾 野火恐加劇東澳居民撤離

摘錄自2019年12月10日中央社報導

澳洲廣播公司(ABC News)報導,雪梨部分地區10日空氣品質顯著惡化,市區各地紛紛傳出煙霧警報器聲響。氣象預報警告將出現高溫強風,恐令雪梨北方叢林大火火勢加劇,部分居民預防性撤離家園。造成大眾運輸服務暫停,當局也發出健康警告。

澳洲東部新南威爾斯省(NSW)和維多利亞省(VIC)目前仍有超過100多處叢林火勢,其中許多是從11月燃燒至今。截至目前至少已有4人因野火喪命,超過680間房屋被毀,燒掉的灌木林達100萬餘公頃。

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

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

網頁設計一頭霧水??該從何著手呢? 找到專業技術的網頁設計公司,幫您輕鬆架站!

※想知道最厲害的台北網頁設計公司推薦台中網頁設計公司推薦專業設計師”嚨底家”!!

※幫你省時又省力,新北清潔一流服務好口碑

※別再煩惱如何寫文案,掌握八大原則!

減少汽車碳排雙管齊下,南韓要衝氫動力汽車

全球各國很少在什麼事情上取得共識,對抗氣候變遷倒是頭一遭,讓各懷鬼胎的人類能夠一致以減少排放溫室氣體為目標。在這個願景下,各國想盡辦法減少碳排放,如台灣廠商將電動機車變成一種時尚,南韓則是立志要大力推廣氫動力汽車。

目前汽車製造商包括現代、豐田都有生產氫動力車,現代在 2013 年開始大量生產氫動力車,主要是在歐洲與加州銷售,豐田是在去年開始販售第一款消費性燃料電池汽車,但因全球氫動力車因為價格太高與缺少加氣站,銷售仍不見起色。   《華爾街日報》報導,巴黎氣候變遷會議之後,南韓宣誓未來五年要增加氫動力車銷售數量從現在的 50 輛到 9,000 輛,2030 年要到 63 萬輛,等於每賣出十輛新車,就有一輛是氫動力汽車。氫動力車結合氫與氧來產生電力,副產品就是從排氣管排放的水蒸氣。   南韓政府將補貼每輛氫動力車 275 萬韓圜,約當 23,250 美元,氫動力車售價大約 8,500 萬韓圜,接近 240 萬台幣,補貼約 3%。   除了補貼,南韓還要增加加氣站從目前的 10 座,到 2030 年的 520 座。南韓宣誓未來五年,減少運輸工具碳排放 11%,約 380 萬噸。低碳排放汽車包括混合動力車與電動車將在 2020 年占南韓總汽車銷售量的 20%,現在約 2%。

(首圖來源:)

(本文授權轉載自《》─〈〉)

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

【其他文章推薦】

※帶您來了解什麼是 USB CONNECTOR  ?

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

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

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

※廣告預算用在刀口上,網站設計公司幫您達到更多曝光效益

※教你寫出一流的銷售文案?

特斯拉下調2016中國區銷量目標至5000輛

近日,特斯拉CEO伊隆•馬斯克(ElonMusk)表示,將下調2016年中國區銷量目標至5000輛。另外,特斯拉正在努力尋找當地的合作夥伴,希望能在今年上半年順利於國內建廠。

據悉,2015年前9個月,特斯拉在中國銷售了3025台電動汽車,離2014年定下的目標1萬輛相差很遠,業績不佳是馬斯克下調了中國銷售目標的主要原因。

資料顯示,香港已成為特斯拉ModelS全球保有密度最高的城市,在2015年全球共計交付的50,580輛ModelS中,有2,221輛是來自香港的訂單,占全球約4.39%。近兩年,香港政府鼓勵市民使用電動汽車,並在香港推行電動汽車首次免登記稅政策,使電動車註冊量增長了270%,而特斯拉ModelS占到全部電動車份額的80%。

相比而言,大陸市場對特斯拉的政策支持力度顯得不足。馬斯克稱,自己的公司希望能在今年上半年順利於國內建廠,並借此減輕進口稅收方面的壓力,以及爭取更多政府為新能源車專供的政策優惠。

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

【其他文章推薦】

※為什麼 USB CONNECTOR 是電子產業重要的元件?

網頁設計一頭霧水??該從何著手呢? 找到專業技術的網頁設計公司,幫您輕鬆架站!

※想要讓你的商品成為最夯、最多人討論的話題?網頁設計公司讓你強力曝光

※想知道最厲害的台北網頁設計公司推薦台中網頁設計公司推薦專業設計師”嚨底家”!!

新北清潔公司,居家、辦公、裝潢細清專業服務

中國電動超跑「前途 K50」預計 2017 亮相

Tesla 去(2015)年前三季在中國賣了約3000 輛Model S 和Model X 頂級款電動車,在全球全年交車輛更是達到50,580 輛,但有沒有可能,中國冒出的競爭對手會威脅Tesla 在電動車市場的領先地位?中國最大的汽車設計公司之一「北京長城華冠」在2015 年發表該公司第一款、也是中國第一款電動超跑「K50」,性能和價格都相當於Tesla Model S,而負責K50 生產的子公司「前途汽車」2 月於蘇州動土設廠,也意味著K50 量產在即。

K50 號稱5 秒就能加速至100公里,北京長城華冠董事長陸群受訪時說到,K50 有著碳纖維的車身、鋁製車架,預計2017 年就會亮相,售價約在70 萬人民幣(相當於10 萬6000 美元、345 萬台幣),價格相當於鋁製車身的Tesla Model S,而比起同樣是碳纖維車身的插電式油電混合車BMW i8,K50 的售價只有1/3。

陸群說,公司從Tesla 身上和其他電動車廠商身上學習,他們的目標就是打造高品質的汽車。前途汽車這個全資子公司自2015 年成立,任務就是打造電動汽車,而自己設廠,對他們來說是唯一的解決方案,因為在中國沒有其他在做碳纖維模型的工廠,這個花20 億人民幣打造的廠房,未來也會為其他車廠代工製造,預計初期的產值可以達到一年5 萬輛車。

至於在K50 之外,前途汽車也計畫再發表兩款便宜一些的電動車,陸群為前途汽車訂立目標,在2020 年獲得電動車市場15% 的市佔,又或者是45 萬輛。「我們會讓消費者相信,中國也是有能力打造一個全新的汽車品牌,一個頂尖的汽車品牌,一個頂尖的純電動車品牌。」陸群說。

分析師:打造電動車要看長期續航力

Bloomberg Intelligence 駐香港的汽車分析師Steve Man 是這樣看的,他認為前途汽車最終若要成功,得看他的行銷和市場聲望,但在那之前,打造一台經得起時間考驗的電動車可是需要相當多的耐心和資本,「我們就來看看前途有沒有這麼長的續航力」。

Elon Musk  對此表示,聽聽就好?

這番話透露出些許不信任的意味,至於身為市場領先者、被挑戰的對象,Tesla 創辦人兼執行長Elon Musk 又是怎麼看的呢?Elon Musk 曾在日前一場演講中對市場上充滿電動車和自駕車新近者眾多做出以下回應,「現在有太多新創公司發布電動車、自駕車的消息,我都在等哪天我媽也跳出來發布一輛。」

Elon Musk 這番話不是針對前途汽車,光是在中國市場,這類宣布要做電動車的新創公司可真不少。中國科技創業家李斌在2015 年創立「未來汽車」(NextEV,Inc),獲得騰訊和高瓴資本投資;樂視創辦人兼CEO賈躍亭在今年4 月也揭示一輛四門電動跑車「LeSEE」的概念;傳統車廠長安汽車也和福特合夥,投資180 億人民幣研發低能源汽車。

  • 資料來源:

本文授權轉載自《科技新報》──〈〉

(首圖來源:截自官網)

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

【其他文章推薦】

※為什麼 USB CONNECTOR 是電子產業重要的元件?

網頁設計一頭霧水??該從何著手呢? 找到專業技術的網頁設計公司,幫您輕鬆架站!

※想要讓你的商品成為最夯、最多人討論的話題?網頁設計公司讓你強力曝光

※想知道最厲害的台北網頁設計公司推薦台中網頁設計公司推薦專業設計師”嚨底家”!!

新北清潔公司,居家、辦公、裝潢細清專業服務

英國宣布 2035 年起禁售燃油汽車

英國政府宣布,將從 2035 年起禁止銷售汽油、柴油或混合動力的新車,比原計畫提前 5 年,以此降低燃燒化石燃料造成的二氧化碳。

英國首相 Boris Johnson 表示,各國必須採取行動應對二氧化碳的排放。在經過廣泛徵詢意見後,英國將在 2035 年停止銷售燃油車,包括汽油、柴油和混合動力車,如果在未來十多年的時間內很快地實現了燃油到清潔能源的過度,禁售令有可能更早生效。

英國是歐洲第二大汽車市場,以柴油和汽油為主的燃油動力車佔汽車總銷售量 90%,近年隨著政府大力推廣電動車,電動車在英國的市場需求持續提升,但潛在消費者仍然對充電體系的缺乏感到擔憂,同時市場銷售的電動車型號不多和定價較高阻礙更多消費者選購。 2019 年英國政府推出總額為 250 萬英鎊的補貼計畫,為更多城市街道安裝電動車充電裝備。

儘管禁售令到 2035 年才生效,但對傳統汽車廠商的影響將很快體現,目前英國汽車市場銷量占比前三的廠商為福特、福斯和 Vauxhall,電動車市場銷量占比前三則是特斯拉、三菱、BMW,傳統汽車廠商投資開發新車的週期為 7 年,這代表在未來幾年內將有更多電動車進入英國市場。

受影響較大的是德國汽車廠商,英國是德國傳統汽車廠商最大的單一出口市場,占其全球汽車銷售量 20%,電動車的研發和製造週期比傳統燃油汽車短,在電動車市場中德國汽車廠商將面臨更激烈的競爭。

(合作媒體:。首圖來源:)

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

【其他文章推薦】

USB CONNECTOR掌控什麼技術要點? 帶您認識其相關發展及效能

※評比前十大台北網頁設計台北網站設計公司知名案例作品心得分享

※智慧手機時代的來臨,RWD網頁設計已成為網頁設計推薦首選

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

※幫你省時又省力,新北清潔一流服務好口碑

web應用安全框架選型:Spring Security與Apache Shiro

一、 SpringSecurity 框架簡介

官網:

源代碼:

Spring Security 是強大的,且容易定製的,基於Spring開發的實現認證登錄與資源授權的應用安全框架。

SpringSecurity 的核心功能:

  • Authentication:認證,用戶登陸的驗證(解決你是誰的問題)
  • Authorization:授權,授權系統資源的訪問權限(解決你能幹什麼的問題)
  • 安全防護,防止跨站請求,session 攻擊等

二、比較一下shiro與Spring Security

目前在java web應用安全框架中,與Spring Security形成直接競爭的就是shiro,二者在核心功能上幾乎差不多,但從使用的角度各有優缺點。筆者認為:沒有最好的,只有最合適的。

2.1 用戶量

從使用情況上看,二者都在逐步提高使用量。shiro的使用量一直高於spring security.

2.2.使用的方便程度

通常來說,shiro入門更加容易,使用起來也非常簡單,這也是造成shiro的使用量一直高於Spring Security的主要原因。但是從筆者的角度來看,二者其實都簡單,我說說我的理由:

  • 在沒有Spring Boot之前,Spring Security的大部分配置要通過XML實現,配置還是還是非常複雜的。但是有了 Spring Boot之後,這一情況已經得到顯著改善。
  • Spring Security之所以看上去比shiro更複雜,其實是因為它引入了一些不常用的概念與規則。大家應該都知道2/8法則,這在Spring Security裏面體現的特別明顯,如果你只學Spring Security最重要的那20%,這20%的複雜度和shiro基本是一致的。也就是說,不重要的那80%,恰恰是Spring Security比shiro的“複雜度”。

也就是說,如果有人能幫你把Spring Security最重要的那20%摘出來,二者的入門門檻、複雜度其實是差不太多的。

2.3.社區支持

Spring Security依託於Spring龐大的社區支持,這點自不必多說。shiro屬於apache社區,因為它的廣泛使用,文檔也非常的全面。二者從社區支持來看,幾乎不相上下。

但是從社區發展的角度看,Spring Security明顯更佔優勢,隨着Spring Cloud、Spring Boot、Spring Social的長足進步,這種優勢會越來越大。因為Spring Security畢竟是Spring的親兒子,Spring Security未來在於Spring系列框架集成的時候一定會有更好的融合性,前瞻性、兼容性!這也是為什麼我們要學Spring Security的主要原因!

2.4.功能豐富性

Spring Security因為它的複雜,所以從功能的豐富性的角度更勝一籌。其中比較典型的如:

  • Spring Security默認含有對OAuth2.0的支持,與Spring Social一起使用完成社交媒體登錄也比較方便。shiro在這方面只能靠自己寫代碼實現。
  • 還有一種普遍說法:Spring Security在網絡安全的方面下的功夫更多,但是筆者並未有非常直接的感受,有可能出現安全問題的時候才會感到不夠安全的痛。

三、總結

如果你只是想實現一個簡單的web應用,shiro更加的輕量級,學習成本也更低。如果您正在開發一個分佈式的、微服務的、或者與Spring Cloud系列框架深度集成的項目,筆者還是建議您使用Spring Security。

期待您的關注

  • 博主最近新寫了一本書:
  • 本文轉載註明出處(必須帶連接,不能只轉文字):。

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

【其他文章推薦】

※帶您來了解什麼是 USB CONNECTOR  ?

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

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

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

※廣告預算用在刀口上,網站設計公司幫您達到更多曝光效益

※教你寫出一流的銷售文案?

[ASP.NET Core 3框架揭秘] 依賴注入[8]:服務實例的生命周期

生命周期決定了IServiceProvider對象採用怎樣的方式提供和釋放服務實例。雖然不同版本的依賴注入框架針對服務實例的生命周期管理採用了不同的實現,但總的來說原理還是類似的。在我們提供的中,我們已經模擬了三種生命周期模式的實現原理,接下來我們結合“服務範圍”的概念來對這個話題做進一步講述。

一、服務範圍(Service Scope)

對於依賴注入框架採用的三種生命周期模式(Singleton、Scoped和Transient)來說,Singleton和Transient都具有明確的語義,但是Scoped代表一種怎樣的生命周期模式,很多初學者往往搞不清楚。這裏所謂的Scope指的是由IServiceScope接口表示的“服務範圍”,該範圍由IServiceScopeFactory接口表示的“服務範圍工廠”來創建。如下面的代碼片段所示,IServiceProvider的擴展方法CreateScope正是利用提供的IServiceScopeFactory服務實例來創建作為服務範圍的IServiceScope對象。

public interface IServiceScope : IDisposable
{
    IServiceProvider ServiceProvider { get; }
}

public interface IServiceScopeFactory
{
    IServiceScope CreateScope();
}

public static class ServiceProviderServiceExtensions
{
   public static IServiceScope CreateScope(this IServiceProvider provider) => provider.GetRequiredService<IServiceScopeFactory>().CreateScope();
}

任何一個IServiceProvider對象都可以利用其註冊的IServiceScopeFactory服務創建一個代表服務範圍的IServiceScope對象,後者代表的“範圍”內具有一個新創建的IServiceProvider對象(對應着接口IServiceScope的ServiceProvider屬性),該對象與當前IServiceProvider在邏輯上具有如下圖所示的“父子關係”。

如上圖所示的樹形層次結構只是一種邏輯結構,從對象引用層面來看,通過某個IServiceScope封裝的IServiceProvider對象不需要知道自己的“父親”是誰,它只關心作為根節點的IServiceProvider在哪裡就可以了。下圖從物理層面揭示了IServiceScope / IServiceProvider對象之間的關係,任何一個IServiceProvider對象都具有針對根容器的引用。

二、服務實例的提供

只有在充分了解IServiceScope對象的創建過程以及它與IServiceProvider對象之間的關係之後,我們才會對三種生命周期管理模式(Singleton、Scoped和Transient)具有深刻的認識。就服務實例的提供方式來說,它們之間具有如下的差異:

  • Singleton:IServiceProvider對象創建的服務實例保存在作為根容器的IServiceProvider對象上,所以多個同根的IServiceProvider對象提供的針對同一類型的服務實例都是同一個對象。
  • Scoped:IServiceProvider對象創建的服務實例由自己保存,所以同一個IServiceProvider對象提供的針對同一類型的服務實例均是同一個對象。
  • Transient:針對每一次服務提供請求,IServiceProvider對象總是創建一個新的服務實例

三、服務實例的釋放

IServiceProvider除了為我們提供所需的服務實例之外,對於由它提供的服務實例,它還肩負起回收釋放的責任。這裏所說的回收釋放與.NET Core自身的垃圾回收機制無關,僅僅針對於自身類型實現了IDisposable或者IAsyncDisposable接口的服務實例(下面簡稱為Disposable服務實例),針對服務實例的釋放體現為調用它們的Dispose或者DisposeAsync方法。IServiceProvider對象針對服務實例採用的回收釋放策略取決於採用的生命周期模式,具體策略主要體現為如下兩點:

  • Singleton:提供Disposable服務實例保存在作為根容器的IServiceProvider對象上,只有在這個IServiceProvider對象被釋放的時候這些Disposable服務實例才能被釋放。
  • Scoped和Transient:當前IServiceProvider對象會保存由它提供的Disposable服務實例,當自己被釋放的時候,這些Disposable服務實例就會被釋放。

綜上所述,每個作為依賴注入容器的IServiceProvider對象都具有如下圖所示的兩個列表來存放服務實例,我們將它們分別命名為“Realized Services”和“Disposable Services”,對於一個作為非根容器的IServiceProvider對象來說,由它提供的Scoped服務保存在自身的Realized Services列表中,Singleton服務實例則會保存在根容器的Realized Services列表中。如果服務實現類型實現了IDisposable或者IAsyncDisposable接口,Scoped和Transient服務實例會被保存到自身的Disposable Services列表中,而Singleton服務實例則會保存到根容器的Disposable Services列表中。

對於作為根容器的IServiceProvider對象來說,Singleton和Scoped模式對它來說是兩種等效的生命周期模式,由它提供的Singleton和Scoped服務實例會被存放到自身的Realized Services列表中,而所有需要被釋放的服務實例則被存放到Disposable Services列表中。當某個IServiceProvider對象被用於提供針對指定類型的服務實例時,它會根據服務類型提取出表示服務註冊的ServiceDescriptor對象並根據它得到對應的生命周期模式:

  • 如果生命周期模式為Singleton,並且作為根容器的Realized Services列表中包含對應的服務實例,它將作為最終提供的服務實例。如果這樣的服務實例尚未創建,那麼新的服務將會被創建出來並作為提供的服務實例。這個服務實例會被添加到根容器的Realized Services列表中。如果實例類型實現了IDisposable或者IAsyncDisposable接口,創建的服務實例會被添加到根容器的Disposable Services列表中。
  • 如果生命周期為Scoped,那麼IServiceProvider會先確定自身的Realized Services列表中是否存在對應的服務實例,存在的服務實例將作為最終的返回值。如果Realized Services列表不存在對應的服務實例,那麼新的服務實例會被創建出來。在作為最終的服務實例被返回之前,創建的服務實例會被添加到自身的Realized Services列表中,如果實例類型實現了IDisposable或者IAsyncDisposable接口,創建的服務實例會被添加到自身的Disposable Services列表中。
  • 如果提供服務的生命周期為Transient,那麼IServiceProvider會直接創建一個新的服務實例。在作為最終的服務實例被返回之前,如果實例類型實現了IDisposable或者IAsyncDisposable接口,創建的服務實例會被添加到自身的Disposable Services列表中。

對於非根容器的IServiceProvider對象來說,它的生命周期是由“包裹”着它的IServiceScope對象控制的。從前面給出的定義可以看出IServiceScope實現了IDisposable接口,Dispose方法的執行不僅標志著當前服務範圍的終結,也意味着對應IServiceProvider對象生命周期的結束。

當代表服務範圍的IServiceScope對象的Dispose方法被調用的時候,它會調用對應IServiceProvider對象的Dispose方法。一旦IServiceProvider對象因自身Dispose方法的調用而被釋放的時候,它會從自身的Disposable Services列表中提取出所有需要被釋放的服務實例,並調用它們的Dispose或者DisposeAsync方法。在這之後,Disposable Services和Realized Services列表會被清空,列表中的服務實例和IServiceProvider對象自身會成為垃圾對象被GC回收。

四、ASP.NET Core應用

依賴注入框架所謂的服務範圍在ASP.NET Core應用中具有明確的邊界,指的是針對每個HTTP請求的上下文,也就是服務範圍的生命周期與每個請求上下文綁定在一起。如下圖所示,ASP.NET Core應用中用於提供服務實例的IServiceProvider對象分為兩種類型,一種是作為根容器並與應用具有相同生命周期的IServiceProvider對象,另一個類則是根據請求及時創建和釋放的IServiceProvider對象,我們一般將它們分別稱為ApplicationServicesRequestServices

在ASP.NET Core應用初始化過程(即請求管道構建過程)中使用的服務實例都是由ApplicationServices提供的。在具體處理每個請求時,ASP.NET Core框架會利用註冊的一个中間件來針對當前請求創建一個代表服務範圍的IServiceScope對象,該服務範圍提供的RequestServices用來提供當前請求處理過程中所需的服務實例。一旦服務請求處理完成,IServiceScoped對象代表的服務範圍被終結,在當前請求處理過程中的Scoped服務會變成垃圾對象並最終被GC回收。對於實現了IDisposable或者IAsyncDisposable接口的Scoped或者Transient服務實例來說,在變成垃圾對象之前,它們的Dispose或者DisposeAsync方法會被調用。

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

【其他文章推薦】

※為什麼 USB CONNECTOR 是電子產業重要的元件?

網頁設計一頭霧水??該從何著手呢? 找到專業技術的網頁設計公司,幫您輕鬆架站!

※想要讓你的商品成為最夯、最多人討論的話題?網頁設計公司讓你強力曝光

※想知道最厲害的台北網頁設計公司推薦台中網頁設計公司推薦專業設計師”嚨底家”!!

新北清潔公司,居家、辦公、裝潢細清專業服務

[UWP]使用CompositionAPI的翻轉動畫

1. 運行效果

在 這篇文章里我介紹了一個包含長陰影的番茄鍾,這個番茄鍾在狀態切換時用到了翻轉動畫,效果如上所示,還用到了彈簧動畫,可以看到翻轉後有點回彈。本來打算自己這個動畫效果寫的,但火火已經寫好了這個FlipSide控件,Github地址在,這篇文章就介紹下這個控件的部分原理。

2. TransformMatrix

Visual的 屬性是一個 的struct,它是應用於元素的轉換矩陣,可以進行動畫處理。它的默認值如下:

這時候動畫效果如下:

要使Visual可以正確旋轉需要按以下方式處理:

private void UpdateTransformMatrix(FrameworkElement element)
{
    var host = ElementCompositionPreview.GetElementVisual(element);
    var size = element.RenderSize.ToVector2();
    if (size.X == 0 || size.Y == 0) return;
    var n = -1f / size.X;

    Matrix4x4 perspective = new Matrix4x4(
        1.0f, 0.0f, 0.0f, 0.0f,
        0.0f, 1.0f, 0.0f, 0.0f,
        0.0f, 0.0f, 1.0f, n,
        0.0f, 0.0f, 0.0f, 1.0f);

    host.TransformMatrix =
        Matrix4x4.CreateTranslation(-size.X / 2, -size.Y / 2, 0f) *
        perspective *
        Matrix4x4.CreateTranslation(size.X / 2, size.Y / 2, 0f);
}

講真我也不明白為什麼要這麼寫,只知道是從微軟的 里抄的。每當SizeChanged事件發生時都需要調用這個函數重新設置TransformMatrix。

3. RotationAngleInDegrees

Visual包含兩個相似的屬性, 和 ,它們的定義如下:

//
// 摘要:
//     視覺對象的旋轉角度(以度為單位)。 可動畫處理。
//
// 返回結果:
//     The rotation angle of the visual in degrees.
public float RotationAngleInDegrees { get; set; }
//
// 摘要:
//     視覺對象的旋轉角度(以弧度為單位)。 可動畫處理。
//
// 返回結果:
//     The rotation angle in radians of the visual.
public float RotationAngle { get; set; }

這兩個屬性都用於控制Visua圍繞着RotationAxis和CenterPoint旋轉。在FlipSide這個控件里RotationAngleInDegrees比較適用:

float f1 = 0f, f2 = 0f;
if (IsFlipped)
{
    f1 = 180f;
    f2 = 360f;
    VisualStateManager.GoToState(this, "Slide2", false);
}
else
{
    f1 = 0f;
    f2 = 180f;
    VisualStateManager.GoToState(this, "Slide1", false);
}
if (springAnimation1 != null && springAnimation2 != null)
{
    springAnimation1.FinalValue = f1;
    springAnimation2.FinalValue = f2;
    s1Visual.StartAnimation("RotationAngleInDegrees", springAnimation1);
    s2Visual.StartAnimation("RotationAngleInDegrees", springAnimation2);
}

這段代碼用到了SpringAnimatin,所以有彈一下的效果。

4. RotationAxis

用於指定Visual旋轉的軸。FlipSide可以通過設置RotationAxis改變翻轉的角度,例如火火的Demo里使用根據鼠標改變RotationAxis:

private void OnFlipSidePointerReleased(object sender, PointerRoutedEventArgs e)
{
    var position = e.GetCurrentPoint(_FlipSide).Position;
    var v2 = (position.ToVector2() - _FlipSide.RenderSize.ToVector2() / 2);
    _FlipSide.Axis = new Vector2(-v2.Y, v2.X);
}

5. ExpressionAnimation

<controls:FlipSide x:Name="FlipSide" IsFlipped="True">
    <controls:FlipSide.Side1>
        <Grid Background="#FFE87A69" x:Name="InworkElement" CornerRadius="1">
            
        </Grid>
    </controls:FlipSide.Side1>
    <controls:FlipSide.Side2>
        <Grid Background="#FF5271c2" x:Name="BreakElement" CornerRadius="1">
            
        </Grid>
    </controls:FlipSide.Side2>
</controls:FlipSide>

上面XAML為FlipSide的調用代碼,它將Side1和Side2(這個命名超讓高達迷興奮)作為內容显示在UI上,當IsFlipped為False時显示Side1的內容,當IsFlipped為True時代表翻轉過去,此時显示Side2的內容。在翻轉動畫的過程中,何時隱藏Side1並显示Side2是個麻煩事。幸好UWP有強大的表達式動畫(ExpressionAnimation),FlipSide只用了下面幾句代碼處理這個問題:

s1Visual = ElementCompositionPreview.GetElementVisual(Side1Content);
s2Visual = ElementCompositionPreview.GetElementVisual(Side2Content);

var opacity1Animation = compositor.CreateExpressionAnimation("this.Target.RotationAngleInDegrees > 90 ? 0f : 1f");
var opacity2Animation = compositor.CreateExpressionAnimation("(this.Target.RotationAngleInDegrees - 180) > 90 ? 1f : 0f");

s1Visual.StartAnimation("Opacity", opacity1Animation);
s2Visual.StartAnimation("Opacity", opacity2Animation);

這段代碼的意思是當Side1的RotationAngleInDegrees大於90度時隱藏,否則显示;Side2則相反。其中,表達式中的this.Target表示使用這個表達式動畫的Vsual。

表達式動畫的話題很大,這篇文章就割愛了,可以參考下面給出的鏈接了解更多內容:

6. 結語

感謝火火提供了這個控件,讓我可以省下了不少功夫。其實我對TransformMatrix真的不理解,所以這部分只是用,沒辦法詳細介紹。而且我以前對UI里使用3D不感興趣,所以這方面真的沒法寫更多內容。期待火火為這方面補充一些博客。

7. 參考

8. 源碼

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

【其他文章推薦】

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

網頁設計一頭霧水??該從何著手呢? 找到專業技術的網頁設計公司,幫您輕鬆架站!

※想知道最厲害的台北網頁設計公司推薦台中網頁設計公司推薦專業設計師”嚨底家”!!

※幫你省時又省力,新北清潔一流服務好口碑

※別再煩惱如何寫文案,掌握八大原則!