IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> 安卓动画ObjectAnimator实现切换效果 -> 正文阅读

[移动开发]安卓动画ObjectAnimator实现切换效果

ObjectAnimator动画使用

实现如图效果在这里插入图片描述

  1. 首先现在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"
    android:gravity="center"
    tools:context=".fragment.AddressFragment">


    <ImageView
        android:id="@+id/iv_show_menu"
        android:layout_width="48dp"
        android:layout_height="47dp"
        android:layout_alignParentBottom="true"
        android:layout_alignParentRight="true"
        android:layout_marginBottom="10dp"
        android:layout_marginRight="10dp"
        android:minHeight="40dp"
        android:minWidth="40dp"
        android:src="@drawable/home_menu_add" />

    <ImageView
        android:id="@+id/iv_add_one"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_alignParentRight="true"
        android:layout_marginBottom="10dp"
        android:layout_marginRight="14dp"
        android:background="@android:color/transparent"
        android:minHeight="40dp"
        android:minWidth="40dp"
        android:src="@mipmap/home_menu_photo"
        android:visibility="invisible"
        />

    <ImageView
        android:id="@+id/iv_scan"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_alignParentRight="true"
        android:layout_marginBottom="10dp"
        android:layout_marginRight="14dp"
        android:background="@android:color/transparent"
        android:minHeight="40dp"
        android:minWidth="40dp"
        android:src="@mipmap/home_menu_scan"
        android:visibility="invisible"
        />

</RelativeLayout>

2.java代码实现
我是在一个fragment当中实现

package com.example.ceshiapplication.fragment;

import android.animation.Animator;
import android.animation.ObjectAnimator;
import android.animation.PropertyValuesHolder;
import android.nfc.Tag;
import android.os.Bundle;

import androidx.fragment.app.Fragment;

import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;

import com.example.ceshiapplication.R;

public class AddressFragment extends Fragment implements View.OnClickListener {

    private ImageView iv_show_menu;
    private ImageView iv_add_one;
    private ImageView iv_scan;
    private boolean isShow = false;
    private PropertyValuesHolder translationY1;
    private PropertyValuesHolder translationY2;
    private PropertyValuesHolder scaleX;
    private PropertyValuesHolder scaleY;
    private PropertyValuesHolder translationY3;
    private PropertyValuesHolder translationY4;
    private PropertyValuesHolder scaleX_;
    private PropertyValuesHolder scaleY_;
    private PropertyValuesHolder rotation;
    private PropertyValuesHolder rotation_;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        View view = inflater.inflate(R.layout.fragment_address, container, false);
        initView(view);
        return view;
    }

    private void initView(View view) {
        iv_show_menu = view.findViewById(R.id.iv_show_menu);
        iv_show_menu.setOnClickListener(this);
        iv_add_one = view.findViewById(R.id.iv_add_one);
        iv_scan = view.findViewById(R.id.iv_scan);

    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.iv_show_menu:
                showView();
                break;
        }
    }

    private void showView() {
    //设置其它两个的位置
        int measuredHeight = iv_show_menu.getMeasuredHeight();
        int transV1 = (int) (measuredHeight + measuredHeight * 0.2 + 10);
        int transV2 = (int)(measuredHeight +measuredHeight*0.2)*2+10;

//使用PropertyValuesHolder来保存动画过程中所需要的操作的属性和属性所对应的值,通过ofFloat(Object target, String propertyName, float… values)构造的动画,ofFloat()的内部实现其实就是将传进来的参数封装成PropertyValuesHolder实例来保存动画状态。
		//平移
        translationY1 = PropertyValuesHolder.ofFloat("translationY", -transV1);
        translationY2 = PropertyValuesHolder.ofFloat("translationY", -transV2);
        //缩放
        scaleX = PropertyValuesHolder.ofFloat("scaleX", 0f, 1f);
        scaleY = PropertyValuesHolder.ofFloat("scaleY", 0f, 1f);
        translationY3 = PropertyValuesHolder.ofFloat("translationY", transV1);
        translationY4 = PropertyValuesHolder.ofFloat("translationY", transV2);
        scaleX_ = PropertyValuesHolder.ofFloat("scaleX", 1f, 0f);
        scaleY_ = PropertyValuesHolder.ofFloat("scaleY", 1f,0f);
        //旋转
        rotation = PropertyValuesHolder.ofFloat("rotation", 45);
        rotation_ = PropertyValuesHolder.ofFloat("rotation", 0);



        if (isShow) {
       		 //隐藏
       		 //ObjectAnimator给我们提供了一个设置PropertyValuesHolder实例的入口ofPropertyValuesHolder
            ObjectAnimator showMenu = ObjectAnimator.ofPropertyValuesHolder(iv_show_menu,rotation_);
            showMenu.setDuration(200);
            showMenu.start();
            ObjectAnimator addOne = ObjectAnimator.ofPropertyValuesHolder(iv_add_one,translationY3,scaleX_,scaleY_);
            addOne.setDuration(200);
            addOne.start();
            ObjectAnimator scan = ObjectAnimator.ofPropertyValuesHolder(iv_scan,translationY4,scaleX_,scaleY_);
            scan.setDuration(200);
            scan.start();

            scan.addListener(new Animator.AnimatorListener() {
                @Override
                public void onAnimationStart(Animator animation) {

                }

                @Override
                public void onAnimationEnd(Animator animation) {
                    iv_add_one.setVisibility(View.INVISIBLE);
                    iv_scan.setVisibility(View.INVISIBLE);
                }

                @Override
                public void onAnimationCancel(Animator animation) {

                }

                @Override
                public void onAnimationRepeat(Animator animation) {

                }
            });
            isShow = false;
        } else {
        	//显示
            iv_add_one.setVisibility(View.VISIBLE);
            iv_scan.setVisibility(View.VISIBLE);
            ObjectAnimator showMenu = ObjectAnimator.ofPropertyValuesHolder(iv_show_menu, rotation);
            showMenu.setDuration(200);
            showMenu.start();
            ObjectAnimator addOne = ObjectAnimator.ofPropertyValuesHolder(iv_add_one, translationY1, scaleX, scaleY);
            addOne.setDuration(200);
            addOne.start();
            ObjectAnimator scan = ObjectAnimator.ofPropertyValuesHolder(iv_scan, translationY2, scaleX, scaleY);
            scan.setDuration(200);
            scan.start();
            isShow = true;
        }


    }
}

参数解释
调用接口

public static ObjectAnimator ofPropertyValuesHolder(Object target,PropertyValuesHolder... values) 

  • target:指需要执行动画的控件
  • values:一个可变长参数,可以传进去一个或多个PropertyValuesHolder实例,因为每个PropertyValuesHolder实例都会针对一个属性做动画,所以如果传进去多个PropertyValuesHolder实例,将会对控件的多个属性同时做动画操作
  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2021-11-10 12:30:55  更:2021-11-10 12:33:20 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 3:57:08-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码