使用android studio创建扫描动画

Dan*_*syo 25 animation android android-studio

我在我的Android应用程序上创建扫描动画时遇到麻烦.例如,我遇到了这个应用程序' 指纹爱扫描程序恶作剧 ',它有扫描动画,我想在我的Android应用程序上实现相同.我试图在我的Android应用程序上实现相同但是徒劳无功.这是我的android代码片段.

Animation.Java活动

          scan.setOnTouchListener(new View.OnTouchListener() {
                @Override
                public boolean onTouch(View view, MotionEvent motionEvent) {


                    final CountDownTimer start = new CountDownTimer(4000, 1000) {

                        public void onTick(long millisUntilFinished) {
                            scanner.setVisibility(View.VISIBLE);
                            anim1 = AnimationUtils.loadAnimation(getApplicationContext(), R.anim.progress);
                            scanner.startAnimation(anim1);


                        }

                        public void onFinish() {

                            scanner.setVisibility(View.INVISIBLE);

                        }
                    }.start();
                    return false;
                }


            });
Run Code Online (Sandbox Code Playgroud)

Animation.xml

包含imageView定义的扫描仪图像,如下所示

<LinearLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="40dp"
            android:id="@+id/scan"
            android:background="@drawable/bgscanner">

            <ImageView
                android:layout_width="100dp"
                android:layout_height="wrap_content"
                android:src="@drawable/scanner"
                android:id="@+id/scanner1"
                android:layout_marginTop="20dp"
                android:visibility="invisible"
                />
        </LinearLayout>
Run Code Online (Sandbox Code Playgroud)

我的动画可绘画

<?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:fromYDelta="0%p"
        android:toYDelta="75%p"
        android:duration="800"
        />
</set>
Run Code Online (Sandbox Code Playgroud)

我的大问题是,在触摸事件中,动画不会执行.也就是说,图像条不会沿垂直轴振荡.我请求stackoverflow提供任何帮助

Lea*_*ira 14

编辑

使用非常小的代码可以解决这个问题.

首先,将您的XML动画代码更改为:

<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:interpolator="@android:anim/accelerate_decelerate_interpolator"
    android:fillAfter="false">

    <translate
        android:fromYDelta="0%p"
        android:toYDelta="100%p"
        android:duration="1000"
        android:repeatCount="infinite"
        android:repeatMode="restart"
        />
</set>
Run Code Online (Sandbox Code Playgroud)

你的布局应该是这样的:

<LinearLayout
        android:id="@+id/image"
        android:layout_width="200dp"
        android:layout_height="200dp"
        android:background="@mipmap/ic_launcher">

        <View
            android:id="@+id/bar"
            android:layout_width="200dp"
            android:layout_height="6dp"
            android:visibility="gone"
            android:background="@android:color/black"
            android:src="@mipmap/ic_launcher"/>
    </LinearLayout>
Run Code Online (Sandbox Code Playgroud)

在您的活动中,代码可以是这样的:

LinearLayout imageView = (LinearLayout) findViewById(R.id.image);
        final View bar = findViewById(R.id.bar);
        final Animation animation = AnimationUtils.loadAnimation(MainActivity.this, R.anim.anim);
        animation.setAnimationListener(new Animation.AnimationListener() {
            @Override
            public void onAnimationStart(Animation animation) {}

            @Override
            public void onAnimationEnd(Animation animation) {
                bar.setVisibility(View.GONE);
            }

            @Override
            public void onAnimationRepeat(Animation animation) {}
        });

        imageView.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View view, MotionEvent motionEvent) {
                bar.setVisibility(View.VISIBLE);
                bar.startAnimation(animation);
                return false;
            }
        });
Run Code Online (Sandbox Code Playgroud)

这样你就会有这样的结果:

在此输入图像描述

我使用View而不是ImageView来制作扫描条,但您可以根据需要更改代码.

我希望它有所帮助!

编辑2:

如果您希望仅在按下图像时才发生动画,请将代码更改为:

imageView.setOnTouchListener(new View.OnTouchListener() {
        @Override
        public boolean onTouch(View view, MotionEvent motionEvent) {
            if(motionEvent.getAction() == MotionEvent.ACTION_DOWN){
                bar.setVisibility(View.VISIBLE);
                bar.startAnimation(animation);
            } else if(motionEvent.getAction() == MotionEvent.ACTION_UP){
                bar.setVisibility(View.GONE);
                animation.cancel();
            }

            return false;
        }
    });
Run Code Online (Sandbox Code Playgroud)

它是您在按下图像时触发动画(MotionEvent.ACTION_DOWN),它将在图像释放时停止动画(MotionEvent.ACTION_UP)


Jin*_*cis 6

而不是countDownTimer使用onTouch列表器中动画的值动​​画.

scan.setOnTouchListener(new View.OnTouchListener() {
  @Override
  public boolean onTouch(View view, MotionEvent motionEvent) {
   if(motionEvent.getAction==MotionEvent.ACTION_DOWN){ 
     ValueAnimator valueAnimator=ValueAnimator.ofFloat(0,75);
     valueAnimator.setDuration(4000);
     valueAnimator.setInterpolator(new DecelerateInterpolator());
     valueAnimator.addListener(new Animator.AnimatorListener() {
        @Override
        public void onAnimationStart(Animator animation) {
           scanner.setVisibilty(View.VISIBLE);
        }
        @Override
        public void onAnimationEnd(Animator animation) {
            scanner.setVisibilty(View.INVISIBLE);
        }
        @Override
        public void onAnimationCancel(Animator animation) {
             scanner.setVisibilty(View.INVISIBLE);
        }
        @Override
        public void onAnimationRepeat(Animator animation) {
         }
        });
     valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener()      {
           @Override
           public void onAnimationUpdate(ValueAnimator animation) {
              float translate= (float) animation.getAnimatedValue();
              scanner.setTranslationY(translate);//translate scanner in Y direction
           }
       });
    valueAnimator.start();
   }
 return true;
}
Run Code Online (Sandbox Code Playgroud)