2009-09-30 33 views
7

bazı tek alan içinde animasyon göstermek kolaydır - BitmapField veya Ekran:
[Blackberry - arka plan görüntüsü/animasyon RIM OS 4.5.0] [1]Blackberry - düzeni animasyonu alanları

Ama ne gerekiyorsa Sadece görüntüler değil, alanlarını hareket ettirin mi?

Kullanılabilir:

  • oyun akışı işlevselliği, satranç gibi, vb
  • uygulama kullanıcı tanımlı düzen puzzle, gibi Google gadget'larında
  • gelişmiş GUI animasyon efektleri Yani

Bu görevimde keşiflerimi değiştirmek isterdim, diğer yandan da başka olasılıkları ve önerileri bilmek isterim.

+0

ben Yayınınızdan görüntüleri kaldırmak zorunda Onları reklam ile. Daha fazla bilgi için http://meta.stackexchange.com/q/263771/215468 adresine bakın. Mümkünse, bunları yeniden yüklemeniz harika olacaktır. Teşekkürler! – Undo

cevap

12

Bu etki kolayca özel düzeni ile yapılmaktadır edilebilir: Kullandığım

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 sınıfının: ImageShack onları çıkarılmış yerine çünkü

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) { 

    } 
}