章节来自《Android开发艺术探索》

第一种方式

3.2.2 使用动画

上一节介绍了采用scrollTo/scrollBy来实现View的滑动,本节介绍另外一种滑动方式,即使用动画,通过动画我们能够让一个View进行平移,而平移就是一种滑动。使用动画来移动View,主要是操作View的translationX和translationY属性,既可以采用传统的View动画,也可以采用属性动画,如果采用属性动画的话,为了能够兼容3.0以下的版本,需要采用开源动画库nineoldandroids(http://nineoldandroids.com/)。

采用View动画的代码,如下所示。此动画可以在100ms内将一个View从原始位置向右下角移动100个像素。

<?xml version="1.0" encoding="utf-8"?>

<set xmlns:android="http://schemas.android.com/apk/res/android"

android:fillAfter="true"

android:zAdjustment="normal" >

<translate

android:duration="100"

android:fromXDelta="0"

android:fromYDelta="0"

android:interpolator="@android:anim/linear_interpolator"

android:toXDelta="100"

android:toYDelta="100" />

</set>

在res/下创建anim目录,再创建animation_test.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"android:fillAfter="true"android:zAdjustment="normal" ><!--默认为@android:anim/accelerate_decelerate_interpolator,即加速减速插值器,--><!--android:duration="10000" 10秒,为了看出速度先快后慢,是使用默认插值器的效果--><translateandroid:duration="5000"android:fromXDelta="0"android:fromYDelta="0"android:interpolator="@android:anim/linear_interpolator"android:toXDelta="500"android:toYDelta="500" /></set>

MainActivity.java
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.widget.TextView;public class MainActivity extends AppCompatActivity {TextView textView;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);textView = findViewById(R.id.tv);textView.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Animation animation = AnimationUtils.loadAnimation(MainActivity.this,R.anim.animation_test);textView.startAnimation(animation);}});}
}

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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"tools:context=".MainActivity"><TextViewandroid:id="@+id/tv"android:text="click me"android:background="@color/colorPrimary"android:layout_width="wrap_content"android:layout_height="wrap_content" /></LinearLayout>

效果

注意:

上面提到View动画并不能真正改变View的位置,这会带来一个很严重的问题。试想一下,比如我们通过View动画将一个Button向右移动100px,并且这个View设置的有单击事件,然后你会惊奇地发现,单击新位置无法触发onClick事件,而单击原始位置仍然可以触发onClick事件,尽管Button已经不在原始位置了。这个问题带来的影响是致命的,但是它却又是可以理解的,因为不管Button怎么做变换,但是它的位置信息(四个顶点和宽/高)并不会随着动画而改变,因此在系统眼里,这个Button并没有发生任何改变,它的真身仍然在原始位置。在这种情况下,单击新位置当然不会触发onClick事件了,因为Button的真身并没有发生改变,在新位置上只是View的影像而已。基于这一点,我们不能简单地给一个View做平移动画并且还希望它在新位置继续触发一些单击事件。

从Android 3.0开始,使用属性动画可以解决上面的问题,但是大多数应用都需要兼容到Android 2.2,在Android 2.2上无法使用属性动画,因此这里还是会有问题。那么这种问题难道就无法解决了吗?也不是的,虽然不能直接解决这个问题,但是还可以间接解决这个问题,这里给出一个简单的解决方法。针对上面View动画的问题,我们可以在新位置预先创建一个和目标Button一模一样的Button,它们不但外观一样连onClick事件也一样。当目标Button完成平移动画后,就把目标Button隐藏,同时把预先创建的Button显示出来,通过这种间接的方式我们解决了上面的问题。这仅仅是个参考,面对这种问题时读者可以灵活应对。

第二种方式

如果采用属性动画的话,就更简单了,以下代码可以将一个View在100ms内从原始位置向右平移100像素。

ObjectAnimator.ofFloat(targetView,"translationX",0,100).setDuration

(100).start();

修改MainActivity.java

package com.example.wuf.overdrawtest;import android.animation.ObjectAnimator;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.widget.TextView;public class MainActivity extends AppCompatActivity {TextView textView;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);textView = findViewById(R.id.tv);textView.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {
//                Animation animation = AnimationUtils.loadAnimation(MainActivity.this,R.anim.animation_test);
//                textView.startAnimation(animation);ObjectAnimator.ofFloat(textView,"translationX",0,500).setDuration(5000).start();ObjectAnimator.ofFloat(textView,"translationY",0,500).setDuration(5000).start();}});}
}

效果:

转载于:https://www.cnblogs.com/volvane/p/10064042.html

《Android开发艺术探索》读书笔记——Cha3.2.2使用动画实现View的滑动相关推荐

  1. Android开发艺术探索读书笔记(一)

    首先向各位严重推荐主席这本书<Android开发艺术探索>. 再感谢主席邀请写这篇读书笔记 + 书评.书已经完整的翻完一遍了,但是还没有细致的品读并run代码,最近有时间正好系统的把整本书 ...

  2. Android开发艺术探索 读书笔记

    啥也不说了,@主席的<Android开发艺术探索>真是业界良心之作,不得不看!感谢主席,膜拜主席!主席主席,我要跟你生猴子!(>^ω^<) 读书笔记中若有任何问题请留言告知,谢 ...

  3. Android开发艺术探索读书笔记

    前言 Android开发艺术(这本书真的是艺术,太崇拜刚哥了,值得每一个做Android开发刷十遍的书) 1,Activity生命周期和启动模式 典型情况下的生命周期分析 onCreate() onS ...

  4. Android 开发艺术探索 - 读书笔记目录

    仅作为读书笔记使用,建议阅读原书. 书中代码部分已和现版本不符,建议对比最新版本学习. 读了这本书,越发认识到和大佬们的差距.嗯,加油吧. 过去の自分が今仆の土台となる 第 1 章 - Activit ...

  5. Android开发艺术探索读书笔记(二)

    首先感谢大家支持,昨天第一篇写出来之后反响很好,主席本人也非常赞赏(捂脸-),再接再厉,推出第二篇.这篇的主要内容是对两章View的内容进行总结.不得不说,自定义View是很多开发者的痛点,一方面我们 ...

  6. Android开发艺术探索读书笔记(第5章 RemoteView)

    原理 RemoteView的作用是在其他进程中显示并更新view界面. 大量的IPC操作会影响效率,为了解决这个问题,系统并没有通过Binder去直接支持View的跨进程访问,而是提供了一个Actio ...

  7. 《android开发艺术探索》笔记之Bitmap的加载和Cache

    <Android开发艺术探索>笔记之Bitmap的加载和Cache<一> 我放暑假前,就在图书馆借了一本<Android开发艺术探索>,这也是我看到很多人推荐的.之 ...

  8. 《Android 开发艺术探索》笔记2--IPC机制

    <Android 开发艺术探索>笔记2--IPC机制 思维导图 Android IPC简介 Android中的多进程的模式 IPC基础概念 Serializable接口 Parcelabl ...

  9. 《Android开发艺术探索》笔记目录

    该笔记以<Android开发艺术探索>为基础,结合Android 9.0代码和官方文档,修正了原书中表述不明确和过时的部分,同时加入了大量的个人理解. 13章,14章,15章是总结性的章节 ...

最新文章

  1. 开发者社区SDK对应版本更迭信息
  2. 【OpenCV3】旋转矩形(cv::RotateRect)的绘制
  3. React Native中常用ES6语法
  4. (转) POJO和javabean的异同
  5. 存储Tensorflow训练网络的参数
  6. 林斌首曝红米骁龙855旗舰新机:3200万像素弹出式前置摄像头
  7. Linux下软件实现raid
  8. 【求助】如何从 Spark 的 DataFrame 中取出具体某一行?我自己的一些思考
  9. BUUCTF MISC刷题
  10. 基于数据kmeans_data分析聚类画图 使用sc轮廓系数作为评价指标
  11. 实测中国版Afterpay:上市就被套现大军盯上,中介费率高达50%
  12. HTB靶场系列 linux靶机 Sense靶机
  13. Linux---C语言连接数据库(1)
  14. R语言随机抽样sample
  15. Django新手项目实例
  16. Win10 home vs pro vs enterprise vs enterprise LTSC
  17. 3ds max 2020贴图通道
  18. 【安全】XSS安全漏洞与CSRF攻击
  19. 什么是Ubuntu PPA以及为什么要用它[技术说明]
  20. Linux服务器 centos系统安装宝塔面板教程

热门文章

  1. java irowset行数,Java CloneableRecord.put方法代码示例
  2. od 追踪_裁判员行为规范【基本功】——追踪裁判违例宣判练习 /五秒违例
  3. 进阶学习(4.3) JVM 垃圾回收算法
  4. 上海网络推广浅析一个优质的404页面能给网站带来什么优化效果?
  5. 网站推广下吉利关联公司公开“车辆故障预测方法”将在事故发生前预警
  6. 网络推广——网络推广专员从多角度分析网站关键词排名受影响因素
  7. 网站内容为王?内容页的优化方法有哪些?
  8. 分布式服务框架原理与实践pdf_深度解析微服务治理的技术演进和架构实践
  9. 放个手机在单位自动打卡_钉钉自动打卡(家校打卡,寒假特辑)
  10. 在ssd中显示map tensorflow代码_PyTorch 1.3重磅发布,又要和TensorFlow搞事情了