筆頭。。
          實踐啟示
          posts - 14,comments - 3,trackbacks - 0
          動畫的實現上來說,是設置定時器進行刷新.
          對于Swing程序來說java.swing.Timer類保證了線程在swing調用上的安全性。通過時間參數的設置時間動態定時刷新,
          對于動態往復描繪來說,比如類似于動態的顏色變化,動態的進行透明變化之類的周期性刷新來說,一般需要幾個條件
          1.動畫的周期性
          2.動畫的當前狀態在起始狀態和目標狀態之間
          實現上需要這么幾個參數
          • 起始時間 animation startTime
          • 當前時間 currentime
          • 動畫周期 animation duration
          • 往返因數 fraction

              往返因數fraction

              比如動態調整透明度、動態修改顏色在動畫的過程中可以設定起始與目標值,通過fraction在0-1范圍內進行運算進行調整。
          以算法來描述則為
            起始值設為 init
            目標值為 dest
            實際值為 actual
              actual=init*(1-fraction)+dest*fraction;
            比較明顯的例子為,將顏色從初始顏色動態變化到目標顏色
           
            Color startColor = Color.red;    // where we start
              Color endColor = Color.BLACK;         // where we end
              Color currentColor = startColor;
             ....
             描繪currentColor的一個圓
             在Timer的actionPerform里調整currentColor
             
          // interpolate between start and end colors with current fraction
                  int red = (int)(fraction * endColor.getRed() + 
                          (
          1 - fraction) * startColor.getRed());
                  
          int green = (int)(fraction * endColor.getGreen() + 
                          (
          1 - fraction) * startColor.getGreen());
                  
          int blue = (int)(fraction * endColor.getBlue() + 
                          (
          1 - fraction) * startColor.getBlue());
                  
          // set our new color appropriately
                  currentColor = new Color(red, green, blue);

          通過定時器的時間參數動態調整往返因數

              通過時間參數進行計算
              如下代碼所示,在Timer的actionPerform里實現
                      long currentTime = System.nanoTime() / 1000000;
                      
          long totalTime = currentTime - animationStartTime;
                      //調整周期的起始時間
                      if (totalTime > animationDuration) {
                          animationStartTime 
          = currentTime;
                      }
                      
          float fraction = (float)totalTime / animationDuration;
                      fraction 
          = Math.min(1.0f, fraction);
               注意當前只是計算出了fraction,如何使因子在1-0和0-1之間往復變化呢
              以下代碼實現了該算法
             
              // This calculation will cause alpha to go from 1 to 0 and back to 1
                      
          // as the fraction goes from 0 to 1
                      alpha = Math.abs(1 - (2 * fraction));
                
              //repaint();//重新繪制


          posted on 2008-02-14 12:00 如果有一天de 閱讀(1315) 評論(1)  編輯  收藏 所屬分類: richclient

          FeedBack:
          # re: swing Timer 與 animation 之 技巧一讓往返因數 fraction從1到0再從0到1
          2008-02-17 12:28 | 519virus
          非常不錯呀……   回復  更多評論
            
          主站蜘蛛池模板: 密云县| 敦煌市| 郯城县| 林周县| 贵港市| 新沂市| 信宜市| 张家口市| 炉霍县| 碌曲县| 赞皇县| 和平县| 西宁市| 白沙| 姚安县| 新晃| 宾川县| 曲松县| 仪陇县| 仁怀市| 远安县| 齐齐哈尔市| 福安市| 建昌县| 革吉县| 绥宁县| 通河县| 墨竹工卡县| 西和县| 南昌市| 德钦县| 东海县| 宁陵县| 车险| 开化县| 登封市| 申扎县| 西宁市| 香港| 辽阳市| 临泉县|