在Android中使用Thread创建自定义按钮视图动画效果?

时间:2011-12-20 04:34:18

标签: android multithreading animation button

在我的主要活动中,我有一个带有“播放”文本的按钮。我希望文本逐渐增长,然后逐渐缩小。这应该循环直到单击按钮。这种效果看起来应该像温柔的光芒。

所以,我尝试使用Thread来实现这个目标:

// Play Button Animation Thread
Thread playAnimation = new Thread() {
    public void run() {
        try {
            int textSize = 25;
            while (textSize <= 50) {
                playBtn.setTextSize(textSize);
                textSize += .10;
                sleep(100);
            }   
        } 

        catch (InterruptedException e) {
            e.printStackTrace();
        } 

        finally {

        }

    }
};

然后,我用:

调用了该线程
playAnimation.start();

它不能像我一样工作,但现在我认为可能有更好的方法。任何帮助表示赞赏。

3 个答案:

答案 0 :(得分:1)

您可以使用动画资源执行上述任务。

  1. 您需要创建动画资源文件(anim_play.xml)并将其放在res / anim文件夹中。

    <?xml version="1.0" encoding="utf-8"?>
      <scale xmlns:android="http://schemas.android.com/apk/res/android"
       android:duration="1000"
       android:repeatCount="infinite"
       android:fromXScale="1.0"
       android:fromYScale="1.0"
       android:toXScale="1.2"
       android:toYScale="1.2" >
      </scale>
    
  2. 将动画设置为特定视图。

     play_btn = (Button) findViewById(R.id.btn_play);
     playAnim = AnimationUtils.loadAnimation(this, R.anim.anim_play); 
     play_btn.startAnimation(playAnim);
    
  3. 当用户点击按钮时删除动画。

        play_btn.setOnClickListener(new OnClickListener() {
    
        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            play_btn.clearAnimation();
        }
    });
    

答案 1 :(得分:1)

您编写的代码存在一些问题:

  1. 您已将textSize变量声明为int。因此,每次迭代尝试将值递增0.1都是徒劳的,因为在每次操作后将值转换回int,从而减去刚刚添加的值(即25 + = 0.1 - > 25.1,强制转换为int - &gt; 25 ...泡沫,冲洗重复)。因此,您传递给setTextSize()的值实际上从未发生变化。
  2. 您的代码不会重复。该循环只运行一次,直到值达到50,然后停止。你不会得到你想要的前后效果。
  3. 您对UI的更新应始终在主/呈现线程上进行。您永远不应该从您创建的任何线程中调用任何更新方法(如setTextSize())。这可以通过使用Handler来管理线程来解决。
  4. 如果您想要整个按钮进行动画处理,您可以像其他人建议的那样查看动画框架。但是,要自动化只需文本大小,您就走在正确的道路上......我们只需根据上面提到的点调整您的代码:

    Handler mHandler = new Handler();
    boolean mReverse = false;
    Runnable mUpdate = new Runnable() {
      @Override
      public void run() {
        float current = playBtn.getTextSize();
        if(mReverse) {
          current -= 0.1;
          playBtn.setTextSize(current);
          mReverse = (current <= 25);
        } else {
          current += 0.1;
          playBtn.setTextSize(current);
          mReverse = (current >= 50);
        }
    
        mHandler.postDelayed(mUpdate, 100);
      }
    }
    

    Handler在主线程上创建,Runnable内的所有代码都在主线程上执行...因此您可以在那里更新UI。 postDelayed()负责等待延迟,因此您根本不需要创建另一个线程。要开始制作动画,请致电

    mHandler.postDelayed(mUpdate, 100);
    

    代码中的任何位置。要随时停止动画,只需在每次迭代后停止调用postDelayed

    HTH!

答案 2 :(得分:0)

在android中查找animations - 这是创建简单效果的最佳方式。

关于您的代码 - 只允许从主线程更改用户界面,因此您无法为动画创建另一个线程。