当前位置:   article > 正文

Android开发之MaterialDesign动画总结_matias duarte andorid设计中运用动画

matias duarte andorid设计中运用动画

前言:话说MaterialDesign的效果很是强大,相信你看了我之前总结的MD控件的使用,你对MD风格也有一定的了解。相信你看了我之前的属性动画《Android开发之安卓属性动画大总结》,对安卓的动画有一定的了解,今天我们就来总结一下MD的动画效果,介绍1、Touch Feedback(触摸反馈);2、Reveal Effect(揭露效果);3、3.Activity transition(Activity转场动画效果)

------- 一:Touch Feedback(触摸反馈)----------

例子水波纹效果(5.x以上自带的效果,关于如何兼容5.x以下的水波纹,我们以后再单独)

我们直接看代码:

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. xmlns:tools="http://schemas.android.com/tools"
  4. android:id="@+id/activity_main"
  5. android:layout_width="match_parent"
  6. android:layout_height="match_parent"
  7. android:gravity="center"
  8. android:orientation="vertical"
  9. tools:context=".MainActivity">
  10. <Button
  11. android:layout_width="wrap_content"
  12. android:layout_height="100dp"
  13. android:text="5.x自带按键效果" />
  14. <Button
  15. android:layout_width="50dp"
  16. android:layout_height="50dp"
  17. android:background="?attr/selectableItemBackground"
  18. android:clickable="true"
  19. android:gravity="center"
  20. android:text="按下效果" />
  21. <Button
  22. android:layout_width="wrap_content"
  23. android:layout_height="100dp"
  24. android:background="?attr/selectableItemBackgroundBorderless"
  25. android:text="按下圆形水波纹" />
  26. </LinearLayout>
效果图展示(三个效果依次展示):


当然了我们也可以自定义按下的效果颜色(设置再style中):

  1. <!--可以修改背景颜色和水波纹的颜色:-->
  2. <item name="colorControlHighlight">@color/colorAccent</item>
  3. <item name="colorButtonNormal">@color/material_blue_grey_800</item>
效果展示:


--------- 二:Reveal Effect(揭露效果)---------

例子:Activity的揭露出现的效果。

使用ViewAnimationUtil工具类来完成此效果。

ok,我们先来看下第一个效果:

代码:

  1. bt1.setOnClickListener(new View.OnClickListener() {
  2. @Override
  3. public void onClick(View v) {
  4. Animator animator = ViewAnimationUtils.createCircularReveal(bt1,//作用在哪个View上面
  5. bt1.getWidth() / 2, bt1.getHeight() / 2,//扩散的中心点
  6. 0,//开始扩散初始半径
  7. bt1.getHeight());//扩散结束半径
  8. animator.setDuration(1000);
  9. animator.setInterpolator(new AccelerateInterpolator());
  10. animator.start();
  11. }
  12. });
使用起来很是方便,当然我们也可以做出其他的效果,相关api不用我多做解释了吧。

ok我们再来看下第二个效果:


代码:

  1. bt2.setOnClickListener(new View.OnClickListener() {
  2. @Override
  3. public void onClick(View v) {
  4. Animator animator = ViewAnimationUtils.createCircularReveal(bt2, 0, 0, 0,
  5. (float) Math.hypot(bt2.getWidth(), bt2.getHeight()));
  6. animator.setDuration(1000);
  7. animator.setInterpolator(new AccelerateInterpolator());
  8. animator.start();
  9. }
  10. });
其他效果可以自行测试!

----------  三:Activity transition(Activity转场动画效果)---------

就是两个Activity进行跳转的时候,转场动画。

1、5.0之前通常使用三种系统带的:滑动效果(Slide)、展开效果Explode、渐变显示隐藏效果Fade。

看下滑动效果:


代码实现:

  1. public void jump(View view) {
  2. //平移效果
  3. startActivity(new Intent(MainActivity.this, SecondActivity.class));
  4. overridePendingTransition(android.R.anim.slide_in_left, android.R.anim.slide_out_right);
  5. }
其他两种效果可自行实现。

2、共享元素转换:把两个Activity当中的相同的元素关联起来做连贯的变换动画,当然效果肯定是比上面的要好。

使用ActivityOptions类。但是这个类只支持API21以上的版本。所以我们一般使用这个兼容类:ActivityOptionsCompat(v4包中),此类在低版本上面并没有转场动画效果,只能使用上述普通的slide来进行相应的转换。共享元素转换分为单个共享元素和多个共享元素。

其中最关键的是给两个Activity当中的共享元素view都设置同一个名字---android:transitionName

还需要给两个Activity都设置如下:
//方法一:
getWindow().requestFeature(Window.FEATURE_CONTENT_TRANSITIONS);
//方法二:
修改主题:<item name="android:windowContentTransitions">true</item>

1)单个元素共享(放大效果展示图):


全部代码:MainActivity类:

  1. public class MainActivity extends AppCompatActivity {
  2. private Button button;
  3. private ImageView imageView;
  4. @Override
  5. protected void onCreate(Bundle savedInstanceState) {
  6. //设置允许使用转场动画
  7. getWindow().requestFeature(Window.FEATURE_CONTENT_TRANSITIONS);
  8. super.onCreate(savedInstanceState);
  9. setContentView(R.layout.activity_main);
  10. imageView = (ImageView) findViewById(R.id.iv);
  11. button = (Button) findViewById(bt);
  12. }
  13. public void jump(View view) {
  14. //放大效果//单个元素共享
  15. // ActivityOptions
  16. // ActivityOptionsCompat optionsCompat = ActivityOptionsCompat
  17. // .makeSceneTransitionAnimation(
  18. // activity, //当前的Activity
  19. // sharedElement,//共享元素---哪一个View
  20. // sharedElementName)//共享元素的名称 android:transitionName="iv_meinv3"
  21. ActivityOptionsCompat optionsCompat = ActivityOptionsCompat.makeSceneTransitionAnimation(this, imageView, "meinv");
  22. Intent intent = new Intent(this, SecondActivity.class);
  23. startActivity(intent, optionsCompat.toBundle());
  24. }
  25. }
activity_main布局:
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. xmlns:tools="http://schemas.android.com/tools"
  4. android:layout_width="match_parent"
  5. android:layout_height="match_parent"
  6. android:orientation="vertical"
  7. tools:context=".MainActivity">
  8. <ImageView
  9. android:id="@+id/iv"
  10. android:layout_width="200dp"
  11. android:layout_height="200dp"
  12. android:scaleType="centerCrop"
  13. android:src="@drawable/timg"
  14. android:transitionName="meinv" />
  15. <Button
  16. android:id="@+id/bt"
  17. android:layout_width="wrap_content"
  18. android:layout_height="wrap_content"
  19. android:onClick="jump"
  20. android:text="MainActivity"
  21. android:textAllCaps="false"
  22. android:transitionName="bt" />
  23. </LinearLayout>
SecondActivity代码:
  1. public class SecondActivity extends AppCompatActivity {
  2. @Override
  3. protected void onCreate(@Nullable Bundle savedInstanceState) {
  4. //设置允许使用转场动画
  5. getWindow().requestFeature(Window.FEATURE_CONTENT_TRANSITIONS);
  6. super.onCreate(savedInstanceState);
  7. setContentView(R.layout.activity_second);
  8. }
  9. }
activity_second布局:
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent"
  5. android:orientation="vertical">
  6. <ImageView
  7. android:id="@+id/iv1"
  8. android:layout_width="match_parent"
  9. android:layout_height="match_parent"
  10. android:scaleType="centerCrop"
  11. android:src="@drawable/timg"
  12. android:transitionName="meinv" />
  13. <Button
  14. android:layout_width="wrap_content"
  15. android:layout_height="wrap_content"
  16. android:layout_alignParentBottom="true"
  17. android:layout_alignParentRight="true"
  18. android:text="SecondActivity"
  19. android:textAllCaps="false"
  20. android:transitionName="bt" />
  21. </RelativeLayout>

2)多个元素共享(效果展示图):


发现里面有几个不一样的地方:第一个是加了一个toolBar(为了好看),第二个是Button也跟随着图片变化,然后变字,so这就是多个元素的共享!

ok来看代码(其他的代码和上面单个元素共享一样,这里就不贴出代码了):

  1. //多个共享元素
  2. ActivityOptionsCompat optionsCompat = ActivityOptionsCompat
  3. .makeSceneTransitionAnimation(this, Pair.create((View) imageView, "meinv"), Pair.create((View) button, "bt"));
  4. Intent intent = new Intent(this,SecondActivity.class);
  5. startActivity(intent,optionsCompat.toBundle());

3)元素不共享(但是需要配合其他动画):


MainActivity中:

  1. public void jump(View view) {
  2. ActivityOptionsCompat optionsCompat = ActivityOptionsCompat.makeSceneTransitionAnimation(MainActivity.this);
  3. Intent intent = new Intent(MainActivity.this, SecondActivity.class);
  4. startActivity(intent, optionsCompat.toBundle());
  5. }
SecondActivity中:
  1. public class SecondActivity extends AppCompatActivity {
  2. @SuppressLint("NewApi")
  3. @Override
  4. protected void onCreate(@Nullable Bundle savedInstanceState) {
  5. //设置允许使用转场动画
  6. getWindow().requestFeature(Window.FEATURE_CONTENT_TRANSITIONS);
  7. super.onCreate(savedInstanceState);
  8. setContentView(R.layout.activity_second);
  9. Slide slide = new Slide();
  10. slide.setDuration(500);
  11. getWindow().setExitTransition(slide);//出去1动画
  12. getWindow().setEnterTransition(slide);//进来的动画
  13. // Explode explode = new Explode();
  14. // explode.setDuration(1000);
  15. // getWindow().setExitTransition(explode);//出去的动画
  16. // getWindow().setEnterTransition(explode);//进来的动画
  17. //
  18. // Fade fade = new Fade();
  19. // fade.setDuration(1000);
  20. // getWindow().setExitTransition(fade);//出去的动画
  21. // getWindow().setEnterTransition(fade);//进来的动画
  22. }
  23. @SuppressLint("NewApi")
  24. public void back(View view) {
  25. onBackPressed();
  26. }
  27. }
其他两种效果可自行实现,这里就不一一实现了。

-------------------完------------------



声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/97736
推荐阅读
相关标签
  

闽ICP备14008679号