Как я могу получить плавный ход с помощью timertask?

Я использовал следующий код для перемещения изображения, он отлично работает, но при перемещении изображения не выполняется плавное перемещение. Кто-нибудь может найти проблему в моем коде?

 handler = new Handler(); 
    t = new Timer(); 
    t.scheduleAtFixedRate(new TimerTask() { 
            public void run() { 
                    handler.post(new Runnable() { 
                            public void run() { 

                                if(left<=400){

                                 left=left+1;

                                     RelativeLayout.LayoutParams rp = new RelativeLayout.LayoutParams(
                                                new ViewGroup.MarginLayoutParams(
                                                        RelativeLayout.LayoutParams.WRAP_CONTENT,
                                                        RelativeLayout.LayoutParams.WRAP_CONTENT));
                                                 rp.setMargins(left, top, 0, 0);
                                                 Train.setLayoutParams(rp);

                                }else{
                                    Toast.makeText(getApplicationContext(), "Toast completed", Toast.LENGTH_SHORT).show();
                                t.cancel();
                                }

                            } 
                    }); 

            } 

    }, 0,30); 

person VSC    schedule 15.11.2011    source источник
comment
Для плавного движения используйте Animation или Open gles.   -  person user370305    schedule 15.11.2011


Ответы (2)


TimerTask и Threads не являются хорошим выбором для последовательных изменений пользовательского интерфейса.

  1. Создайте CustomView, добавив SurfaceView .

  2. Управляйте некоторыми переменными класса для положения представлений.

  3. В onDraw() создайте представление и обновите переменные для следующего позиционирования.

  4. Везде, где вы хотите обновить вручную, вызовите недействительность.

Подписаться это руководство для получения дополнительной помощи.

person Shailendra Singh Rajawat    schedule 15.11.2011
comment
Я пытаюсь использовать метод onDraw(), но результат тот же. public void onDraw(Canvas canvas){ if(mX‹canvas.getWidth()-30){ mX += 1; canvas.drawBitmap (bmptrain, mX, mY, ноль); признать недействительным(); }else{ Toast.makeText(getApplicationContext(), onDraw Completed+a, Toast.LENGTH_SHORT).show(); }} - person VSC; 17.11.2011
comment
вы не должны вызывать invalidate(); внутри onDraw(), потому что это приведет к циклическому частому обновлению(); вызовите недействительность из-за пределов класса, где бы вам это ни понадобилось. сначала прочитать несколько руководств будет очень полезно. - person Shailendra Singh Rajawat; 17.11.2011

ImageView img_animation = (ImageView) findViewById(R.id.imageView1);

    TranslateAnimation animation = new TranslateAnimation(0.0f, 400.0f,0.0f, 0.0f);          //  new TranslateAnimation(xFrom,xTo, yFrom,yTo)
    animation.setDuration(5000);  // animation duration 
    animation.setRepeatCount(5);  // animation repeat count
    animation.setRepeatMode(2);   // repeat animation (left to right, right to left )
    //animation.setFillAfter(true);      

    img_animation.startAnimation(animation); 

Анимация лучший плавный переход!! Попробуй это !!

person Aung Aung Swe    schedule 06.03.2014