文档章节

Android 动画的一些小总结

22m
 22m
发布于 2017/01/13 16:36
字数 1025
阅读 8
收藏 0
View.setScaleX
View.setScaleY

以上两个方法对View.getWidth()和View.getMeasureWidth()没有影响,得到的还是缩放之前的尺寸。

View.setTranslationX

以上方法对View.getLeft()没影响,得到的是移动之前的据屏幕左边的距离,而对View.getX()则有影响,得到的是移动后的据屏幕左边的距离。

    ***********还有一个很厉害的类就是ViewDragHelper,可用在自定义的View上**************

1.创建这个对象

ViewDragHelper viewDragHelper=ViewDragHelper.create(ViewGroup forParent ,CallBack cb)

forParent :把此布局作为父布局,一般可以用自定view的this来传,现在自己 理解的不是很清楚

源码如下:就是可以获得context,以及不能为空

public static ViewDragHelper create(ViewGroup forParent, Callback cb) {
    return new ViewDragHelper(forParent.getContext(), forParent, cb);
}
private ViewDragHelper(Context context, ViewGroup forParent, Callback cb) {
   if (forParent == null) { throw new IllegalArgumentException("Parent view may not be null"); }
    if (cb == null) {
        throw new IllegalArgumentException("Callback may not be null");
    }

    mParentView = forParent;
    mCallback = cb;

    final ViewConfiguration vc = ViewConfiguration.get(context);
    final float density = context.getResources().getDisplayMetrics().density;
    mEdgeSize = (int) (EDGE_SIZE * density + 0.5f);

    mTouchSlop = vc.getScaledTouchSlop();
    mMaxVelocity = vc.getScaledMaximumFlingVelocity();
    mMinVelocity = vc.getScaledMinimumFlingVelocity();
    mScroller = ScrollerCompat.create(context, sInterpolator);
}

2.重写view的onTouchEvent方法得到触摸的对象

@Override
public boolean onTouchEvent(MotionEvent event) {
    viewDragHelper.processTouchEvent(event)--得到触摸对象,以此来解析触摸动作
    return true;
}

3.最好重写view的拦截事件

@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
    return viewDragHelper.shouldInterceptTouchEvent(ev)---让这个对象来决定拦截与否
}

4.回调接口ViewDragHelper.Callback要重写的一些重要方法

@Override
public boolean tryCaptureView(View child, int pointerId)
                                            ---参数是触摸过的最上面的子view,以及它的id,如果返回true则可
                                               在后面重写的方法中处理这个触摸动作。返回false则不会理会这个
                                               触摸动作
@Override 
public int clampViewPositionHorizontal(View child, int left, int dx)
                      ---在水平方向上的子view根据触摸动作来移动
                      ---child:被触摸的最上面的子view
                      ---left :子view最左边距离正Y轴的距离,left=child.getLeft()+dx
                      ---dx   :是触摸移动的距离
                      ---该返回值决定子view的位置,如果返回值为定值则该view始终最左边始终在改返回值的位置,
                         言外之意就是这个view不管你怎么触摸移动它始终在一个位置,不会根据触摸来移动 
         
@Override  //和水平方向上重写的方法类似
public int clampViewPositionVertical(View child, int top, int dy)
                      ---在垂直方向上的子view根据触摸动作来移动
@Override
public void onViewPositionChanged(View changedView, int left, int top, int dx, int dy)
                      ---在父布局中的子布局只要通过clampViewPositionVertical和
                         clampViewPositionHorizontal以及viewDrag.smoothSlideViewTo等相关方法
                         改变了位置则会调用这个方法,当dy,dx等为0时也会调用。
                      ---left:子view的左边离正Y轴的距离
                      ---top :子view的上边离正X轴的距离
                      ---dx  :子view在X轴上的移动距离
                      ---dy  :子view在Y轴上的移动距离
@Override
public void onViewReleased(View releasedChild, float xvel, float yvel) 
                      ---此方法是触摸子view移动时候释放时候会被调用
                      ---releasedChild:触摸子view移动时候释放的那个子view
                      ---xvel         :没有释放时候触摸滑动的平均移动的在X轴上的速度
                      ---yvel         :没有释放时候触摸滑动的平均移动的在Y轴上的速度

5.ViewDragHelper的可能会用的方法

。。。。。

 

*******************************总结TranslateAnimation使用******************************************

1.创建构造函数

//创建
A.TranslateAnimation animation = new TranslateAnimation(
  Animation.RELATIVE_TO_PARENT,-1 ----int fromXType, float fromXValue
  ,Animation.RELATIVE_TO_PARENT, 1 ----int toXType, float toXValue ,Animation.RELATIVE_TO_PARENT, 0 ----int fromYType, float fromYValue,
  ,Animation.RELATIVE_TO_PARENT, 0 ----int toYType, float toYValue );

Type:  Animation.ABSOLUTE(绝对的屏幕坐标,单位为像素)

          Animation.RELATIVE_TO_SELF(相对身的宽度和高度的几倍)

          Animation.RELATIVE_TO_PARENT(相对父布局的宽度和高度的几倍)

          Valuse: 控件的左边的摆放位置

//创建
B.public TranslateAnimation (
                   float fromXDelta
                   float toXDelta, 
                   float fromYDelta, 
                   float toYDelta)

Delta:与控件原始位置的距离差

2.相关设置:

animation.setDuration(12000)--设置动画运行时间
animation.setRepeatMode(TranslateAnimation.RESTART)--设置动画重复的模式(重新开始,倒退回来等)
animation.setInterpolator(new LinearInterpolator())--设置动画的加速器(有匀速,加速等)
animation.setRepeatCount(TranslateAnimation.INFINITE)--设置动画的重复次数(一直重复等)
animation.setAnimationListener--设置监听器,可以监控到动画的开始结束以及开始重复等动作

© 著作权归作者所有

共有 人打赏支持
22m

22m

粉丝 0
博文 39
码字总数 43302
作品 0
成都
程序员
私信 提问
Android动画:献上一份详细 & 全面的动画知识学习攻略

前言 动画的使用 是 开发中常用的知识 可是动画的种类繁多、使用复杂,每当需要 采用自定义动画 实现 复杂的动画效果时,很多开发者就显得束手无策 本文将献上一份动画的全面介绍攻略,包括动...

Carson_Ho
2018/06/06
0
0
Android 动画:这是一份详细 & 清晰的 动画学习指南

前言 动画的使用 是 开发中常用的知识 可是动画的种类繁多、使用复杂,每当需要 采用自定义动画 实现 复杂的动画效果时,很多开发者就显得束手无策 本文将献上一份动画的全面介绍攻略,包括动...

Carson_Ho
2018/05/03
0
0
Android开发之漫漫长途 XVII——动画(续)

该文章是一个系列文章,是本人在Android开发的漫漫长途上的一点感想和记录,我会尽量按照先易后难的顺序进行编写该系列。该系列引用了《Android开发艺术探索》以及《深入理解Android 卷Ⅰ,Ⅱ...

马飞标
2018/08/13
0
0
【Android面试】Android面试题集锦 (陆续更新)

一些常见的Android面试基础题做下总结,看看你能做出多少道? 1. Intent的几种有关Activity启动的方式有哪些,你了解每个含义吗? 这里Android123提示大家,Intent的一些标记有FLAG_ACTIVITY_B...

晨曦之光
2012/03/01
1K
0
一个老鸟发的公司内部整理的 Android 学习路线图

一个老鸟发的公司内部整理的 Android 学习路线图 jixiaohua发了一篇。另一份 Android 开发学习路线图。可惜不是MarkDown格式的,所以jixiaohua直接上传的截图,在jixiaohua的呼吁下,我花了些...

2eggs
2018/08/22
0
0

没有更多内容

加载失败,请刷新页面

加载更多

C++ vector和list的区别

1.vector数据结构 vector和数组类似,拥有一段连续的内存空间,并且起始地址不变。 因此能高效的进行随机存取,时间复杂度为o(1); 但因为内存空间是连续的,所以在进行插入和删除操作时,会造...

shzwork
今天
4
0
Spring之invokeBeanFactoryPostProcessors详解

Spring的refresh的invokeBeanFactoryPostProcessors,就是调用所有注册的、原始的BeanFactoryPostProcessor。 相关源码 public static void invokeBeanFactoryPostProcessors(Configu......

cregu
昨天
4
0
ibmcom/db2express-c_docker官方使用文档

(DEPRECIATED) Please check DB2 Developer-C Edition for the replacement. What is IBM DB2 Express-C ? ``IBM DB2 Express-C``` is the no-charge community edition of DB2 server, a si......

BG2KNT
昨天
4
0
Ubuntu 18.04.2 LTS nvidia-docker2 : 依赖: docker-ce (= 5:18.09.0~3-0~ubuntu-bionic)

平台:Ubuntu 18.04.2 LTS nvidia-docker2 版本:2.0.3 错误描述:在安装nvidia-docker2的时候报dpkg依赖错误 nvidia-docker2 : 依赖: docker-ce (= 5:18.09.0~3-0~ubuntu-bionic) 先看一下依......

Pulsar-V
昨天
4
0
学习笔记1-goland结构体(struct)

写在前面:若有侵权,请发邮件by.su@qq.com告知。 转载者告知:如果本文被转载,但凡涉及到侵权相关事宜,转载者需负责。请知悉! 本文永久更新地址:https://my.oschina.net/bysu/blog/3036...

不最醉不龟归
昨天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部