web-dev-qa-db-ja.com

AndroidでImageViewを左から右にスムーズにスライドさせる方法は?

画面の左から右へ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は動きますが、アニメーションが遅れており、私が望むようにスムーズではありません。コードで何が間違っていますか?

14
LS_

この種のトゥイーンアニメーションの作成は簡単です。手順に従うだけで、

ステップ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>
_

2つの属性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()を使用することもできます。ここでは簡単にするためにそれらを示していません。必要な場合は、お知らせください。

[〜#〜] note [〜#〜]

あなたが繰り返し述べたように、あなたはラグアニメーションを経験していることを。このアニメーションを3つの実際のデバイスと2つのエミュレーターでテストしましたが、アニメーションはすべてスムーズでした。 Moto EなどのローエンドデバイスからNexus 5やGalaxy S6などのハイエンドデバイスでテスト済み。

このコードの実行にまだ遅れがある場合は、テストデバイスが原因である必要があります。コードは完璧です。

[〜#〜] update [〜#〜]

Lollipopで実行しているMoto Gも確認したところ、アニメーションはスムーズに実行されています。これは非常に小さくて軽いアニメーションであり、決して遅れることはありません。それでも遅延が発生する場合は、テスト対象のデバイスか、そのアクティビティ上の他のコードの一部である必要があり、UIが遅くなったり応答しなくなったりします

どれがあなたに当てはまるかを確認してみてください、

  • 合計6台のデバイスでテストしましたが、ラグはまったくありません。だから、あなたの生産アプリが遅れを持たないことを安心することができます、それは遅いあなたのデバイスである可能性があります
  • ファイルシステム、データベース、または他の重い操作にアクセスするような重い操作をしている場合、UIスレッドを遅くしている必要があり、フレームを失っています。使用してみてくださいAsyncTaskこれらの重い操作用
35
Aritra Roy
TranslateAnimation animate = new TranslateAnimation(0, -view.getWidth(), 0, 0);
animate.setDuration(500);
animate.setFillAfter(true);
view.startAnimation(animate);

これを試して。画像ビューをアニメーション化します。

        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  
3
Andrew Coder

これがあなたのために働くことを願っています

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);

 }
}
1
Anshul Khare
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;
                     }
              });
       }
}
0
Zigri2612

移動するにはimageview

from 右から左 @Aritra Roy Answerの使用。

このコードを使用

<?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="75%p"
        Android:toXDelta="0%p"
        Android:duration="100000" />
</set>
0
Quick learner