Класс анимации вызывается внутри другого класса - PullRequest
0 голосов
/ 04 апреля 2011

Я создаю настольную игру для Android, и у меня есть анимация, которую я хочу сделать, когда происходит определенное событие движения.

У меня есть класс Boardview, который рисует на поверхности с помощью растровых изображений, и это показывает пользователю правление.

Когда происходит событие движения, этот код выполняется

public boolean onTouchEvent(MotionEvent event) {

    if (event.getAction() == MotionEvent.ACTION_DOWN) {
        Intent animate = new Intent(Tempboardview.this, Moving.class);
        animate.putExtra("xOld", oldStones.get(i).getx());
        animate.putExtra("yOld", oldStones.get(i).gety());
        animate.putExtra("xNew", newStones.get(i).getx());
        animate.putExtra("yNew", newStones.get(i).gety());
        animate.putExtra("color", 0);
        startActivity(animate);
    }
}

где newStones и oldStones являются просто объектами ArrayList, а gety () и getx () возвращают удвоенные значения.

Это мой Переезд

public class Moving extends Activity {

    private static final String TAG = "Animation";
    double xOld = 0, yOld = 0, xNew = 0, yNew = 0, color = 0;

    /** Called when the activity is first created. */@Override
    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);

        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
            WindowManager.LayoutParams.FLAG_FULLSCREEN);

        LayoutInflater inflater = getLayoutInflater();
        addContentView(inflater.inflate(R.layout.move, null),
            new ViewGroup.LayoutParams(800, 480));

        final ImageView image = (ImageView) findViewById(R.id.stoneimager);
        image.setVisibility(View.GONE);
        image.bringToFront();
        Bundle extras = getIntent().getExtras();

        if (extras != null) {
            xOld = extras.getDouble("xOld");
            yOld = extras.getDouble("yOld");
            xNew = extras.getDouble("xNew");
            yNew = extras.getDouble("yNew");
            color = extras.getDouble("color");
        }


        Animation animate = new TranslateAnimation((float) xOld, (float) xNew, (float) yOld, (float) yNew);
        animate.setDuration(1000);
        animate.setStartOffset(0);
        animate.setInterpolator(new LinearInterpolator());
        animate.setRepeatCount(0);
        animate.setFillAfter(true);
        animate.setZAdjustment(Animation.ZORDER_TOP);
        Animation.AnimationListener listener = new Animation.AnimationListener() {

            @Override
            public void onAnimationStart(Animation animation) {
                Log.d("boardtag", "animation started");
                image.setVisibility(View.VISIBLE);
                image.bringToFront();
            }

            @Override
            public void onAnimationRepeat(Animation animation) {
                // TODO Auto-generated method stub

            }

            @Override
            public void onAnimationEnd(Animation animation) {
                // TODO Auto-generated method stub
                image.setVisibility(View.GONE);
                finish();
            }
        };
        animate.setAnimationListener(listener);
        Log.d("boardtag", "animation started");
        image.startAnimation(animate);

    }
}

Проблема в том, что анимация не может выполняться, пока доска все еще отображается. Я использовал манифест Android для изменения темы. Перемещение на прозрачный, но это не сработало.

Любой совет будет оценен.

1 Ответ

1 голос
/ 04 апреля 2011

Возможно, это будет более резко, чем я намереваюсь, но я думаю, что вы полностью злоупотребляете функциями Intent / Activity.Вы должны серьезно подумать над изменением дизайна своего пользовательского интерфейса, чтобы он был более тесно связан с активной деятельностью.

То, что у вас есть выше, должно быть мучительно медленным, так как события движения распространены, а создание действий и рассылка намерений обходятся дорого (относительно).Что вам нужно, так это отдельная основная «игровая» активность, тесно связанная с SurfaceView (возможно, OpenGL, поскольку в ней есть анимация, и это игра).Это действие будет принимать пользовательский ввод (события пользовательского интерфейса) и преобразовывать их в команды рисования для вашего вида поверхности напрямую.

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