属性动画property animation

基于底部导航模板BottomNavigation的实现
https://blog.csdn.net/BLU_111/article/details/103257206

Step1

1.通过res—New—Vector Asset创建图片资源:ic_mood_black_24dp.xml

2.为First、Second、Third三个Fragment设置ImageView并选择所创建的图片资源。
设置属性:

Step2

FirstFragment

package com.example.bottomnavigationdemo;import androidx.lifecycle.ViewModelProviders;import android.animation.ObjectAnimator;import android.os.Bundle;import androidx.annotation.NonNull;import androidx.annotation.Nullable;import androidx.fragment.app.Fragment;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.ImageView;public class FirstFragment extends Fragment {private FirstViewModel mViewModel;private ImageView imageView;public static FirstFragment newInstance() {    return new FirstFragment();}@Overridepublic View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container,                         @Nullable Bundle savedInstanceState) {    View view = inflater.inflate(R.layout.first_fragment, container, false);    imageView = view.findViewById(R.id.imageView);    return view;}@Overridepublic void onActivityCreated(@Nullable Bundle savedInstanceState) {    super.onActivityCreated(savedInstanceState);    mViewModel = ViewModelProviders.of(this).get(FirstViewModel.class);    //这里of()里的参数表示ViewModel的生效范围。this表示在本fragment内生效,requireActivity()表示在Activity内生效。    //参数为this,切换fragment时ViewModel里的数据会丢失。而requireActivity()不会。    imageView.setRotation(mViewModel.rotationPosition);    final ObjectAnimator objectAnimator = ObjectAnimator.ofFloat(imageView, "rotation", 0, 0);    objectAnimator.setDuration(500);    imageView.setOnClickListener(new View.OnClickListener() {        @Override        public void onClick(View v) {            if (!objectAnimator.isRunning()) {                objectAnimator.setFloatValues(imageView.getRotation(), imageView.getRotation() + 100);                mViewModel.rotationPosition += 100;                objectAnimator.start();            }        }    }); }}

FirstViewModel

package com.example.bottomnavigationdemo;import androidx.lifecycle.ViewModel;public class FirstViewModel extends ViewModel {// TODO: Implement the ViewModelfloat rotationPosition = 0;}

SecondFragment

package com.example.bottomnavigationdemo;import androidx.lifecycle.ViewModelProviders;import android.animation.ObjectAnimator;import android.os.Bundle;import androidx.annotation.NonNull;import androidx.annotation.Nullable;import androidx.fragment.app.Fragment;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.ImageView;public class SecondFragment extends Fragment {private SecondViewModel mViewModel;private ImageView imageView;public static SecondFragment newInstance() {    return new SecondFragment();}@Overridepublic View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container,                         @Nullable Bundle savedInstanceState) {    View view = inflater.inflate(R.layout.second_fragment, container, false);    imageView = view.findViewById(R.id.imageView);    return view;}@Overridepublic void onActivityCreated(@Nullable Bundle savedInstanceState) {    super.onActivityCreated(savedInstanceState);    mViewModel = ViewModelProviders.of(this).get(SecondViewModel.class);    imageView.setScaleX(mViewModel.scaleFactor);    imageView.setScaleY(mViewModel.scaleFactor);    final ObjectAnimator objectAnimatorX = ObjectAnimator.ofFloat(imageView,"scaleX",0,0);    final ObjectAnimator objectAnimatorY = ObjectAnimator.ofFloat(imageView,"scaleY",0,0);    objectAnimatorX.setDuration(500);    objectAnimatorY.setDuration(500);    imageView.setOnClickListener(new View.OnClickListener() {        @Override        public void onClick(View v) {            if (!objectAnimatorX.isRunning()){                objectAnimatorX.setFloatValues(imageView.getScaleX() + 0.1f);                objectAnimatorY.setFloatValues(imageView.getScaleY() + 0.1f);                mViewModel.scaleFactor += 0.1;                objectAnimatorX.start();                objectAnimatorY.start();            }        }    }); }}

SecondViewModel

package com.example.bottomnavigationdemo;import androidx.lifecycle.ViewModel;public class SecondViewModel extends ViewModel {float scaleFactor = 1;}

ThirdFragment

package com.example.bottomnavigationdemo;import androidx.lifecycle.ViewModelProviders;import android.animation.ObjectAnimator;import android.os.Bundle;import androidx.annotation.NonNull;import androidx.annotation.Nullable;import androidx.fragment.app.Fragment;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.ImageView;import java.util.Random;public class ThirdFragment extends Fragment {private ThirdViewModel mViewModel;private ImageView imageView;public static ThirdFragment newInstance() {    return new ThirdFragment();}@Overridepublic View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container,                         @Nullable Bundle savedInstanceState) {    View view = inflater.inflate(R.layout.third_fragment, container, false);    imageView = view.findViewById(R.id.imageView);    return view;}@Overridepublic void onActivityCreated(@Nullable Bundle savedInstanceState) {    super.onActivityCreated(savedInstanceState);    mViewModel = ViewModelProviders.of(this).get(ThirdViewModel.class);    imageView.setX(imageView.getX() + mViewModel.dX);    final ObjectAnimator objectAnimator = ObjectAnimator.ofFloat(imageView,"x",0,0);    objectAnimator.setDuration(500);    imageView.setOnClickListener(new View.OnClickListener() {        @Override        public void onClick(View v) {            if (!objectAnimator.isRunning()){                float dx = new Random().nextBoolean() ?100:-100;                objectAnimator.setFloatValues(imageView.getX(),imageView.getX() + dx);                mViewModel.dX += dx;                objectAnimator.start();            }        }    });  }}

ThirdViewModel

package com.example.bottomnavigationdemo;import androidx.lifecycle.ViewModel;public class ThirdViewModel extends ViewModel {    float dX;}

运行截图:


点击图片可旋转:

点击图片可缩放:

点击图片可随机左右移动:

源码链接:https://pan.baidu.com/s/1HDujvAcAXIPse78fPl50xw
提取码:aovu

更多相关文章

  1. Android(安卓)Retrofit 框架上传多张图片解决方案
  2. Android系统的开机画面显示过程分析(4)
  3. Android图形图像处理:马赛克(Mosaic)效果
  4. android 调用手机已安装的音乐播放器 的列表播放音乐
  5. Android配置
  6. Android实现圆形图片
  7. Android获取网络图片应用示例
  8. Android基本UI控件的介绍及使用
  9. Android(安卓)AsyncTask

随机推荐

  1. 按powerkey唤醒启动上层Andord
  2. android:layout_gravity 和 android:grav
  3. android studio创建新项目color.xml文件
  4. java.lang.NoClassDefFoundError: com.go
  5. 真正的机器人操作系统---Android
  6. 【ubuntu】Ubuntu中Android(安卓)SDK下载
  7. Android视频采集
  8. 实例分析android中的Binder通信机制(1)
  9. 如何在Android中使用OpenCV
  10. 【转】不要被虚张声势的 Android 忽悠了