Создание пользовательского эффекта анимации просмотра кнопок с помощью Thread в Android? - PullRequest
0 голосов
/ 20 декабря 2011

В моей основной деятельности у меня есть кнопка с текстом «Play».Я хочу, чтобы текст постепенно увеличивался, а затем постепенно уменьшался в размере.Это должно повторяться до нажатия кнопки.Этот эффект должен выглядеть как нежное свечение.

Итак, я попытался использовать 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 ]

1 голос
/ 20 декабря 2011

Вы можете использовать ресурсы анимации для выполнения вышеуказанной задачи.

  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 голос
/ 20 декабря 2011

В написанном вами коде есть пара ошибок:

  1. Вы объявили переменную textSize как int. Таким образом, ваша попытка увеличить значение на 0,1 на каждой итерации бесполезна, потому что значение возвращается к int после каждой операции, отбрасывая только что добавленное вами значение (то есть 25 + = 0,1 -> 25,1, возвращая к int - > 25 ... пена, промыть повторить) Таким образом, значение, которое вы передаете setTextSize(), фактически никогда не меняется.
  2. Ваш код не повторяется. Этот цикл будет выполняться только один раз, пока значение не достигнет 50, а затем остановится. Вы не получите желаемого эффекта «назад / вперед».
  3. Ваши обновления пользовательского интерфейса должны ВСЕГДА происходить в основном потоке / рендеринге. Вы никогда не должны вызывать какие-либо методы обновления (например, setTextSize()) из любого потока, который вы создали. Эту проблему можно решить, используя Handler для управления потоками за вас.

Если вы хотите анимировать кнопку целиком, вы можете посмотреть на структуру анимации, как предлагали другие. Однако, чтобы автоматизировать просто размер текста, вы на правильном пути ... нам просто нужно настроить ваш код, основываясь на пунктах, которые я упомянул выше:

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 выполняется в основном потоке ... так что вы можете обновить там пользовательский интерфейс. postDelayed() заботится о задержках ожидания, поэтому вам вообще не нужно создавать другой поток. Чтобы начать анимацию, просто позвоните

mHandler.postDelayed(mUpdate, 100);

в любом месте вашего кода. Чтобы остановить анимацию в любое время, просто прекратите вызывать postDelayed после каждой итерации.

НТН!

0 голосов
/ 20 декабря 2011

Ищите анимации в Android - это лучший способ создания простых эффектов.

О вашем коде - изменение пользовательского интерфейса разрешено только из основного потока, поэтому вы не можетесоздать еще один поток для анимации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...