首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Android动画副作用:按钮在设置颜色动画时会改变形状

Android动画副作用:按钮在设置颜色动画时会改变形状
EN

Stack Overflow用户
提问于 2016-10-22 20:59:25
回答 1查看 230关注 0票数 1

我在下面发布的所有代码都像我想要的那样工作,只是把它作为参考,也许有人想要实现类似的事情。它很简单,而且有很好的评论。

因此,我正在开发一个应用程序,其中有几个基于xml可绘制资源动态创建的圆形按钮,如下所示:

代码语言:javascript
运行
复制
<?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)中的按钮,如下所示。(如您所见,我在屏幕上随机放置按钮)。它工作得很好:

代码语言:javascript
运行
复制
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);


        }

然后,我想对这些按钮应用一个动画。动画只是通过几次改变按钮的颜色(蓝色->黄色->蓝色-> ...)来使按钮闪烁。这个动画效果也很好(做我想做的事)

代码语言:javascript
运行
复制
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();
}

按钮会像我想要的那样闪烁,除了当我调用changeButtonColor()的时候,我的按钮会变成方形。

上面的动画似乎覆盖了setBackgroundResource()所做的事情,然而,我试图通过将setBackgroundResource()放入动画中的许多方法来防止这一点,但没有结果。

有什么建议可以消除这种副作用吗?

EN

回答 1

Stack Overflow用户

发布于 2016-10-22 23:35:43

实际上,我不知道发生这种行为的原因,但我已经实现了一种解决方法。我改变了背景资源,而不是动态地改变颜色。

因此,我定义了另一个资源,如蓝色按钮,但颜色为黄色:

代码语言:javascript
运行
复制
<?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>

然后我只需对资源更改进行动画处理:

代码语言:javascript
运行
复制
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();
}

不管怎样,谢谢你的帮助

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40192459

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档