android uber啟動動畫,模仿Uber的啟動畫面(上)

啟動畫面(Splash Screen)——不但給開發者們提供了一個盡情發揮、創建有趣動畫的機會,也填補了App啟動時從終端慢吞吞地下載數據的時間。啟動畫面(動態的)對于App至關重要:它可以讓用戶不失興趣地耐心等待應用完成加載。

盡管現在的啟動畫面多種多樣,但很少有像Uber這般精美的。2016年第一季度,Uber的CEO發表了關于重塑品牌的策略,其中之一就是現在這個超酷的啟動畫面。

Uber-feature.png

這篇教程的目的是盡可能真實地再現Uber的動畫。我們會大量地使用到CALayers、CAAnimations,以及它們的子類。我不會從頭介紹這些類的基本概念,而是把重點放在如何應用這些類,創建高質量的動畫。如果你想要了解動畫背后的基本原理,可以參考Marin Todorove的iOS動畫中級教程。

入門

由于有非常多的動畫要實現,我們不妨在這個初始項目的基礎上進行修改。初始項目里已經為你創建好了所有需要的CALayer,我們給它們添加動畫即可。譯者注:為了保持教程簡潔,刪除了原文里一些與教學無關的文字。如有興趣可通過文章最后的鏈接閱讀原文相關內容。

先來看一眼最終效果:

eac90fd0c1780beb6e7aacf38fb6f6aa.gif

打開初始項目看看里面的文件。

從控制器的角度分析,項目中的SplashViewController通過它的父視圖控制器RootContainerViewController生成。SplashViewController會不停循環播放啟動動畫,直到App完全加載完成,即與終端API握手成功并獲取了必要的數據。值得一提的是,在這個示例項目里,啟動動畫抽象成了一個單獨的模塊(譯者注:可以直接集成到其他項目里)。

RootContainerViewController里有兩個方法:showSplashViewController()和showSplashViewControllerNoPing()。我們主要使用第二個方法,它只會不停循環播放動畫(不會進入主界面),便于我們把精力集中在SplashViewController的子視圖上。當然,最后我們還是會切換回第一個方法,模擬API延遲并過渡到主界面。

啟動畫面的視圖和層

SplashViewController包含了兩個子視圖。其一是“波紋格子”背景,我們把它叫做TileGridView, ? ?由一系列TileView組成。另一個是帶有動畫效果的“U”字Logo,我們把它叫做AnimatedULogoView。

264ee84fd2c9d442f09ae7e9cf6e32ea.png

AnimatedULogoView里有4個CAShapeLayer:circleLayer:“U”型Logo的圓形白色背景

lineLayer:circleLayer中心到邊界的一條直線

squareLayer:circleLayer中心位置的正方形

maskLayer:遮罩層,當它的邊界隨著動畫改變的時會遮蓋其他層

這些CAShapeLayer組合在一起,構成了Fuber標志性的“U”。

既然已經知道這些層的組合方式,那我們可以開始創建動畫,讓AnimatedULogoView動起來了。

eb9da10b1bf3827cdd19dd3c02a74ab2.gif

圓形的動畫

制作動畫的時候,最好過濾掉其他視覺“噪音”,只關注當前實現的動畫。打開AnimatedULogoView.swift,在init(frame:)方法里,把除了cricleLayer的其他層全都注釋掉,實現完動畫后我們會重新添加回來。注釋后的代碼應該像下面一樣:override?init(frame:?CGRect)?{??super.init(frame:?frame)

circleLayer?=?generateCircleLayer()

lineLayer?=?generateLineLayer()

squareLayer?=?generateSquareLayer()

maskLayer?=?generateMaskLayer()??//??layer.mask?=?maskLayer

layer.addSublayer(circleLayer)??//??layer.addSublayer(lineLayer)

//??layer.addSublayer(squareLayer)}

定位到generateCricleLayer()方法,試著理解一下這里的圓是怎么繪制的。其實它只不過是用UIBezierPath繪制的一個CAShapeLayer。注意這一行:layer.path?=?UIBezierPath(arcCenter:?CGPointZero,?radius:?radius/2,?startAngle:?-CGFloat(M_PI_2),?endAngle:?CGFloat(3*M_PI_2),?clockwise:?true).CGPath

默認情況下,如果你把startAngle設置為0,圓弧會從右側開始繪制(3點鐘方向)。如果設置為-M_PI_2,也就是-90°的話則會從上方開始繪制,endAngle最終是270°,或者說3*M_PI_2,同樣也是圓的正上方。另外要注意的是,在這里我們把弧線的寬度lineWidth設置為圓的半徑radius,因為我們想讓它動起來(畫圓的過程)。

circleLayer的動畫是由三個CAAnimation組成的:一個描繪筆端動畫的CAKeyframeAnimation,一個進行圖形變換的CABasicAnimation,以及一個CAAnimationGroup把它們合成在一起。

定位到animateCricleLayer(),添加下面代碼://?筆畫變化的動畫let?strokeEndAnimation?=?CAKeyframeAnimation(keyPath:?"strokeEnd")

strokeEndAnimation.timingFunction?=?strokeEndTimingFunction

strokeEndAnimation.duration?=?kAnimationDuration?-?kAnimationDurationDelay

strokeEndAnimation.values?=?[0.0,?1.0]

strokeEndAnimation.keyTimes?=?[0.0,?1.0]

通過把動畫的values設置為0.0和1.0,我們告訴Core Animation,從startAngle開始,到endAngle結束,創建像時鐘一樣的動畫。隨社storkeEnd的值變大,沿著周長的弧線長度也逐漸增加,整個圓逐漸被填滿。對于這個例子,如果你把values改為[0.0, 0.5],那么整個動畫只會填滿半個圓。

接著添加形變動畫:let?transformAnimation?=?CABasicAnimation(keyPath:?"transform")

transformAnimation.timingFunction?=?strokeEndTimingFunction

transformAnimation.duration?=?kAnimationDuration?-?kAnimationDurationDelay//?旋轉放大的動畫//?起始時:逆時針旋轉45°,x、y為正常大小的0.25倍var?startingTransform?=?CATransform3DMakeRotation(-CGFloat(M_PI_4),?0,?0,?1)

startingTransform?=?CATransform3DScale(startingTransform,?0.25,?0.25,?1)

transformAnimation.fromValue?=?NSValue(CATransform3D:?startingTransform)

transformAnimation.toValue?=?NSValue(CATransform3D:?CATransform3DIdentity)

這個動畫既包括了圖形的縮放也包括了沿z軸的旋轉。其結果是circleLayer在順時針旋轉45°的同時逐漸放大。這里旋轉的參數設置非常重要,因為和其它層的動畫組合的時候,它需要和lineLayer的位置及速度相匹配。

最后,在方法的末尾添加一個CAAnimationGroup,它負責把前面兩個動畫合成在一起,這樣你只需給cricleLayer添加一個動畫即可。//?把兩個動畫合成let?groupAnimation?=?CAAnimationGroup()

groupAnimation.animations?=?[strokeEndAnimation,?transformAnimation]

groupAnimation.repeatCount?=?Float.infinity?//?無限重復動畫groupAnimation.duration?=?kAnimationDuration

groupAnimation.beginTime?=?beginTime

groupAnimation.timeOffset?=?startTimeOffset

circleLayer.addAnimation(groupAnimation,?forKey:?"looping")

CAAnimationGroup設定了兩個重要的屬性:beginTime和timeOffset,如果你對它們不熟悉的話可以參考這篇文章,里面有這兩個屬性的描述以及用法。

這里的groupAnimation的beginTime屬性是根據父視圖的時間設定的。

timeOffset在這里也需要設定,因為這個動畫在第一次運行的時候,實際上是從中途開始的。當我們完成更多動畫時,你可以回到這里,嘗試改變startTimeOffset的值并觀察效果的差別。

把groupAnimation添加給circleLayer,編譯運行一下看看目前的效果:

97c1b84b5a25802ff63e9ddb4e018ed9.gif提示:試著刪除strokeEndAnimation或者transformAnimation,看看單獨的每一個動畫是什么樣的。在這篇教程里,你可以嘗試不同動畫的效果。你可能會驚奇地發現,不同是動畫組合竟能創建出如此意想不到的獨特視覺效果。

直線的動畫

現在我們已經完成circleLayer的動畫了,該開始說說lineLayer了。還是在AnimatedULogoView.swift里,定位到startAnimating()把除了animateLineLayer()以外的方法全部注釋掉。注釋完的代碼應該如下面所示:public?func?startAnimating()?{

beginTime?=?CACurrentMediaTime()

layer.anchorPoint?=?CGPointZero

//??animateMaskLayer()

//??animateCircleLayer()

animateLineLayer()??//??animateSquareLayer()}

此外還需要調整一下init(frame:),只顯示circleLayer和lineLayer:override?init(frame:?CGRect)?{??super.init(frame:?frame)

circleLayer?=?generateCircleLayer()

lineLayer?=?generateLineLayer()

squareLayer?=?generateSquareLayer()

maskLayer?=?generateMaskLayer()??//??layer.mask?=?maskLayer

layer.addSublayer(circleLayer)

layer.addSublayer(lineLayer)??//??layer.addSublayer(squareLayer)}

注釋完畢,定位到animateLineLayer()方法,實現下一組動畫效果://?線段寬度動畫let?lineWidthAnimation?=?CAKeyframeAnimation(keyPath:?"lineWidth")

lineWidthAnimation.values?=?[0.0,?5.0,?0.0]

lineWidthAnimation.timingFunctions?=?[strokeEndTimingFunction,?circleLayerTimingFunction]

lineWidthAnimation.duration?=?kAnimationDuration

lineWidthAnimation.keyTimes?=?[0.0,?1.0?-?kAnimationDurationDelay/kAnimationDuration,?1.0]

這個動畫會先增加lineLayer的寬度,隨后變回來。

添加下面代碼實現下一個動畫://?變形let?transformAnimation?=?CAKeyframeAnimation(keyPath:?"transform")

transformAnimation.timingFunctions?=?[strokeEndTimingFunction,?circleLayerTimingFunction]

transformAnimation.duration?=?kAnimationDuration

transformAnimation.keyTimes?=?[0.0,?1.0?-?kAnimationDurationDelay/kAnimationDuration,?1.0]//?和之前一樣的旋轉放大動畫var?transform?=?CATransform3DMakeRotation(-CGFloat(M_PI_4),?0.0,?0.0,?1.0)

transform?=?CATransform3DScale(transform,?0.25,?0.25,?1.0)//?先放大再縮小transformAnimation.values?=?[NSValue(CATransform3D:?transform),?????????????????????????????NSValue(CATransform3D:?CATransform3DIdentity),?????????????????????????????NSValue(CATransform3D:?CATransform3DMakeScale(0.15,?0.15,?1.0))]

和circleLayer的動畫非常相似,我們在這里也定義了一個沿z軸順時針旋轉的動畫。在這里,我們同樣對線條定義了一個縮放動畫:從原始大小的25%開始,先變為原始大小,緊接著變為原始大小的15%。

用CAAnimationGroup把它們合成到一起,添加到lineLayer里://?合成動畫let?groupAnimation?=?CAAnimationGroup()

groupAnimation.repeatCount?=?Float.infinity

groupAnimation.removedOnCompletion?=?falsegroupAnimation.duration?=?kAnimationDuration

groupAnimation.beginTime?=?beginTime

groupAnimation.animations?=?[lineWidthAnimation,?transformAnimation]

groupAnimation.timeOffset?=?startTimeOffset

lineLayer.addAnimation(groupAnimation,?forKey:?"looping")

編譯運行,觀察一下效果。

97469f5d036f3ba06c65f0f899b5b6ae.gif

注意,在這里我們把線條的初始位置設置為了-M_PI_4,同時把keyTimes設置為了[0.0, 1.0 - kAnimationDurationDelay/kAnimationDuration, 1.0]。數組的第一個和最后一個元素顯而易見:0.0代表起始,1.0代表終止。為了得到中間時間點,我們需要計算出圓形動畫完成、后半部分動畫開始(縮小的動畫)的時間。用kAnimationDurationDelay除以kAnimationDuration可以得到我們需要的結果。但因為它是個延遲動畫,所以我們應該用1.0減去它,我們需要從末尾往前倒,減去延遲時間。

現在我們已經完成了circleLayer和lineLayer的動畫了,接下來該處理中間的方形了。

方形的動畫

現在你應該已經輕車熟路了。定位到startAnimation()方法,注釋掉animateSquareLayer()以外的方法。并把init(frame:)方法修改成下面這樣:override?init(frame:?CGRect)?{??super.init(frame:?frame)

circleLayer?=?generateCircleLayer()

lineLayer?=?generateLineLayer()

squareLayer?=?generateSquareLayer()

maskLayer?=?generateMaskLayer()??//??layer.mask?=?maskLayer

layer.addSublayer(circleLayer)??//??layer.addSublayer(lineLayer)

layer.addSublayer(squareLayer)

}

修改完前往animateSquareLayer(),開始解決下一個動畫://?邊框let?b1?=?NSValue(CGRect:?CGRect(x:?0.0,?y:?0.0,?width:?2.0/3.0?*?squareLayerLength,?height:?2.0/3.0??*?squareLayerLength))let?b2?=?NSValue(CGRect:?CGRect(x:?0.0,?y:?0.0,?width:?squareLayerLength,?height:?squareLayerLength))let?b3?=?NSValue(CGRect:?CGRectZero)//?邊框從原始長度的2/3開始放大,到原始大小后再逐漸縮小到0let?boundsAnimation?=?CAKeyframeAnimation(keyPath:?"bounds")

boundsAnimation.values?=?[b1,?b2,?b3]

boundsAnimation.timingFunctions?=?[fadeInSquareTimingFunction,?squareLayerTimingFunction]

boundsAnimation.duration?=?kAnimationDuration

boundsAnimation.keyTimes?=?[0,?1.0-kAnimationDurationDelay/kAnimationDuration,?1.0]

上面的動畫改變了CALayer的邊框。我們創建了一個關鍵幀動畫,從邊長的2/3開始,放大到完整尺寸,再縮小到0。

接下來是背景顏色的動畫://?背景顏色的變化let?backgroundColorAnimation?=?CABasicAnimation(keyPath:?"backgroundColor")

backgroundColorAnimation.fromValue?=?UIColor.whiteColor().CGColorbackgroundColorAnimation.toValue?=?UIColor.fuberBlue().CGColorbackgroundColorAnimation.timingFunction?=?squareLayerTimingFunction

backgroundColorAnimation.fillMode?=?kCAFillModeBoth

backgroundColorAnimation.beginTime?=?kAnimationDurationDelay?*?2.0?/?kAnimationDuration

backgroundColorAnimation.duration?=?kAnimationDuration?/?(kAnimationDuration?-?kAnimationDurationDelay)

注意這里的fillMode屬性。由于beginTime不是零,動畫會把開始和結束時的CGColor包含進去。因此,當我們把動畫添加到父CAAnimationGroup里的時候不會閃現不同顏色。

說到CAAnimationGroup,該實現它了://?合成動畫let?groupAnimation?=?CAAnimationGroup()

groupAnimation.animations?=?[boundsAnimation,?backgroundColorAnimation]

groupAnimation.repeatCount?=?Float.infinity

groupAnimation.duration?=?kAnimationDuration

groupAnimation.removedOnCompletion?=?falsegroupAnimation.beginTime?=?beginTime

groupAnimation.timeOffset?=?startTimeOffset

squareLayer.addAnimation(groupAnimation,?forKey:?"looping")

編譯運行,檢查一下我們的進度,嗯看來方形動畫已經順利完成了。

0eb38645aa0535cc195ba63756a54a37.gif

是時候把之前的動畫合并到一起看看效果了!提示:在iOS模擬器里的動畫可能會有些卡頓,因為我們需要在Mac上模擬平時由iOS的GPU完成的工作。如果你的電腦不能流暢運行動畫,試著縮小模擬器的屏幕大小,或者在真機上測試。

遮罩層

首先取消init(frame:)和startAnimating()里所有注釋。

把所有動畫組合到一起,我們重新編譯運行一下Fuber。

5c79919f5c5609719bba47d8b6b2915c.gif

看起來好像還是差點意思?cricleLayer的縮小消失太過突然。幸運的是,遮罩層動畫可以修正這個問題,讓它平滑地縮小。

定位到animateMaskLayer()添加下面的代碼://?邊框縮小let?boundsAnimation?=?CABasicAnimation(keyPath:?"bounds")

boundsAnimation.fromValue?=?NSValue(CGRect:?CGRect(x:?0.0,?y:?0.0,?width:?radius?*?2.0,?height:?radius?*?2))

boundsAnimation.toValue?=?NSValue(CGRect:?CGRect(x:?0.0,?y:?0.0,?width:?2.0/3.0?*?squareLayerLength,?height:?2.0/3.0?*?squareLayerLength))

boundsAnimation.duration?=?kAnimationDurationDelay

boundsAnimation.beginTime?=?kAnimationDuration?-?kAnimationDurationDelay

boundsAnimation.timingFunction?=?circleLayerTimingFunction

上面的代碼用于設定遮罩層邊界動畫。別忘了,當遮罩層的邊界改變時,整個AnimatedULogoView都會被遮擋,因為它作用于所有子層。

現在我們來實現圓角動畫,保持遮罩是圓形的://?邊角弧度let?cornerRadiusAnimation?=?CABasicAnimation(keyPath:?"cornerRadius")

cornerRadiusAnimation.beginTime?=?kAnimationDuration?-?kAnimationDurationDelay

cornerRadiusAnimation.duration?=?kAnimationDurationDelay

cornerRadiusAnimation.fromValue?=?radius

cornerRadiusAnimation.toValue?=?2cornerRadiusAnimation.timingFunction?=?circleLayerTimingFunction

把這兩個動畫合成為一個CAAnimationGroup,這個層就完成了://?合成動畫let?groupAnimation?=?CAAnimationGroup()

groupAnimation.removedOnCompletion?=?falsegroupAnimation.fillMode?=?kCAFillModeBoth

groupAnimation.beginTime?=?beginTime

groupAnimation.repeatCount?=?Float.infinity

groupAnimation.duration?=?kAnimationDuration

groupAnimation.animations?=?[boundsAnimation,?cornerRadiusAnimation]

groupAnimation.timeOffset?=?startTimeOffset

maskLayer.addAnimation(groupAnimation,?forKey:?"looping")

編譯運行。

a517c21442995ddefd23ac3082c9621d.gif

看起來不錯!

教程的上半部分至此結束,關于背景網格的水波效果會在下一篇教程中介紹。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/531589.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/531589.shtml
英文地址,請注明出處:http://en.pswp.cn/news/531589.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

java中產生對象的兩種方式

/** 普通new對象的過程!*/Person pp new Person();System.out.println(pp);/** 利用代用參數的構造器產生對象實例!* 首先獲得相應帶參數的構造器,然后利用構造器產生對象實例!*/pclass Class.forName("get_class_method.P…

智慧屏用鴻蒙的生態,緊隨鴻蒙OS手機版 ,智慧屏為什么對鴻蒙生態這么重要?...

原標題:緊隨鴻蒙OS手機版 ,智慧屏為什么對鴻蒙生態這么重要?12 月 21 日,華為正式發布了兩款智慧屏新品,智慧屏 S 系列和車載智慧屏,前者是智慧屏的新系列,后者則是新開辟的車機產品線。沒有意外…

java中反射機制通過字節碼文件對象獲取字段和函數的方法

pclass Class.forName("get_class_method.Person");//Field ageField pclass.getField("age");//因為age成員變量是私有的,所以會產生NoSuchFieldException異常Field ageField pclass.getDeclaredField("age");//獲得該對象反映此…

MySQL不能插入中文字符及中文字符亂碼問題

MySQL的默認編碼是Latin1,不支持中文,要支持中午需要把數據庫的默認編碼修改為gbk或者utf8。在安裝后MySQL之后,它的配置文件不是很給力,不知道你們的是不是,反正我的是! 開始插入中文字符的時候出現如下錯…

android計算距離頂部的距離,(lua版)計算距離的邏輯是從Android的提供的接口(Location.distanceBetween)中拔來的,應該是最精確的方法了...

---coding by yuangu(lifulinghanaol.com)--用于計算2個pgs之間的距離function computeDistance(lat1, lon1,lat2, lon2)-- Based on http://www.ngs.noaa.gov/PUBS_LIB/inverse.pdf-- using the "Inverse Formula" (section 4)local MAXITERS 20;-- Convert lat/lo…

codeforces C. Bits(數學題+或運算)

題意:給定一個區間,求區間中的一個數,這個數表示成二進制的時候,數字1的個數最多! 如果有多個這樣的數字,輸出最小的那個! 思路:對左區間的這個數lx的二進制 從右往左將0變成1&#…

密碼與確認密碼自動驗證html,HTML確認密碼

今天準備分享一個小知識點,就是確認登錄界面輸入戶名: 輸入密碼: 確認密碼: function validate() {var pw1 document.getElementById("pw1").value;var pw2 document.getElementById("pw2").value;if(pw1 …

實現單詞大小寫不敏感的正則表達式的匹配!

//實現單詞大小寫不敏感的正則表達式的匹配! //方法1: tmp "java java JavaJAVA"; px Pattern.compile("java", Pattern.CASE_INSENSITIVE); mx px.matcher(tmp); System.out.println(mx.replaceAll("JAVA")); //方法二…

r語言 發送郵件html,r語言讀取數據的方法

R 對于基于 SQL 語言的關系型數據庫有良好的支持,這些數據庫既有商業數據庫 Oracle、Microsoft SQL Server、IBM DB2 等,也包含在 GNUGeneral Public License (GPL) 下發布的 MySQL 等開源數據庫。RMySQL 包中提供了到 MySQL 數據庫的接口;RO…

正則表達式之IP地址檢驗

String ipRegex "^(\\d|[1-9]\\d|1\\d*|2[0-4]\\d|25[0-5])(\\.\\1){3}$"; /* * \\d|[1-9]\\d|1\\d*|2[0-4]\\d|25[0-5] * 該段的數字只有一位的時候,兩位數字的時候,三位數字的時候(1開頭的和2開頭的) * \\1 表示向前…

eclipse開發web應用程序步驟(圖解)

*運行環境(也就是服務器的選擇) 環境搭建好之后開始編寫web程序!然后右鍵->Run as -> Run on Server! 轉載于:https://www.cnblogs.com/hujunzheng/p/4083560.html

android 測光模式,Android Camera1中的對焦與測光

Android Camera1開發系列連載:Android Camera1詳解Android Camera1顯示預覽的四種方式對焦模式在使用特定的對焦模式的時候,必須確保相機支持該模式,相機支持的對焦模式可以通過Parameters#getFocusMode接口來獲取:常用的對焦模式…

eclipes創建一個web項目web.xml不能自動更新的原因(web.xml和@WebServlet的作用)

在eclipse中創建一個Web項目的時候,雖然有web.xml生成,但是再添加Servlet類文件的時候總是看不見web.xml的更新,所以異常的郁悶!上網查了查,原來我們在創建Web項目的時候,會彈出一個對話框,“Dy…

android貝塞爾曲線多點,Canvas 貝塞爾曲線的多點波動

JavaScript語言:JaveScriptBabelCoffeeScript確定function Ball(x, y, radius) {this.x x;this.y y;this.radius radius;this.vx 20;this.vy 10;}Ball.prototype.draw function(ctx) {ctx.save();ctx.translate(this.x, this.y);ctx.fillStyle rgba(255, 255…

html5做一個展示頁面,基于HTML5的WebGL實現json和echarts圖表展現在同一個界面

突然有個想法,如果能把一些用到不同的知識點放到同一個界面上,并且放到一個盒子里,這樣我如果要看什么東西就可以很直接顯示出來,而且這個盒子一定要能打開。我用HT實現了我的想法,代碼一百多行,這么少的代…

android 空白占位符,android textview空格占位符以及一些其他占位符匯總

普通的英文半角空格 no-break space (普通的英文半角空格但不換行) 中文全角空格 (一個中文寬度) ? en空格 (半個中文寬度) ? em空格 (一個中文寬度) 四分之一em空格 (四分之一中文寬度)相比平時的空格( ),nbsp擁有不間斷(non-breaking)特性。即連續的nbs…

html圖片平移,CSS3 按鈕懸停時背景圖片平移入場

JavaScript語言:JaveScriptBabelCoffeeScript確定$(".thumb-next").on(mouseleave, function() {$(".layout-p").text("Hover above, please.");});$(".thumb-next").on(mouseenter, function() {$(".layout-p")…

Netbeans 中創建數據連接池和數據源步驟(及解決無法ping通問題)

1.啟動glassfish服務器, 在瀏覽器的地址欄中輸入 http://localhost:4848 2.首先建立JDBC Connection Pools; 3.new 一個Connectio Pools 4.對General Settings屬性填寫; 5.填寫Datasource Classname:com.mysql.jdbc.jdbc2.optiona…

商品詳情頁html,天天生鮮商品詳情頁HTML+css

body{font-family: Microsoft YaHei;color:#666;font-size:12px;}/*頂部條狀態*/.header_con{height:29px;background-color: #f7f7f7;border-bottom:1px solid #ddd;}.header{width:1200px;height:29px;margin:0 auto;1}.welcome{font:12px/29px Microsoft YaHei UI;float: le…

Netbeans不能正常啟動glassfish或者部署失敗不能運行的問題

錯誤信息:D:\臨時文件\netbeans\WebTest\build\web中部署GlassFish Server 4, deploy, Connection refused: connect, falseD:\臨時文件\netbeans\WebTest\nbproject\build-impl.xml:1048: 尚未部署該模塊。有關詳細信息, 請查看服務器日志。構建失敗 (總時間: 7 秒…