2009-09-30 80 views
7

可以很容易地顯示一個領域內的一些動畫 - BitmapField或屏幕:
[黑莓 - 背景圖片/動畫RIM OS 4.5.0] [1]黑莓 - 菲爾茲佈局動畫

但是如果你需要什麼移動字段,不只是圖像?

可能會用到:

  • 遊戲的工作流功能,如象棋,拼圖等
  • 應用用戶定義的佈局,像谷歌小工具
  • 增強的圖形用戶界面的動畫效果

所以,我想在這個任務中交換我的見解,另一方面,我想知道其他任何可能性和建議。

+0

我不得不從您的文章中刪除圖像,因爲ImageShack的刪除了他們,並取代他們與廣告。有關更多信息,請參閱http://meta.stackexchange.com/q/263771/215468。如果可能的話,你最好重新上傳它們。謝謝! – Undo 2015-09-22 00:14:46

回答

12

這種作用可能與自定義佈局很容易achived:我用

class AnimatedManager extends Manager { 
    int ANIMATION_NONE = 0; 
    int ANIMATION_CROSS_FLY = 1; 
    boolean mAnimationStart = false; 
    Bitmap mBmpBNormal = Bitmap.getBitmapResource("blue_normal.png"); 
    Bitmap mBmpBFocused = Bitmap.getBitmapResource("blue_focused.png"); 
    Bitmap mBmpRNormal = Bitmap.getBitmapResource("red_normal.png"); 
    Bitmap mBmpRFocused = Bitmap.getBitmapResource("red_focused.png"); 
    Bitmap mBmpYNormal = Bitmap.getBitmapResource("yellow_normal.png"); 
    Bitmap mBmpYFocused = Bitmap.getBitmapResource("yellow_focused.png"); 
    Bitmap mBmpGNormal = Bitmap.getBitmapResource("green_normal.png"); 
    Bitmap mBmpGFocused = Bitmap.getBitmapResource("green_focused.png"); 
    int[] width = null; 
    int[] height = null; 
    int[] xPos = null; 
    int[] yPos = null; 
    BitmapButtonField mBButton = new BitmapButtonField(mBmpBNormal, 
      mBmpBFocused); 
    BitmapButtonField mRButton = new BitmapButtonField(mBmpRNormal, 
      mBmpRFocused); 
    BitmapButtonField mYButton = new BitmapButtonField(mBmpYNormal, 
      mBmpYFocused); 
    BitmapButtonField mGButton = new BitmapButtonField(mBmpGNormal, 
      mBmpGFocused); 

    public AnimatedManager() { 
     super(USE_ALL_HEIGHT | USE_ALL_WIDTH); 
     add(mBButton); 
     add(mRButton); 
     add(mYButton); 
     add(mGButton); 
     width = new int[] { mBButton.getPreferredWidth(), 
       mRButton.getPreferredWidth(), 
       mYButton.getPreferredWidth(), 
       mGButton.getPreferredWidth() }; 

     height = new int[] { mBButton.getPreferredHeight(), 
       mRButton.getPreferredHeight(), 
       mYButton.getPreferredHeight(), 
       mGButton.getPreferredHeight() }; 

     xPos = new int[] { 0, getPreferredWidth() - width[1], 0, 
       getPreferredWidth() - width[3] }; 
     yPos = new int[] { 0, 0, getPreferredHeight() - height[2], 
       getPreferredHeight() - height[3] }; 

     Timer timer = new Timer(); 
     timer.schedule(mAnimationTask, 0, 100); 
    } 

    TimerTask mAnimationTask = new TimerTask() { 
     public void run() { 
      UiApplication.getUiApplication().invokeLater(new Runnable() { 
       public void run() { 
        updateLayout(); 
       }; 
      }); 
     }; 
    }; 

    MenuItem mAnimationMenuItem = new MenuItem("Start", 0, 0) { 
     public void run() { 
      mAnimationStart = true; 
     }; 
    }; 

    protected void makeMenu(Menu menu, int instance) { 
     super.makeMenu(menu, instance); 
     menu.add(mAnimationMenuItem); 
    } 

    public int getPreferredHeight() { 
     return Display.getHeight(); 
    } 

    public int getPreferredWidth() { 
     return Display.getWidth(); 
    } 

    protected void sublayout(int width, int height) { 
     width = getPreferredWidth(); 
     height = getPreferredHeight(); 

     if (getFieldCount() > 3) { 
      Field first = getField(0); 
      Field second = getField(1); 
      Field third = getField(2); 
      Field fourth = getField(3); 

      layoutChild(first, this.width[0], this.height[0]); 
      layoutChild(second, this.width[1], this.height[1]); 
      layoutChild(third, this.width[2], this.height[2]); 
      layoutChild(fourth, this.width[3], this.height[3]); 

      if (mAnimationStart) { 
       boolean anim1 = performLayoutAnimation(0, 
         width - this.width[0], 
         height - this.height[0]); 
       boolean anim2 = performLayoutAnimation(1, 0, 
         height - this.height[1]); 
       boolean anim3 = performLayoutAnimation(2, 
         width - this.width[2], 0); 
       boolean anim4 = performLayoutAnimation(3, 0, 0); 
       mAnimationStart = anim1 || anim2 || anim3 || anim4; 
      } 
      setPositionChild(first, xPos[0], yPos[0]); 
      setPositionChild(second, xPos[1], yPos[1]); 
      setPositionChild(third, xPos[2], yPos[2]); 
      setPositionChild(fourth, xPos[3], yPos[3]); 

     } 

     setExtent(width, height); 
    } 

    boolean performLayoutAnimation(int fieldIndex, int x, int y) { 

     boolean result = false; 
     if (xPos[fieldIndex] > x) { 
      xPos[fieldIndex] -= 2; 
      result = true; 
     } else if (xPos[fieldIndex] < x) { 
      xPos[fieldIndex] += 2; 
      result = true; 
     } 

     if (yPos[fieldIndex] > y) { 
      yPos[fieldIndex] -= 1; 
      result = true; 
     } else if (yPos[fieldIndex] < y) { 
      yPos[fieldIndex] += 1; 
      result = true; 
     } 
     return result; 
    } 
} 

BitmapButtonField類:

class BitmapButtonField extends ButtonField { 
    Bitmap mNormal; 
    Bitmap mFocused; 

    int mWidth; 
    int mHeight; 

    public BitmapButtonField(Bitmap normal, Bitmap focused) { 
     super(CONSUME_CLICK); 
     mNormal = normal; 
     mFocused = focused; 
     mWidth = mNormal.getWidth(); 
     mHeight = mNormal.getHeight(); 
     setMargin(0, 0, 0, 0); 
     setPadding(0, 0, 0, 0); 
     setBorder(BorderFactory.createSimpleBorder(new XYEdges(0, 0, 0, 0))); 
     setBorder(VISUAL_STATE_ACTIVE, BorderFactory 
       .createSimpleBorder(new XYEdges(0, 0, 0, 0))); 
    } 

    protected void paint(Graphics graphics) { 
     Bitmap bitmap = null; 
     switch (getVisualState()) { 
     case VISUAL_STATE_NORMAL: 
      bitmap = mNormal; 
      break; 
     case VISUAL_STATE_FOCUS: 
      bitmap = mFocused; 
      break; 
     case VISUAL_STATE_ACTIVE: 
      bitmap = mFocused; 
      break; 
     default: 
      bitmap = mNormal; 
     } 
     graphics.drawBitmap(0, 0, bitmap.getWidth(), bitmap.getHeight(), 
       bitmap, 0, 0); 
    } 

    public int getPreferredWidth() { 
     return mWidth; 
    } 

    public int getPreferredHeight() { 
     return mHeight; 
    } 

    protected void layout(int width, int height) { 
     setExtent(mWidth, mHeight); 
    } 

    protected void applyTheme(Graphics arg0, boolean arg1) { 

    } 
}