Animator 动画第一次播放正常,之后播放都不正常的问题解决

问题描述

  第一次点击图片动画播放正常,在点击文字之后,图片没有显示出来,点击空白,播放动画,显示文字。
  写了一个卡片翻转的动画,代码如下:

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="center"
android:background="#F2F2F2"> <FrameLayout
android:layout_width="252dp"
android:layout_height="336dp"
android:layout_gravity="center"> <ImageView
android:id="@+id/activity_main_image_iv"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:src="@mipmap/result" /> <TextView
android:id="@+id/activity_main_text_tv"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#247BA0"
android:gravity="center"
android:text="确定"
android:textColor="@android:color/white"
android:textSize="36sp"
android:visibility="gone" /> </FrameLayout> </FrameLayout>

MainActivity.java

package com.zm.animatorerror;

import android.animation.Animator;
import android.animation.AnimatorInflater;
import android.animation.AnimatorListenerAdapter;
import android.animation.AnimatorSet;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView; public class MainActivity extends AppCompatActivity { private ImageView iv_image;
private TextView tv_text; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
} private void initView() {
iv_image = (ImageView) findViewById(R.id.activity_main_image_iv);
tv_text = (TextView) findViewById(R.id.activity_main_text_tv);
iv_image.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
tv_text.setVisibility(View.VISIBLE);
AnimatorSet inAnimator = (AnimatorSet) AnimatorInflater.loadAnimator(MainActivity.this, R.animator.rotate_in_anim);
AnimatorSet outAnimator = (AnimatorSet) AnimatorInflater.loadAnimator(MainActivity.this, R.animator.rotate_out_anim);
int distance = 16000;
float scale = getResources().getDisplayMetrics().density * distance;
iv_image.setCameraDistance(scale);
tv_text.setCameraDistance(scale);
outAnimator.setTarget(iv_image);
inAnimator.setTarget(tv_text);
outAnimator.start();
inAnimator.start();
outAnimator.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
super.onAnimationEnd(animation);
iv_image.setVisibility(View.GONE);
}
});
}
});
tv_text.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
tv_text.setVisibility(View.GONE);
iv_image.setVisibility(View.VISIBLE);
}
});
}
}

问题原因

  Animator 动画会修改控件的属性值,第一次动画结束之后,控制的属性值就是动画播放完的属性,所以动画显示不正确。

解决方法

  为动画设置播放监听,在动画结束之后,将控件的属性值设置为原始状态。
  修改代码如下:

    private void initView() {
iv_image = (ImageView) findViewById(R.id.activity_main_image_iv);
tv_text = (TextView) findViewById(R.id.activity_main_text_tv);
iv_image.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
tv_text.setVisibility(View.VISIBLE);
AnimatorSet inAnimator = (AnimatorSet) AnimatorInflater.loadAnimator(MainActivity.this, R.animator.rotate_in_anim);
AnimatorSet outAnimator = (AnimatorSet) AnimatorInflater.loadAnimator(MainActivity.this, R.animator.rotate_out_anim);
int distance = 16000;
float scale = getResources().getDisplayMetrics().density * distance;
iv_image.setCameraDistance(scale);
tv_text.setCameraDistance(scale);
outAnimator.setTarget(iv_image);
inAnimator.setTarget(tv_text);
outAnimator.start();
inAnimator.start();
outAnimator.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
super.onAnimationEnd(animation);
iv_image.setVisibility(View.GONE);
***********************************修改部分**************************************
iv_image.setAlpha(1.0f);
iv_image.setRotationY(0.0f);
***********************************修改部分**************************************
}
});
}
});
tv_text.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
tv_text.setVisibility(View.GONE);
iv_image.setVisibility(View.VISIBLE);
}
});
}

Animator 动画第一次播放正常,之后播放都不正常的问题解决的更多相关文章

  1. Unity3D中通过Animator动画状态机获取任意animation clip的准确播放持续时长

    Unity3d 4及之前的版本中动画的播放用的animation,可直接获取其播放持续长度.但5.x及以后的版本中都是用animator来播放动画了. https://docs.unity3d.com ...

  2. 用Unity的Animation播放Animator动画Clip

    简单的动画,其实不需要Animator动画状态机管理,用Animation播放效率更高,但可能由于历史遗留问题,或网上下载的第三方资源,得到的是Animator资源,可以在Clip的Debug试图下, ...

  3. 5步告诉你QQ音乐的完美音质是怎么来的,播放器的秘密都在这里

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由QQ音乐技术团队发表于云+社区专栏 一.问题背景与分析 不久前,团队发现其Android平台App在播放MV视频<凤凰花开的路口 ...

  4. css3动画应用-音乐唱片旋转播放特效

    css3动画应用-音乐唱片旋转播放特效 核心点: 1.设置图片为圆形居中,使图片一直不停旋转. 2.文字标题(潘玮柏--反转地球)一直从左到右不停循环移动. 3.点击图标,音乐暂停,图片停止旋转:点击 ...

  5. [Swift通天遁地]八、媒体与动画-(1)实现音频的播放和停止

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...

  6. Unity动画知识之二:Animator动画状态机

    上次我们讲过Unity游戏动画从入门到住院,今天我们来讲一下动画状态机. 好了,现在我们已经成功的导入了动画.接下来要玩的东西就很装13啦.因为大部分动画师是用不到这家伙的,需要掌握这个技能的,至少也 ...

  7. unity 对Animator动画系统的研究

    unity的新动画系统叫Mecanim,使用Animator来取代旧系统Animation,按Unity文档的惯例:知识点主要分2部分:unity manual和unity script,读者可以边看 ...

  8. 照相、从相册上取照片、播放音频、播放本地视频、播放网络视频、MPMoviePlayerController

    一.照相.从相册上去照片 1. 先判断是否支持照相功能 *判断当前设备是否支持照相功能,支持返回YES 否则返回NO 注意:模拟器不支持照相功能 把握一个原则只要是物理硬件相关的功能模拟器都不支持 例 ...

  9. Openlayers 实现轨迹播放/暂停/重新播放/从点击处播放/提速/减速

    说明: 我的需求是需要实现轨迹播放/暂停/重新播放/从点击处播放,因此封装了一个类 解决方案: 1.初始化:主要是处理一下图层以及数据,通过插值构造一个全局数组 /** * @description ...

随机推荐

  1. Zygote及System进程启动

    1.  init 根据init.rc 运行 app_process, 并携带‘--zygote' 和 ’--startSystemServer' 参数. 2.  AndroidRuntime.cpp: ...

  2. Mac上重置mysql 5.7密码

    Mac上重置mysql 5.7密码 >我的mac系统是osx 10.12 装完mysql5.7之前根本登录不上,网上说用DMG方式装完后,后弹出一个框,上面会有临时密码,但是我安装的时候却手一抖 ...

  3. PADS Layout VX.2.3 更改Logic符号,并更新到原理图

    操作系统:Windows 10 x64 工具1:PADS Layout VX.2.3 统一使用A3尺寸的原理图,如果Logic符号画得太大,就会占用过多的面积.如下图所示,电阻的两只引脚的跨度占用了4 ...

  4. NAT穿透解决

    1.各种网络环境下的P2P通信解决方法: (1)如果通信双方在同一个局域网内,这种情况下可以不借助任何外力直接通过内网地址通信即可:   (2)如果通信双方都在有独立的公网地址,这种情况下当然可以不借 ...

  5. LVDS、CVBS

    LVDS(Low Voltage Differential Signaling) 是一种低压差分信号技术接口.它是为克服以TTL电平方式传输宽带高码率数据时功耗大.EMI电磁干扰大等缺点而研制的一种数 ...

  6. win10 安装mysql8

    参考:https://www.jb51.net/article/139219.htm mysql下载地址:https://dev.mysql.com/downloads/mysql/ 1.下载:mys ...

  7. Unittest框架+ddt数据驱动+HTMLTestRunner+sendmail(自动发送测试报告)+git+Jenkins

    本次写的是针对有代码基础的,没基础建议先去学基础,以下所有描述内容都是我已经在公司项目实践成功的!仅供参考 整体思路: 1.接口自动化用的是Python中unittest框架 2.所有的测试数据用例存 ...

  8. Run Keyword And Ignore Error,Run Keyword And Return Status,Run Keyword And Continue On Failure,Run Keyword And Expect Error,Wait Until Keyword Succeeds用法

    *** Test Cases ***case1 #即使错误也继续执行,也不记录失败,且可以返回执行状态和错误信息 ${Run Keyword And Ignore Error status} ${st ...

  9. dotnet core 3.0 linux 部署小贴士

    dotnet core 3.0 目前还是测试版,在linux下安装 sdk 需要有一些注意事项 1.下载url https://dotnet.microsoft.com/download/thank- ...

  10. Y1O001波分复用器

    # 波分复用器## 光分波器### 波分合波器种类* 耦合型 * 光纤熔融拉锥 * 熔融拉锥法是指将两根(或两根以上)除去涂覆层的光纤以一定的方法靠拢,在高温加热下熔融,同时向两侧拉伸,最终在加热区形 ...