Урок 20. Анимация

Обсуждение уроков
Quver
Сообщения: 9
Зарегистрирован: 18 сен 2012, 00:37

R.anim.myalpha

Сообщение Quver » 04 окт 2012, 23:41

Как сделать, что бы myalpha.xml и другие xml с папки anim были видны в R.java ?

никак не могу понять, почему они там не прописались, и main.xml в lyaout тоже иногда для R.java недоступен (((

подскажите пожалуйста, как это побороть.

Аватара пользователя
rezak90
Сообщения: 3422
Зарегистрирован: 26 июн 2012, 13:22
Откуда: UA
Контактная информация:

Re: Урок 20. Анимация

Сообщение rezak90 » 04 окт 2012, 23:57

Project - Clean
R.id.team
Политика на форуме запрещена

Quver
Сообщения: 9
Зарегистрирован: 18 сен 2012, 00:37

Re: Урок 20. Анимация

Сообщение Quver » 05 окт 2012, 12:38

Не помогло :(
Сделал всё заново и заработало.

CLUster
Сообщения: 1
Зарегистрирован: 09 окт 2012, 19:49

Re: Урок 20. Анимация

Сообщение CLUster » 09 окт 2012, 19:54

Ребята,у меня почему-то работает только combo??никто не сталкивался с такой проблемой???
потому что остальное не пашет,хотя код переписывал и вручную,и пробовал копировать ничего не помогает(

AHAXOPET
Сообщения: 3
Зарегистрирован: 26 сен 2012, 16:44

Re: Урок 20. Анимация

Сообщение AHAXOPET » 11 окт 2012, 20:30

Добрый день.
Спасибо за подробные уроки.
Не могу разобраться... Он подчеркивает OnCreateContextMenu... и предлагает убрать Override, потому, что
"The method OnCreateContextMenu(ContextMenu, View, ContextMenu.ContextMenuInfo) of type MainActivity must override a superclass method".
Если убрать, то контекстное меню не вызывается. Если копирую целиком код из урока, то на Override не ругается и все работает. Подскажите, если не сложно, где ошибка.
Заранее спасибо.

Код: Выделить всё

package ru.startandroid.develop.p0201simpleanimation;

import android.app.Activity;
import android.os.Bundle;
import android.view.ContextMenu;
import android.view.ContextMenu.ContextMenuInfo;
import android.view.MenuItem;
import android.view.View;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.widget.TextView;

public class MainActivity extends Activity {

	final int Alfa = 1;
	final int Scale = 2;
	final int Trans = 3;
	final int Rotate = 4;
	final int Combo = 5;

	TextView tv;

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

		tv = (TextView) findViewById(R.id.tv);
		registerForContextMenu (tv);
	}
    @Override 
	public void OnCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
		switch (v.getId()) {
		case R.id.tv:
			menu.add(0, Alfa, 0, "Прозрачность");
			menu.add(0, Scale, 0, "Размер");
			menu.add(0, Trans, 0, "Движение");
			menu.add(0, Rotate, 0, "Вращение");
			menu.add(0, Combo, 0, "Комбо");
			break;
		}
		super.onCreateContextMenu(menu, v, menuInfo);	
    }
	
	@Override
	public boolean onContextItemSelected(MenuItem item) {
		Animation anim = null;

		switch (item.getItemId()) {
		case Alfa:
			anim = AnimationUtils.loadAnimation(this, R.anim.myalpha);
			break;
		case Scale:
			anim = AnimationUtils.loadAnimation(this, R.anim.myscale);
			break;
		case Rotate:
			anim = AnimationUtils.loadAnimation(this, R.anim.myrotate);
			break;
		case Trans:
			anim = AnimationUtils.loadAnimation(this, R.anim.mytrans);
			break;
		case Combo:
			anim = AnimationUtils.loadAnimation(this, R.anim.mycombo);
			break;
		}
		tv.startAnimation(anim);
		return super.onContextItemSelected(item);
	}
}

AHAXOPET
Сообщения: 3
Зарегистрирован: 26 сен 2012, 16:44

Re: Урок 20. Анимация

Сообщение AHAXOPET » 11 окт 2012, 23:20

AHAXOPET писал(а): Не могу разобраться...
Извините за беспокойство, разобрался)))

PashaD
Сообщения: 3
Зарегистрирован: 17 окт 2012, 20:00

Re: Урок 20. Анимация

Сообщение PashaD » 21 окт 2012, 00:57

Если кому не трудно, объясните, почему не работает такая анимация?

Код: Выделить всё

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:shareInterpolator="false" >

    <scale
        android:duration="3000"
        android:fromXScale="1.0"
        android:fromYScale="1.0"
        android:pivotX="50%"
        android:pivotY="50%"
        android:toXScale="0.0"
        android:toYScale="1.0" >
    </scale>
    <scale
        android:duration="3000"
        android:fromXScale="0.0"
        android:fromYScale="1.0"
        android:pivotX="50%"
        android:pivotY="50%"
        android:startOffset="3000"
        android:toXScale="1.0"
        android:toYScale="1.0" >
    </scale>

</set>

Аватара пользователя
damager82
Администратор
Сообщения: 1383
Зарегистрирован: 07 янв 2012, 11:32
Контактная информация:

Re: Урок 20. Анимация

Сообщение damager82 » 22 окт 2012, 10:54

PashaD писал(а):Если кому не трудно, объясните, почему не работает такая анимация?
Да, непонятно.
Используйте setAnimationListener, и запускайте вторую отдельно после первой.
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение

AHAXOPET
Сообщения: 3
Зарегистрирован: 26 сен 2012, 16:44

Re: Урок 20. Анимация

Сообщение AHAXOPET » 24 окт 2012, 13:39

Добрый день.
Подскажите, пожалуйста, как можно оптимизировать этот код? Нужна переменная, но какая и где, не могу понять.
Тут три объекта. Радиокнопки определяют, какой именно объект анимируется. Варианты анимации выбираются из меню.

Заранее спасибо.

Код: Выделить всё

package ru.toxa.animation;

import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.animation.AnimationUtils;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends Activity {
	
	 final int alfa = 1;
	 final int scale = 2;
	 final int trans = 3;
	 final int rotate = 4;
	 final int combo1 = 5;
	 final int combo2 = 6;
	 
	 TextView text;
	 Button button;
	 ImageView image;
	 RadioGroup radio;
	 RadioButton radio0, radio1, radio2;
	
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        Toast.makeText(this, "Привет. Нажми Меню!", Toast.LENGTH_SHORT).show();

        text = (TextView) findViewById(R.id.text);
        radio = (RadioGroup) findViewById(R.id.radio);
        image = (ImageView) findViewById(R.id.image);
        button = (Button) findViewById(R.id.button);
        radio0 = (RadioButton) findViewById(R.id.radio0);
        radio1 = (RadioButton) findViewById(R.id.radio1);
        radio2 = (RadioButton) findViewById(R.id.radio2);  
        }
   
    // Создание меню
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.main, menu);
        return super.onCreateOptionsMenu(menu);	
    	}
    
    // обработка нажатий
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
    // TODO Auto-generated method stub
       	switch (item.getItemId()) {
    	case R.id.alfa:
    	//Определяем, какая радиокнопка нажата:
		  
    		switch (radio.getCheckedRadioButtonId()) {
		  	  case R.id.radio0:
		  		  button.startAnimation(AnimationUtils.loadAnimation(this, R.anim.myalpha));
			  break;
		  	  case R.id.radio1:
		  		  text.startAnimation(AnimationUtils.loadAnimation(this, R.anim.myalpha));
			  break;
			  case R.id.radio2:
				  image.startAnimation(AnimationUtils.loadAnimation(this, R.anim.myalpha));
			  break; }
       	break;
    	case R.id.scale:
  	  		switch (radio.getCheckedRadioButtonId()) {
  	  		  case R.id.radio0:
  	  			  button.startAnimation(AnimationUtils.loadAnimation(this, R.anim.myscale));
  	  		  break;
  	  		  case R.id.radio1:
  	  			  text.startAnimation(AnimationUtils.loadAnimation(this, R.anim.myscale));
  	  		  break;
  	  		  case R.id.radio2:
  	  			  image.startAnimation(AnimationUtils.loadAnimation(this, R.anim.myscale));
  	  		  break; }
  	  	break;
    	case R.id.rotate:
	  		switch (radio.getCheckedRadioButtonId()) {
	  		  case R.id.radio0:
	  			  button.startAnimation(AnimationUtils.loadAnimation(this, R.anim.myrotate));
	  		  break;
	  		  case R.id.radio1:
	  			  text.startAnimation(AnimationUtils.loadAnimation(this, R.anim.myrotate));
	  		  break;
	  		  case R.id.radio2:
	  		  	  image.startAnimation(AnimationUtils.loadAnimation(this, R.anim.myrotate));
	  		  break; }
	  	break;
    	case R.id.combo1:
	  		switch (radio.getCheckedRadioButtonId()) {
	  		  case R.id.radio0:
	  		  	   button.startAnimation(AnimationUtils.loadAnimation(this, R.anim.mycombo));
	  		  break;
	  		  case R.id.radio1:
	  		  	   text.startAnimation(AnimationUtils.loadAnimation(this, R.anim.mycombo));
	  		  break;
	  		  case R.id.radio2:
	  		  	   image.startAnimation(AnimationUtils.loadAnimation(this, R.anim.mycombo));
	  		  break; }
	  	break;
    	case R.id.combo2:
	  	    switch (radio.getCheckedRadioButtonId()) {
	  		  case R.id.radio0:
	  			   button.startAnimation(AnimationUtils.loadAnimation(this, R.anim.mycombo2));
	  		  break;
	  		  case R.id.radio1:
	  		  		text.startAnimation(AnimationUtils.loadAnimation(this, R.anim.mycombo2));
	  		  break;
	  		  case R.id.radio2:
	  		  		image.startAnimation(AnimationUtils.loadAnimation(this, R.anim.mycombo2));
	  		  break; }
	    break;
    	}
    return super.onOptionsItemSelected(item);
}
}

Аватара пользователя
damager82
Администратор
Сообщения: 1383
Зарегистрирован: 07 янв 2012, 11:32
Контактная информация:

Re: Урок 20. Анимация

Сообщение damager82 » 24 окт 2012, 17:58

AHAXOPET писал(а):Добрый день. Подскажите, пожалуйста, как можно оптимизировать этот код?
Как вариант:

Создайте метод (например startAnim), который на вход будет брать ID анимации - int.
Внутри:
- в switch определяйте по радиокнопке какой объект будете анимировать, и записывайте его в переменную view типа View
- применяйте к view анимацию, которая пришла на вход

В onOptionsItemSelected можно создать переменную int anim. Ее заполняйте в каждом case в switch, который определяет ID анимации. А после прохождения switch вызывайте метод startAnim и передавайте ему на вход anim.
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение

tyapavel
Сообщения: 11
Зарегистрирован: 09 янв 2012, 01:31

Re: Урок 20. Анимация

Сообщение tyapavel » 04 ноя 2012, 17:58

Подскажите, пожалуйста, как создать анимацию в коде программы, без использования XML. Конкретно - translateAnimation.

Аватара пользователя
damager82
Администратор
Сообщения: 1383
Зарегистрирован: 07 янв 2012, 11:32
Контактная информация:

Re: Урок 20. Анимация

Сообщение damager82 » 06 ноя 2012, 16:35

tyapavel писал(а):Подскажите, пожалуйста, как создать анимацию в коде программы, без использования XML. Конкретно - translateAnimation.

Код: Выделить всё

		TextView tv = (TextView) findViewById(R.id.textView1);
		TranslateAnimation transAnimation= new TranslateAnimation(0, 200, 0, 200);
		transAnimation.setDuration(1000);
		//transAnimation.setFillAfter(true);
		tv.startAnimation(transAnimation);
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение

Android
Сообщения: 5
Зарегистрирован: 08 ноя 2012, 01:05

Re: Урок 20. Анимация

Сообщение Android » 08 ноя 2012, 01:32

Подскажите, пожалуйста, почему не идет анимация из translate? На экране появляется квадрат, но он не реагирует на щелчок мыши(

import android.os.Bundle;
import android.app.Activity;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.view.Menu;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewTreeObserver;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.widget.ImageView;

public class MainActivity extends Activity {

Animation animation ;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(new MyView(this));

// ImageView image = (ImageView) findViewById(R.id.image);


}
class MyView extends View {
Paint p;
// координаты для рисования квадрата

float x = 100;
float y = 100;
int side = 100;

public MyView(Context context) {
super(context);
p = new Paint();
p.setColor(Color.GREEN);
}

protected void onDraw(Canvas canvas) {
// рисуем квадрат
canvas.drawRect(x, y, x + side, y + side, p);
invalidate();
}


public boolean onTouchEvent(MotionEvent event)
{
float evX = event.getX();
float evY = event.getY();
if (evX >= x && evX <= x + side && evY >= y && evY <= y + side) {

animation = AnimationUtils.loadAnimation(getApplicationContext(), R.anim.translate);
animation.start();

} return true;

}
}
}

Аватара пользователя
damager82
Администратор
Сообщения: 1383
Зарегистрирован: 07 янв 2012, 11:32
Контактная информация:

Re: Урок 20. Анимация

Сообщение damager82 » 09 ноя 2012, 11:11

Android писал(а):Подскажите, пожалуйста, почему не идет анимация из translate? На экране появляется квадрат, но он не реагирует на щелчок мыши(
Анимация ни к чему не относится. Добавьте setAnimation(animation); перед animation.start();. Тогда она будет работать с текущим View, но не с квадратом.
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение

Android
Сообщения: 5
Зарегистрирован: 08 ноя 2012, 01:05

Re: Урок 20. Анимация

Сообщение Android » 09 ноя 2012, 13:17

damager82 писал(а):
Android писал(а):Подскажите, пожалуйста, почему не идет анимация из translate? На экране появляется квадрат, но он не реагирует на щелчок мыши(
Анимация ни к чему не относится. Добавьте setAnimation(animation); перед animation.start();. Тогда она будет работать с текущим View, но не с квадратом.

damager82, спасибо, заработало, по щелчку на квадрат идет анимация)))) только не понял, что значит "Тогда она будет работать с текущим View, но не с квадратом", и если что-то не так, то как реализовать c квадратом? Может быть есть у кого-нибудь исходники на подобную реализацию или что-то подобное!!

Vic
Сообщения: 6
Зарегистрирован: 14 ноя 2012, 08:39

Re: Урок 20. Анимация

Сообщение Vic » 14 ноя 2012, 08:42

PashaD писал(а):Если кому не трудно, объясните, почему не работает такая анимация?

Код: Выделить всё

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:shareInterpolator="false" >

    <scale
        android:duration="3000"
        android:fromXScale="1.0"
        android:fromYScale="1.0"
        android:pivotX="50%"
        android:pivotY="50%"
        android:toXScale="0.0"
        android:toYScale="1.0" >
    </scale>
    <scale
        android:duration="3000"
        android:fromXScale="0.0"
        android:fromYScale="1.0"
        android:pivotX="50%"
        android:pivotY="50%"
        android:startOffset="3000"
        android:toXScale="1.0"
        android:toYScale="1.0" >
    </scale>

</set>
Может, потому, что на странице хелпа написано
The file must have a single root element: either an <alpha>, <scale>, <translate>, <rotate>, or <set> element that holds a group (or groups) of other animation elements (even nested <set> elements).
Нужно только в корне размещать 1 элемент, а остальные внутри set?

Аватара пользователя
damager82
Администратор
Сообщения: 1383
Зарегистрирован: 07 янв 2012, 11:32
Контактная информация:

Re: Урок 20. Анимация

Сообщение damager82 » 14 ноя 2012, 12:38

Android писал(а):только не понял, что значит "Тогда она будет работать с текущим View, но не с квадратом", и если что-то не так, то как реализовать c квадратом? Может быть есть у кого-нибудь исходники на подобную реализацию или что-то подобное!!
Анимация работает с View. А нарисованный квадрат - это не View, это рисунок. Чтобы применять какие-либо трансформации к нему надо пересчитывать координаты и перерисовывать.
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение

Android
Сообщения: 5
Зарегистрирован: 08 ноя 2012, 01:05

Re: Урок 20. Анимация

Сообщение Android » 14 ноя 2012, 21:31

damager82 писал(а):
Android писал(а):только не понял, что значит "Тогда она будет работать с текущим View, но не с квадратом", и если что-то не так, то как реализовать c квадратом? Может быть есть у кого-нибудь исходники на подобную реализацию или что-то подобное!!
Анимация работает с View. А нарисованный квадрат - это не View, это рисунок. Чтобы применять какие-либо трансформации к нему надо пересчитывать координаты и перерисовывать.

Понял, спасибо !!

Android
Сообщения: 5
Зарегистрирован: 08 ноя 2012, 01:05

Re: Урок 20. Анимация

Сообщение Android » 14 ноя 2012, 22:29

По идее этот код должен рисовать несколько шаров и движение их. Но получаю просто белый экран. Спасибо заранее, если кто-нибудь посмотрит!


public class MainActivity extends Activity {
Random r = new Random();
ArrayList<Circle> circles = new ArrayList<Circle>();


@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(new MyView(this));
}


class MyView extends View {
// private final int RADIUS = 46;
public Paint p;
public float RADIUS;

public MyView(Context context)
{
super(context);
p = new Paint();
p.setColor(Color.GREEN);
}
class Circle{

public float centerX;
public float centerY;

public int speedX;
public double speedY;

Circle (float centerX, float centerY, float RADIUS)
{

this.centerX = centerX;
this.centerY = centerY;
this.RADIUS = RADIUS;
for (int i = 0; i < 4; i++) {
Circle s = new Circle(r.nextInt(100),r.nextInt(100),r.nextInt(50));
circles.add(s);
}
}

protected void onSizeChanged(int w, int h, int oldW, int oldH)
{
centerX = w / 2;
centerY = h / 2;
}

}

protected void onDraw(Canvas c) {
int w = getWidth();
int h = getHeight();

for( int i=0; i<circles.size(); i++) {

circles.get(i).centerX += circles.get(i).speedX;
circles.get(i).centerY += circles.get(i).speedY;
float rightLimit = w - RADIUS;
float bottomLimit = h - RADIUS;

if (circles.get(i).centerX >= rightLimit) {
circles.get(i).centerX = rightLimit;
circles.get(i).speedX *= -1;
}
if (circles.get(i).centerX <= RADIUS) {
circles.get(i).centerX = RADIUS;
circles.get(i).speedX *= -1;
}
if (circles.get(i).centerY >= bottomLimit) {
circles.get(i).centerY = bottomLimit;
circles.get(i).speedY *= -1;
}
if (circles.get(i).centerY <= RADIUS) {
circles.get(i).centerY = RADIUS;
circles.get(i).speedY *= -1;
}
c.drawCircle(circles.get(i).centerX, circles.get(i).centerY, RADIUS, p );
postInvalidateDelayed(200);
}
}
}}

tweety
Сообщения: 1
Зарегистрирован: 16 ноя 2012, 10:59

Re: Урок 20. Анимация

Сообщение tweety » 16 ноя 2012, 11:08

Проблема та же что и у Lorkn, но не могу решить.

запись в лог поставлена, метод не вызывается, строка registerForContextMenu(tv); есть
не подскажите в чем проблема может быть?

Ответить