Подтвердить что ты не робот

Как легко перемещать ImageView слева направо в Android?

Мне нужно сделать слайд ImageView слева направо от экрана с гладкой анимацией (я хочу, чтобы ImageView был видимым во время перехода) Я попытался со следующим кодом:

Display display = getWindowManager().getDefaultDisplay();
Point size = new Point();
display.getSize(size);
int width = size.x;

camion.animate()
    .translationX(width)
    .setDuration(2000)
    .setInterpolator(new LinearInterpolator())
    .setListener(new AnimatorListenerAdapter() {
        @Override
        public void onAnimationEnd(Animator animation) {
            super.onAnimationEnd(animation);
            //camion.setVisibility(View.GONE);
        }
    });

ImageView перемещается, но анимация является лагги и негладкой, как я хочу. Что я делаю неправильно в коде?

4b9b3361

Ответ 1

Создание такой анимации анимации анимации просто. Просто выполните шаги,

Шаг 1

Создайте каталог anim внутри каталога res и поместите его как slide.xml

<?xml version="1.0" encoding="utf-8"?>
<set
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:interpolator="@android:anim/linear_interpolator"
    android:fillAfter="true">

   <translate
        android:fromXDelta="0%p"
        android:toXDelta="75%p"
        android:duration="800" />
</set>

Вы можете настроить анимацию, изменив два атрибута fromXDelta и toXDelta. % p относится к к родительскому, что просто означает, что он будет перемещать изображение 75% относительно родителя.

Шаг 2

// Refer the ImageView like this
imageView = (ImageView) findViewById(R.id.img);

// Load the animation like this
animSlide = AnimationUtils.loadAnimation(getApplicationContext(),
                    R.anim.slide);

// Start the animation like this
imageView.startAnimation(animSlide);

Вы также можете setInterpolator() и setListeners(), если хотите. Я не показал их здесь, чтобы это было просто. Если вам нужно, просто дайте мне знать.

Примечание

Как вы уже неоднократно упоминали, вы испытываете laggy animation. Я тестировал эту анимацию на 3 реальных устройствах и 2 эмуляторах, а анимация была гладкой маслянистой для всех. Протестировано на низкоуровневых устройствах, таких как Moto E, на высокопроизводительные устройства, такие как Nexus 5 и Galaxy S6.

Если у вас все еще есть лаг, запускающий этот код, значит, причиной является тестовое устройство. Код идеален.

UPDATE

Я только что проверил, что мой Moto G работает на Lollipop, анимация работает плавно. Это очень маленькая и легкая анимация, и она никогда не должна быть лагги. Если вы все еще получаете задержку, тогда это должно быть устройство, которое вы тестируете, или какой-либо другой фрагмент кода в этом мероприятии, делающий пользовательский интерфейс медленным или не отвечающим.

Попробуйте проверить, какой из них применим к вам,

  • Я тестировал в общей сложности 6 устройств теперь без каких-либо задержек. Таким образом, вы можете быть уверены, что ваше производственное приложение не будет иметь никакого запаздывания, это может быть ваше устройство, которое медленно
  • Если вы выполняете тяжелые операции, такие как доступ к файловой системе, базе данных или любой другой тяжелой операции, это должно замедлять поток пользовательского интерфейса, и вы теряете кадры. Попробуйте использовать AsyncTask для этих тяжелых операций

Ответ 2

TranslateAnimation animate = new TranslateAnimation(0, -view.getWidth(), 0, 0);
animate.setDuration(500);
animate.setFillAfter(true);
view.startAnimation(animate);

Ответ 3

Попробуйте это. Он будет анимировать изображение.

        ImageView img_animation = (ImageView) findViewById(R.id.img_animation);
        Display display = getWindowManager().getDefaultDisplay();
        float width = display.getWidth();
        TranslateAnimation animation = new TranslateAnimation(0, width - 50, 0, 0); // new TranslateAnimation(xFrom,xTo, yFrom,yTo)
        animation.setDuration(1000); // 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); // start animation

Ответ 4

попробуйте код ниже

TranslateAnimation animation = new TranslateAnimation(0.0f, 0.0f, 0.0f, 1500.0f); // new TranslateAnimation (float fromXDelta,float toXDelta, float fromYDelta, float toYDelta)
animation.setDuration(2000); // animation duration
animation.setRepeatCount(1); // animation repeat count if u repeat only once set to 1 if u don't repeat set to 0
animation.setFillAfter(false);
your_view .startAnimation(animation);//your_view for mine is imageView  

Ответ 5

public class MainActivity extends Activity {

       int windowwidth;
       int windowheight;

       private LayoutParams layoutParams;

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

              windowwidth = getWindowManager().getDefaultDisplay().getWidth();
              windowheight = getWindowManager().getDefaultDisplay().getHeight();
              final ImageView img = (ImageView) findViewById(R.id.imageView1);

              img.setOnTouchListener(new View.OnTouchListener() {

                     @Override
                     public boolean onTouch(View v, MotionEvent event) {
                           LayoutParams layoutParams = (LayoutParams) img
                                         .getLayoutParams();
                           switch (event.getAction()) {
                           case MotionEvent.ACTION_DOWN:
                                  break;
                           case MotionEvent.ACTION_MOVE:
                                  int x_cord = (int) event.getRawX();
                                  int y_cord = (int) event.getRawY();

                                  if (x_cord > windowwidth) {
                                         x_cord = windowwidth;
                                  }
                                  if (y_cord > windowheight) {
                                         y_cord = windowheight;
                                  }

                                  layoutParams.leftMargin = x_cord - 25;
                                  layoutParams.topMargin = y_cord - 75;

                                  img.setLayoutParams(layoutParams);
                                  break;
                           default:
                                  break;
                           }
                           return true;
                     }
              });
       }
}

Ответ 6

Надеюсь, что это работает для u

animation.xml

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".Animation" >

    <ImageView
        android:id="@+id/img_animation"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginLeft="30dp"
        android:layout_marginTop="42dp"
        android:src="@drawable/emo_im_laughing" />

</RelativeLayout>

Animation.java

import android.os.Bundle;
import android.app.Activity;
import android.view.animation.TranslateAnimation;
import android.widget.ImageView;

public class Animation extends Activity {

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

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

  TranslateAnimation animation = new TranslateAnimation(0.0f, 400.0f,
    0.0f, 0.0f);
  animation.setDuration(5000);
  animation.setRepeatCount(5);
  animation.setRepeatMode(2);
  animation.setFillAfter(true);
  img_animation.startAnimation(animation);

 }
}