Анимация onTouch для Android удалена при ACTION_UP

#java #android #animation

#java #Android #Анимация

Вопрос:

Это должно быть довольно просто, но оказывается сложнее, чем я думал. Как я могу применить ScaleAnimation к представлению и заставить его оставаться на все время нажатия пальцем? Другими словами, пока палец опущен, уменьшайте вид до тех пор, пока палец не будет удален, а затем верните его к исходному размеру? Это то, что я пробовал:

 public void onTouch(View v, MotionEvent event)
{
    switch(event.getAction())
    {
    case MotionEvent.ACTION_DOWN
    {
        v.setAnimation(shrinkAnim);
    }
    case MotionEvent.ACTION_UP
    {
        v.setAnimation(growAnim);
    }
    }
}
  

Если я применю setFillEnabled(true) и setFillAfter(true) , то сжатие останется на неопределенный срок. Если я ее не использую, она на секунду сжимается, а затем возвращается в нормальное состояние. Заранее спасибо

Ответ №1:

Вы забыли break; .

 public void onTouch(View v, MotionEvent event) {
    switch(event.getAction()) {
        case MotionEvent.ACTION_DOWN:
             v.setAnimation(shrinkAnim);
             break;

        case MotionEvent.ACTION_UP:
             v.setAnimation(growAnim);
             break;

        default:
             // never without default!
    }
}
  

Комментарии:

1. я думаю v.startAnimation(shrinkAnim) ; а не v.setAnimation() …??

2. Спасибо за указатель, но даже с перерывом представление остается уменьшенным, если я использую fillEnabled, и длится практически без времени, если я этого не делаю.

3. @TOM: добавь setFillAfter(true) объявление к своей анимации и проверь

4. @Houcine, извините за недоразумение. Под setFillEnabled я также хотел сказать, что я также использовал setFillAfter (true). Если я это сделаю, она останется уменьшенной.

Ответ №2:

Немного неясно, что у вас есть, и в какой комбинации вы не пробовали, поэтому вот пример, который работает:

 Animation shrink, grow;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    //I chose onCreate(), but make the animations however suits you.
    //The animations need only be created once.

    //From 100% to 70% about center
    shrink = new ScaleAnimation(1.0f, 0.7f, 1.0f, 0.7f, ScaleAnimation.RELATIVE_TO_SELF, 0.5f, ScaleAnimation.RELATIVE_TO_SELF,0.5f);
    shrink.setDuration(200);
    shrink.setFillAfter(true);

    //From 70% to 100% about center
    grow = new ScaleAnimation(0.7f, 1.0f, 0.7f, 1.0f, ScaleAnimation.RELATIVE_TO_SELF,0.5f,ScaleAnimation.RELATIVE_TO_SELF,0.5f);
    grow.setDuration(200);
    grow.setFillAfter(true);
}

@Override
public void onTouch(View v, MotionEvent event) {
    switch(event.getAction()) {
    case MotionEvent.ACTION_DOWN:
        v.startAnimation(shrink);
        break;
    case MotionEvent.ACTION_UP:
        v.startAnimation(grow);
        break;
    default:
        break;
    }
}
  

Анимации должны быть определены один раз и использоваться повторно с их setFillAfter(true) набором параметров; это приводит к тому, что рисунок остается в конечном положении. Когда вы применяете анимацию к использованию view startAnimation() , setAnimation() предназначена для анимаций, которые управляют своим собственным временем запуска.

Надеюсь, это поможет!

Комментарии:

1. Работает как шарм, за исключением того, что мне нужно было вернуть true onTouch, иначе анимация не вернется к нормальному состоянию. Спасибо