android 动画之---位移抛物线

来源:互联网 发布:剑倚天下魔刃进阶数据 编辑:程序博客网 时间:2024/05/22 15:46

今天给大家说说android里面的动画,如何实现抛物线移动

 欢迎大家进群:574605026   开启我们的开发之旅

首先简单给大家科普下android之中的四种动画
1、AlphaAnimation 透明度动画 
2、ScaleAnimation 缩放动画 
3、TranslateAnimation 位移动画 
4、RotateAnimation 旋转动画

在这里呢,我简单给大家说说位移动画

TranslateAnimation是移动的动画效果。它有三个构造函数,分别是:

  1.public  TranslateAnimation(Context context,AttributeSet attrs)   略过

  2.public  TranslateAnimation(float fromXDelta, float toXDelta, float fromYDelta, float toYDelta)

  这个是我们最常用的一个构造方法,

  float fromXDelta:这个参数表示动画开始的点离当前View X坐标上的差值;

  float toXDelta, 这个参数表示动画结束的点离当前View X坐标上的差值;

  float fromYDelta, 这个参数表示动画开始的点离当前View Y坐标上的差值;

  float toYDelta)这个参数表示动画开始的点离当前View Y坐标上的差值;

  如果view在A(x,y)点 那么动画就是从B点(x+fromXDelta, y+fromYDelta)点移动到C 点(x+toXDelta,y+toYDelta)点.

 

  3.public  TranslateAnimation(int fromXType, float fromXValue, int toXType, float toXValue, int fromYType, float fromYValue, int toYType, float toYValue)

  fromXType:第一个参数是x轴方向的值的参照(Animation.ABSOLUTE, Animation.RELATIVE_TO_SELF,or Animation.RELATIVE_TO_PARENT);

  fromXValue:第二个参数是第一个参数类型的起始值;

  toXType,toXValue:第三个参数与第四个参数是x轴方向的终点参照与对应值;

  后面四个参数就不用解释了。如果全部选择Animation.ABSOLUTE,其实就是第二个构造函数。

      以x轴为例介绍参照与对应值的关系:

      如果选择参照为Animation.ABSOLUTE,那么对应的值应该是具体的坐标值,比如100到300,指绝对的屏幕像素单位

      如果选择参照为Animation.RELATIVE_TO_SELF或者 Animation.RELATIVE_TO_PARENT指的是相对于自身或父控件,对应值应该理解为相对于自身或者父控件的几倍或百分之多少。多试参数就明白了。


大家先看图,我们到底实现的是一个什么功能
如果让一个小球从A已抛物线的方式位移到B。
把A点和B点都当作是一个view
1、第一步
获取到A点和B的坐标
     int[] startLocation = new int[2];// 一个整型数组,用来存储按钮的在屏幕的XY坐标     av.getLocationInWindow(startLocation);// 这是获取A的在屏幕的XY坐标(这也是动画开始的坐标)

    int[] endLocation = new int[2];// 一个整型数组,用来存储按钮的在屏幕的XY坐标     bv.getLocationInWindow(startLocation);// 这是获取B的在屏幕的XY坐标(这也是动画结束的坐标)

2、第二步

自定义一个Imageview
   ImageView ball = new ImageView(mContext);// ball动画的图片,我的是一个小球   ball.setImageResource(R.mipmap.icon_fansnum_like_on);// 设置ballImg的图片
       
把ball 动画图片添加到动画层,假设存在
    setAnim(ball);

3、第三步
       在第二步,有一个setAnim,设置动画方法,现在就来补全
public void setAnim(final View v) {    anim_mask_layout = null;    anim_mask_layout = createAnimLayout();    anim_mask_layout.addView(v);//把动画小球添加到动画层    // 计算位移    int endX = 0 - startLocation[0] + 20;// 动画位移的X坐标    int endY = endLocation[1] - startLocation[1];// 动画位移的y坐标    System.out.println("=====x==="+endX);    System.out.println("=====y==="+endY);    TranslateAnimation translateAnimationX = new TranslateAnimation(0,            endX, 0, 0);    translateAnimationX.setInterpolator(new LinearInterpolator()); //让动画已均匀的速度改变    translateAnimationX.setRepeatCount(0);// 动画重复执行的次数    translateAnimationX.setFillAfter(true); //执行完毕,利用视图setLayoutParams来重新定位    TranslateAnimation translateAnimationY = new TranslateAnimation(0, 0,            0, endY);    translateAnimationY.setInterpolator(new AccelerateInterpolator());    translateAnimationY.setRepeatCount(0);// 动画重复执行的次数    translateAnimationX.setFillAfter(true);    AnimationSet set = new AnimationSet(false);    set.setFillAfter(false);    set.addAnimation(translateAnimationY);    set.addAnimation(translateAnimationX);    set.setDuration(800);// 动画的执行时间    view.startAnimation(set);    // 动画监听事件    set.setAnimationListener(new Animation.AnimationListener() {        // 动画的开始        @Override        public void onAnimationStart(Animation animation) {            v.setVisibility(View.VISIBLE);        }        @Override        public void onAnimationRepeat(Animation animation) {            // TODO Auto-generated method stub        }        // 动画的结束        @Override        public void onAnimationEnd(Animation animation) {            v.setVisibility(View.GONE);            addCart();        }    });}
 哎 anim_mask_layout是什么,问的话,他就是小球需要滚动的那个动画层
/** * 创建动画层 * @return */private ViewGroup createAnimLayout() {
//这里大家应该都能看懂了,我就不过多的写注释了    ViewGroup rootView = (ViewGroup) getActivity().getWindow().getDecorView();    LinearLayout animLayout = new LinearLayout(getActivity());    LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(            LinearLayout.LayoutParams.MATCH_PARENT,            LinearLayout.LayoutParams.MATCH_PARENT);    animLayout.setLayoutParams(lp);    animLayout.setId(Integer.MAX_VALUE - 1);    animLayout.setBackgroundResource(android.R.color.transparent);    rootView.addView(animLayout);    return animLayout;}private View addViewToAnimLayout(final ViewGroup parent, final View view,                                 int[] location) {
//定义小球在动画层的位置,A坐标的位置,及距离左边的距离为X轴坐标,距离高的距离为Y轴坐标    int x = location[0];    int y = location[1];    LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(            LinearLayout.LayoutParams.WRAP_CONTENT,            LinearLayout.LayoutParams.WRAP_CONTENT);    lp.leftMargin = x;    lp.topMargin = y;    view.setLayoutParams(lp);    return view;}
这就是一个简单的位移动画,其实没有大家想的那么难,主要是需要熟悉android developer api
大家可以多试试,开发就是在不断的尝试,不断的分享,让大家共同进步。
3 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 多次举报和拉黑克隆不了好友怎么办 货车把货拉到货主不付钱怎么办 中国银行网银公司用户名忘了怎么办 伟星管网站查不到电水管图纸怎么办 我的耕地己确权被他人侵权怎么办 掌上川电登录密码忘记了怎么办 华为商城不小心点了确认收货怎么办 买的认证服务号没有微信支付怎么办 手机微信里的外网链接打不开怎么办 微信违规无法加入群聊怎么办 苹果手机微信储存空间不足怎么办 拼多多砍价砍不到0元怎么办 妻子婚内出轨我的熟人怎么办 父亲怀疑母亲有外遇作为儿子怎么办 老婆出轨我总心理过不去坎该怎么办 失业人员离培训机构远了怎么办 遇到申请假冒商品的仅退款怎么办 微信被骗什么消息都不知道怎么办 微信用手机登录显示未注册怎么办 唯品会海淘订单取消不了怎么办 大排量摩托芯片钥匙断了怎么办 夏天太热在宿舍没空调怎么办? 汽车钥匙掉了怎么办半路到不了家 当顾客说产品太贵的时候 怎么办 邮件还没有下载被发送者删除怎么办 绝地求生号被盗了怎么办邮箱没有用 暴雪忘了密码换了手机号怎么办 华为荣耀10看电视缓冲太慢怎么办 交易猫梦幻西游手游恶意仲裁怎么办 银色高跟鞋前面尖尖蹭掉色了怎么办 苹果账号邮箱和密码都忘了怎么办 网易云密码忘记了怎么办手机号换了 超市买过期东西但没有小票怎么办 网购退货商家已收货而不退款怎么办 手机号被别人注册了京东怎么办 中通快递把我发的货弄坏了了怎么办 在淘宝获取不了丰巢柜提货码怎么办 京东快递提货码数手机号错了怎么办 腾讯手游助手不能玩刺激战场怎么办 刚收的京东快递质量有问题怎么办 拼多多买家接受信息没有声音怎么办