博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android 动画的一些小总结
阅读量:5868 次
发布时间:2019-06-19

本文共 4456 字,大约阅读时间需要 14 分钟。

hot3.png

View.setScaleXView.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方法得到触摸的对象

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

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

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

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

@Overridepublic 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根据触摸动作来移动
@Overridepublic 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轴上的移动距离
@Overridepublic 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--设置监听器,可以监控到动画的开始结束以及开始重复等动作

转载于:https://my.oschina.net/u/2987490/blog/824465

你可能感兴趣的文章
最详细的Log4j使用教程
查看>>
kafka brokers配置参数详解
查看>>
IOS选择器(selector)
查看>>
探索推荐引擎内部的秘密
查看>>
MySql练习+加源代码
查看>>
小P的Civilization V
查看>>
SSM(十) 项目重构-互联网项目的Maven结构
查看>>
COGS 2510. 拯救紫萱学姐
查看>>
BZOJ 4392 卡牌游戏
查看>>
hihoCoder #1159 : 扑克牌
查看>>
网络对抗技术作业一
查看>>
poj2718 Smallest Difference【贪心】
查看>>
luoguP4707 重返现世
查看>>
nginx配置websocket
查看>>
python 用cookie模拟登陆网站
查看>>
c++11 实现RAII特性
查看>>
Android 手势识别——单击/双击
查看>>
HTML 相关面试题
查看>>
判断Repeater最后一条记录
查看>>
操作系统-存储管理
查看>>