2016-10-22 7 views
1

私が欲しがっているような作品はすべて、参考のために入れています。シンプルで、よくコメントされています。Androidアニメーションの副作用:色をアニメーション化するときにボタンの形が変わります

<?xml version="1.0" encoding="utf-8"?> 
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle" > 
<corners 
    android:radius="25dp" 
    /> 
<solid 
    android:color="#0000FF" 
    /> 
<padding 
    android:left="0dp" 
    android:top="0dp" 
    android:right="0dp" 
    android:bottom="0dp" 
    /> 
<size 
    android:width="50dp" 
    android:height="50dp" 
    /> 
</shape> 

そして、配列に格納されたボタンを作成するために使用されている(gameButtons):だから

は、私はこのように定義されたXML描画可能リソースに基づいて動的に作成されたいくつかの丸いボタンを持つアプリケーションを開発しています以下のように。 (あなたが見るように、私はボタンを画面上にランダムに配置しています)。それは正常に動作します:

for(int i = 0; i < (numberOfButtons); i++) 
     { 
     //create a button: 
     Button oneBtn = new Button(this); 

     //get layout reference: 
     RelativeLayout rl = (RelativeLayout) findViewById(R.id.game_window); 
     RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(btnSize, btnSize); 

     //get screen size: 
     Display display = getWindowManager().getDefaultDisplay(); 
     Point size = new Point(); 
     display.getSize(size); 
     int width = size.x; 
     int height = size.y; 

     //randomize button's position: 
     Random r = new Random(); 
     int randX = r.nextInt(height - btnSize); 
     int randY = r.nextInt(width - btnSize); 

     params.leftMargin = randY; 
     params.topMargin = randX; 

     //set button's parameteres: 
     oneBtn.setId(i); 
     oneBtn.setText(String.valueOf(i)); 

     //make the button round, based on drawable/buttonshape.xml: 
     oneBtn.setBackgroundResource(R.drawable.buttonshape); 

     //add button to the view: 
     gameButtons[i] = oneBtn; 
     rl.addView(oneBtn, params); 


     } 

これらのボタンにアニメーションを適用したいと思います。アニメーションはちょうどその色数回(青>黄>青 - > ...) はこのアニメーションは、同様に(私が何をしたいん)

private void changeButtonColor(final Button button){ 

    int animationTime = 800; 

    //set colors rgb->int 
    int blueInt = Color.rgb(0,0,255); 
    int yellowInt = Color.rgb(255,255,0); 

    //craete an animation: 
    ValueAnimator anim = new ValueAnimator(); 
    anim.setIntValues(blueInt, yellowInt, blueInt); 
    anim.setEvaluator(new ArgbEvaluator()); 

    anim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { 
     @Override 
     public void onAnimationUpdate(ValueAnimator valueAnimator) { 

     //animate button's color: 
     button.setBackgroundColor((Integer)valueAnimator.getAnimatedValue()); 
     } 
    }); 

    //final settings to animation an start: 
    anim.setInterpolator(new LinearInterpolator()); 
    anim.setDuration(animationTime); 
    anim.start(); 
} 

とボタンが点滅正常に動作を変更することにより、点滅ボタンを作ります私が呼び出すときに、私のボタンがその形を正方形に変えるという事実を除いて、私は望んでいた。

アニメーションの中にsetBackgroundResource()を置き換えているようですが、アニメーションの中にsetBackgroundResource()を入れて、これを何とかしないようにしています。

この副作用を排除する方法を教えてください。

答えて

0

実際、この動作の理由はわかりませんが、回避策を実装しました。色の変化をアニメーション化するのではなく、バックグラウンドリソースを変更しています。

だから私は青いボタンのようなものの、黄色の色で別のリソース定義されています:

<?xml version="1.0" encoding="utf-8"?> 
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle" > 
<corners 
    android:radius="25dp" 
    /> 
<solid 
    android:color="#FFFF00" 
    /> 
<padding 
    android:left="0dp" 
    android:top="0dp" 
    android:right="0dp" 
    android:bottom="0dp" 
    /> 
<size 
    android:width="50dp" 
    android:height="50dp" 
    /> 
</shape> 

、その後、私はちょうど、リソースの変更をアニメーション表示しています:とにかく

を支援するための

private void changeButtonColor(final Button button){ 

    int animationTime = 800; 

    int yellowResource = R.drawable.buttonshape_yellow; 
    int blueResource = R.drawable.buttonshape; 

    ValueAnimator anim = new ValueAnimator(); 
    anim.setIntValues(blueResource, yellowResource, blueResource, yellowResource, blueResource); 
    anim.setEvaluator(new ArgbEvaluator()); 

    anim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { 
     @Override 
     public void onAnimationUpdate(ValueAnimator valueAnimator) { 
     button.setBackgroundResource((Integer)valueAnimator.getAnimatedValue()); 
     } 
    }); 
    anim.setInterpolator(new LinearInterpolator()); 
    anim.setDuration(animationTime); 
    anim.start(); 
} 

おかげで

関連する問題