#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, иначе анимация не вернется к нормальному состоянию. Спасибо